8166983: Remove old/legacy unused tzdata files
Reviewed-by: iris, rriggs
This commit is contained in:
parent
3fe08186b1
commit
49ee4df375
@ -1,413 +0,0 @@
|
||||
#
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# <pre>
|
||||
# This file is in the public domain, so clarified as of
|
||||
# 2009-05-17 by Arthur David Olson.
|
||||
|
||||
# So much for footnotes about Saudi Arabia.
|
||||
# Apparent noon times below are for Riyadh; your mileage will vary.
|
||||
# Times were computed using formulas in the U.S. Naval Observatory's
|
||||
# Almanac for Computers 1987; the formulas "will give EqT to an accuracy of
|
||||
# [plus or minus two] seconds during the current year."
|
||||
#
|
||||
# Rounding to the nearest five seconds results in fewer than
|
||||
# 256 different "time types"--a limit that's faced because time types are
|
||||
# stored on disk as unsigned chars.
|
||||
|
||||
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
|
||||
Rule sol87 1987 only - Jan 1 12:03:20s -0:03:20 -
|
||||
Rule sol87 1987 only - Jan 2 12:03:50s -0:03:50 -
|
||||
Rule sol87 1987 only - Jan 3 12:04:15s -0:04:15 -
|
||||
Rule sol87 1987 only - Jan 4 12:04:45s -0:04:45 -
|
||||
Rule sol87 1987 only - Jan 5 12:05:10s -0:05:10 -
|
||||
Rule sol87 1987 only - Jan 6 12:05:40s -0:05:40 -
|
||||
Rule sol87 1987 only - Jan 7 12:06:05s -0:06:05 -
|
||||
Rule sol87 1987 only - Jan 8 12:06:30s -0:06:30 -
|
||||
Rule sol87 1987 only - Jan 9 12:06:55s -0:06:55 -
|
||||
Rule sol87 1987 only - Jan 10 12:07:20s -0:07:20 -
|
||||
Rule sol87 1987 only - Jan 11 12:07:45s -0:07:45 -
|
||||
Rule sol87 1987 only - Jan 12 12:08:10s -0:08:10 -
|
||||
Rule sol87 1987 only - Jan 13 12:08:30s -0:08:30 -
|
||||
Rule sol87 1987 only - Jan 14 12:08:55s -0:08:55 -
|
||||
Rule sol87 1987 only - Jan 15 12:09:15s -0:09:15 -
|
||||
Rule sol87 1987 only - Jan 16 12:09:35s -0:09:35 -
|
||||
Rule sol87 1987 only - Jan 17 12:09:55s -0:09:55 -
|
||||
Rule sol87 1987 only - Jan 18 12:10:15s -0:10:15 -
|
||||
Rule sol87 1987 only - Jan 19 12:10:35s -0:10:35 -
|
||||
Rule sol87 1987 only - Jan 20 12:10:55s -0:10:55 -
|
||||
Rule sol87 1987 only - Jan 21 12:11:10s -0:11:10 -
|
||||
Rule sol87 1987 only - Jan 22 12:11:30s -0:11:30 -
|
||||
Rule sol87 1987 only - Jan 23 12:11:45s -0:11:45 -
|
||||
Rule sol87 1987 only - Jan 24 12:12:00s -0:12:00 -
|
||||
Rule sol87 1987 only - Jan 25 12:12:15s -0:12:15 -
|
||||
Rule sol87 1987 only - Jan 26 12:12:30s -0:12:30 -
|
||||
Rule sol87 1987 only - Jan 27 12:12:40s -0:12:40 -
|
||||
Rule sol87 1987 only - Jan 28 12:12:55s -0:12:55 -
|
||||
Rule sol87 1987 only - Jan 29 12:13:05s -0:13:05 -
|
||||
Rule sol87 1987 only - Jan 30 12:13:15s -0:13:15 -
|
||||
Rule sol87 1987 only - Jan 31 12:13:25s -0:13:25 -
|
||||
Rule sol87 1987 only - Feb 1 12:13:35s -0:13:35 -
|
||||
Rule sol87 1987 only - Feb 2 12:13:40s -0:13:40 -
|
||||
Rule sol87 1987 only - Feb 3 12:13:50s -0:13:50 -
|
||||
Rule sol87 1987 only - Feb 4 12:13:55s -0:13:55 -
|
||||
Rule sol87 1987 only - Feb 5 12:14:00s -0:14:00 -
|
||||
Rule sol87 1987 only - Feb 6 12:14:05s -0:14:05 -
|
||||
Rule sol87 1987 only - Feb 7 12:14:10s -0:14:10 -
|
||||
Rule sol87 1987 only - Feb 8 12:14:10s -0:14:10 -
|
||||
Rule sol87 1987 only - Feb 9 12:14:15s -0:14:15 -
|
||||
Rule sol87 1987 only - Feb 10 12:14:15s -0:14:15 -
|
||||
Rule sol87 1987 only - Feb 11 12:14:15s -0:14:15 -
|
||||
Rule sol87 1987 only - Feb 12 12:14:15s -0:14:15 -
|
||||
Rule sol87 1987 only - Feb 13 12:14:15s -0:14:15 -
|
||||
Rule sol87 1987 only - Feb 14 12:14:15s -0:14:15 -
|
||||
Rule sol87 1987 only - Feb 15 12:14:10s -0:14:10 -
|
||||
Rule sol87 1987 only - Feb 16 12:14:10s -0:14:10 -
|
||||
Rule sol87 1987 only - Feb 17 12:14:05s -0:14:05 -
|
||||
Rule sol87 1987 only - Feb 18 12:14:00s -0:14:00 -
|
||||
Rule sol87 1987 only - Feb 19 12:13:55s -0:13:55 -
|
||||
Rule sol87 1987 only - Feb 20 12:13:50s -0:13:50 -
|
||||
Rule sol87 1987 only - Feb 21 12:13:45s -0:13:45 -
|
||||
Rule sol87 1987 only - Feb 22 12:13:35s -0:13:35 -
|
||||
Rule sol87 1987 only - Feb 23 12:13:30s -0:13:30 -
|
||||
Rule sol87 1987 only - Feb 24 12:13:20s -0:13:20 -
|
||||
Rule sol87 1987 only - Feb 25 12:13:10s -0:13:10 -
|
||||
Rule sol87 1987 only - Feb 26 12:13:00s -0:13:00 -
|
||||
Rule sol87 1987 only - Feb 27 12:12:50s -0:12:50 -
|
||||
Rule sol87 1987 only - Feb 28 12:12:40s -0:12:40 -
|
||||
Rule sol87 1987 only - Mar 1 12:12:30s -0:12:30 -
|
||||
Rule sol87 1987 only - Mar 2 12:12:20s -0:12:20 -
|
||||
Rule sol87 1987 only - Mar 3 12:12:05s -0:12:05 -
|
||||
Rule sol87 1987 only - Mar 4 12:11:55s -0:11:55 -
|
||||
Rule sol87 1987 only - Mar 5 12:11:40s -0:11:40 -
|
||||
Rule sol87 1987 only - Mar 6 12:11:25s -0:11:25 -
|
||||
Rule sol87 1987 only - Mar 7 12:11:15s -0:11:15 -
|
||||
Rule sol87 1987 only - Mar 8 12:11:00s -0:11:00 -
|
||||
Rule sol87 1987 only - Mar 9 12:10:45s -0:10:45 -
|
||||
Rule sol87 1987 only - Mar 10 12:10:30s -0:10:30 -
|
||||
Rule sol87 1987 only - Mar 11 12:10:15s -0:10:15 -
|
||||
Rule sol87 1987 only - Mar 12 12:09:55s -0:09:55 -
|
||||
Rule sol87 1987 only - Mar 13 12:09:40s -0:09:40 -
|
||||
Rule sol87 1987 only - Mar 14 12:09:25s -0:09:25 -
|
||||
Rule sol87 1987 only - Mar 15 12:09:10s -0:09:10 -
|
||||
Rule sol87 1987 only - Mar 16 12:08:50s -0:08:50 -
|
||||
Rule sol87 1987 only - Mar 17 12:08:35s -0:08:35 -
|
||||
Rule sol87 1987 only - Mar 18 12:08:15s -0:08:15 -
|
||||
Rule sol87 1987 only - Mar 19 12:08:00s -0:08:00 -
|
||||
Rule sol87 1987 only - Mar 20 12:07:40s -0:07:40 -
|
||||
Rule sol87 1987 only - Mar 21 12:07:25s -0:07:25 -
|
||||
Rule sol87 1987 only - Mar 22 12:07:05s -0:07:05 -
|
||||
Rule sol87 1987 only - Mar 23 12:06:50s -0:06:50 -
|
||||
Rule sol87 1987 only - Mar 24 12:06:30s -0:06:30 -
|
||||
Rule sol87 1987 only - Mar 25 12:06:10s -0:06:10 -
|
||||
Rule sol87 1987 only - Mar 26 12:05:55s -0:05:55 -
|
||||
Rule sol87 1987 only - Mar 27 12:05:35s -0:05:35 -
|
||||
Rule sol87 1987 only - Mar 28 12:05:15s -0:05:15 -
|
||||
Rule sol87 1987 only - Mar 29 12:05:00s -0:05:00 -
|
||||
Rule sol87 1987 only - Mar 30 12:04:40s -0:04:40 -
|
||||
Rule sol87 1987 only - Mar 31 12:04:25s -0:04:25 -
|
||||
Rule sol87 1987 only - Apr 1 12:04:05s -0:04:05 -
|
||||
Rule sol87 1987 only - Apr 2 12:03:45s -0:03:45 -
|
||||
Rule sol87 1987 only - Apr 3 12:03:30s -0:03:30 -
|
||||
Rule sol87 1987 only - Apr 4 12:03:10s -0:03:10 -
|
||||
Rule sol87 1987 only - Apr 5 12:02:55s -0:02:55 -
|
||||
Rule sol87 1987 only - Apr 6 12:02:35s -0:02:35 -
|
||||
Rule sol87 1987 only - Apr 7 12:02:20s -0:02:20 -
|
||||
Rule sol87 1987 only - Apr 8 12:02:05s -0:02:05 -
|
||||
Rule sol87 1987 only - Apr 9 12:01:45s -0:01:45 -
|
||||
Rule sol87 1987 only - Apr 10 12:01:30s -0:01:30 -
|
||||
Rule sol87 1987 only - Apr 11 12:01:15s -0:01:15 -
|
||||
Rule sol87 1987 only - Apr 12 12:00:55s -0:00:55 -
|
||||
Rule sol87 1987 only - Apr 13 12:00:40s -0:00:40 -
|
||||
Rule sol87 1987 only - Apr 14 12:00:25s -0:00:25 -
|
||||
Rule sol87 1987 only - Apr 15 12:00:10s -0:00:10 -
|
||||
Rule sol87 1987 only - Apr 16 11:59:55s 0:00:05 -
|
||||
Rule sol87 1987 only - Apr 17 11:59:45s 0:00:15 -
|
||||
Rule sol87 1987 only - Apr 18 11:59:30s 0:00:30 -
|
||||
Rule sol87 1987 only - Apr 19 11:59:15s 0:00:45 -
|
||||
Rule sol87 1987 only - Apr 20 11:59:05s 0:00:55 -
|
||||
Rule sol87 1987 only - Apr 21 11:58:50s 0:01:10 -
|
||||
Rule sol87 1987 only - Apr 22 11:58:40s 0:01:20 -
|
||||
Rule sol87 1987 only - Apr 23 11:58:25s 0:01:35 -
|
||||
Rule sol87 1987 only - Apr 24 11:58:15s 0:01:45 -
|
||||
Rule sol87 1987 only - Apr 25 11:58:05s 0:01:55 -
|
||||
Rule sol87 1987 only - Apr 26 11:57:55s 0:02:05 -
|
||||
Rule sol87 1987 only - Apr 27 11:57:45s 0:02:15 -
|
||||
Rule sol87 1987 only - Apr 28 11:57:35s 0:02:25 -
|
||||
Rule sol87 1987 only - Apr 29 11:57:25s 0:02:35 -
|
||||
Rule sol87 1987 only - Apr 30 11:57:15s 0:02:45 -
|
||||
Rule sol87 1987 only - May 1 11:57:10s 0:02:50 -
|
||||
Rule sol87 1987 only - May 2 11:57:00s 0:03:00 -
|
||||
Rule sol87 1987 only - May 3 11:56:55s 0:03:05 -
|
||||
Rule sol87 1987 only - May 4 11:56:50s 0:03:10 -
|
||||
Rule sol87 1987 only - May 5 11:56:45s 0:03:15 -
|
||||
Rule sol87 1987 only - May 6 11:56:40s 0:03:20 -
|
||||
Rule sol87 1987 only - May 7 11:56:35s 0:03:25 -
|
||||
Rule sol87 1987 only - May 8 11:56:30s 0:03:30 -
|
||||
Rule sol87 1987 only - May 9 11:56:25s 0:03:35 -
|
||||
Rule sol87 1987 only - May 10 11:56:25s 0:03:35 -
|
||||
Rule sol87 1987 only - May 11 11:56:20s 0:03:40 -
|
||||
Rule sol87 1987 only - May 12 11:56:20s 0:03:40 -
|
||||
Rule sol87 1987 only - May 13 11:56:20s 0:03:40 -
|
||||
Rule sol87 1987 only - May 14 11:56:20s 0:03:40 -
|
||||
Rule sol87 1987 only - May 15 11:56:20s 0:03:40 -
|
||||
Rule sol87 1987 only - May 16 11:56:20s 0:03:40 -
|
||||
Rule sol87 1987 only - May 17 11:56:20s 0:03:40 -
|
||||
Rule sol87 1987 only - May 18 11:56:20s 0:03:40 -
|
||||
Rule sol87 1987 only - May 19 11:56:25s 0:03:35 -
|
||||
Rule sol87 1987 only - May 20 11:56:25s 0:03:35 -
|
||||
Rule sol87 1987 only - May 21 11:56:30s 0:03:30 -
|
||||
Rule sol87 1987 only - May 22 11:56:35s 0:03:25 -
|
||||
Rule sol87 1987 only - May 23 11:56:40s 0:03:20 -
|
||||
Rule sol87 1987 only - May 24 11:56:45s 0:03:15 -
|
||||
Rule sol87 1987 only - May 25 11:56:50s 0:03:10 -
|
||||
Rule sol87 1987 only - May 26 11:56:55s 0:03:05 -
|
||||
Rule sol87 1987 only - May 27 11:57:00s 0:03:00 -
|
||||
Rule sol87 1987 only - May 28 11:57:10s 0:02:50 -
|
||||
Rule sol87 1987 only - May 29 11:57:15s 0:02:45 -
|
||||
Rule sol87 1987 only - May 30 11:57:25s 0:02:35 -
|
||||
Rule sol87 1987 only - May 31 11:57:30s 0:02:30 -
|
||||
Rule sol87 1987 only - Jun 1 11:57:40s 0:02:20 -
|
||||
Rule sol87 1987 only - Jun 2 11:57:50s 0:02:10 -
|
||||
Rule sol87 1987 only - Jun 3 11:58:00s 0:02:00 -
|
||||
Rule sol87 1987 only - Jun 4 11:58:10s 0:01:50 -
|
||||
Rule sol87 1987 only - Jun 5 11:58:20s 0:01:40 -
|
||||
Rule sol87 1987 only - Jun 6 11:58:30s 0:01:30 -
|
||||
Rule sol87 1987 only - Jun 7 11:58:40s 0:01:20 -
|
||||
Rule sol87 1987 only - Jun 8 11:58:50s 0:01:10 -
|
||||
Rule sol87 1987 only - Jun 9 11:59:05s 0:00:55 -
|
||||
Rule sol87 1987 only - Jun 10 11:59:15s 0:00:45 -
|
||||
Rule sol87 1987 only - Jun 11 11:59:30s 0:00:30 -
|
||||
Rule sol87 1987 only - Jun 12 11:59:40s 0:00:20 -
|
||||
Rule sol87 1987 only - Jun 13 11:59:50s 0:00:10 -
|
||||
Rule sol87 1987 only - Jun 14 12:00:05s -0:00:05 -
|
||||
Rule sol87 1987 only - Jun 15 12:00:15s -0:00:15 -
|
||||
Rule sol87 1987 only - Jun 16 12:00:30s -0:00:30 -
|
||||
Rule sol87 1987 only - Jun 17 12:00:45s -0:00:45 -
|
||||
Rule sol87 1987 only - Jun 18 12:00:55s -0:00:55 -
|
||||
Rule sol87 1987 only - Jun 19 12:01:10s -0:01:10 -
|
||||
Rule sol87 1987 only - Jun 20 12:01:20s -0:01:20 -
|
||||
Rule sol87 1987 only - Jun 21 12:01:35s -0:01:35 -
|
||||
Rule sol87 1987 only - Jun 22 12:01:50s -0:01:50 -
|
||||
Rule sol87 1987 only - Jun 23 12:02:00s -0:02:00 -
|
||||
Rule sol87 1987 only - Jun 24 12:02:15s -0:02:15 -
|
||||
Rule sol87 1987 only - Jun 25 12:02:25s -0:02:25 -
|
||||
Rule sol87 1987 only - Jun 26 12:02:40s -0:02:40 -
|
||||
Rule sol87 1987 only - Jun 27 12:02:50s -0:02:50 -
|
||||
Rule sol87 1987 only - Jun 28 12:03:05s -0:03:05 -
|
||||
Rule sol87 1987 only - Jun 29 12:03:15s -0:03:15 -
|
||||
Rule sol87 1987 only - Jun 30 12:03:30s -0:03:30 -
|
||||
Rule sol87 1987 only - Jul 1 12:03:40s -0:03:40 -
|
||||
Rule sol87 1987 only - Jul 2 12:03:50s -0:03:50 -
|
||||
Rule sol87 1987 only - Jul 3 12:04:05s -0:04:05 -
|
||||
Rule sol87 1987 only - Jul 4 12:04:15s -0:04:15 -
|
||||
Rule sol87 1987 only - Jul 5 12:04:25s -0:04:25 -
|
||||
Rule sol87 1987 only - Jul 6 12:04:35s -0:04:35 -
|
||||
Rule sol87 1987 only - Jul 7 12:04:45s -0:04:45 -
|
||||
Rule sol87 1987 only - Jul 8 12:04:55s -0:04:55 -
|
||||
Rule sol87 1987 only - Jul 9 12:05:05s -0:05:05 -
|
||||
Rule sol87 1987 only - Jul 10 12:05:15s -0:05:15 -
|
||||
Rule sol87 1987 only - Jul 11 12:05:20s -0:05:20 -
|
||||
Rule sol87 1987 only - Jul 12 12:05:30s -0:05:30 -
|
||||
Rule sol87 1987 only - Jul 13 12:05:40s -0:05:40 -
|
||||
Rule sol87 1987 only - Jul 14 12:05:45s -0:05:45 -
|
||||
Rule sol87 1987 only - Jul 15 12:05:50s -0:05:50 -
|
||||
Rule sol87 1987 only - Jul 16 12:06:00s -0:06:00 -
|
||||
Rule sol87 1987 only - Jul 17 12:06:05s -0:06:05 -
|
||||
Rule sol87 1987 only - Jul 18 12:06:10s -0:06:10 -
|
||||
Rule sol87 1987 only - Jul 19 12:06:15s -0:06:15 -
|
||||
Rule sol87 1987 only - Jul 20 12:06:15s -0:06:15 -
|
||||
Rule sol87 1987 only - Jul 21 12:06:20s -0:06:20 -
|
||||
Rule sol87 1987 only - Jul 22 12:06:25s -0:06:25 -
|
||||
Rule sol87 1987 only - Jul 23 12:06:25s -0:06:25 -
|
||||
Rule sol87 1987 only - Jul 24 12:06:25s -0:06:25 -
|
||||
Rule sol87 1987 only - Jul 25 12:06:30s -0:06:30 -
|
||||
Rule sol87 1987 only - Jul 26 12:06:30s -0:06:30 -
|
||||
Rule sol87 1987 only - Jul 27 12:06:30s -0:06:30 -
|
||||
Rule sol87 1987 only - Jul 28 12:06:30s -0:06:30 -
|
||||
Rule sol87 1987 only - Jul 29 12:06:25s -0:06:25 -
|
||||
Rule sol87 1987 only - Jul 30 12:06:25s -0:06:25 -
|
||||
Rule sol87 1987 only - Jul 31 12:06:25s -0:06:25 -
|
||||
Rule sol87 1987 only - Aug 1 12:06:20s -0:06:20 -
|
||||
Rule sol87 1987 only - Aug 2 12:06:15s -0:06:15 -
|
||||
Rule sol87 1987 only - Aug 3 12:06:10s -0:06:10 -
|
||||
Rule sol87 1987 only - Aug 4 12:06:05s -0:06:05 -
|
||||
Rule sol87 1987 only - Aug 5 12:06:00s -0:06:00 -
|
||||
Rule sol87 1987 only - Aug 6 12:05:55s -0:05:55 -
|
||||
Rule sol87 1987 only - Aug 7 12:05:50s -0:05:50 -
|
||||
Rule sol87 1987 only - Aug 8 12:05:40s -0:05:40 -
|
||||
Rule sol87 1987 only - Aug 9 12:05:35s -0:05:35 -
|
||||
Rule sol87 1987 only - Aug 10 12:05:25s -0:05:25 -
|
||||
Rule sol87 1987 only - Aug 11 12:05:15s -0:05:15 -
|
||||
Rule sol87 1987 only - Aug 12 12:05:05s -0:05:05 -
|
||||
Rule sol87 1987 only - Aug 13 12:04:55s -0:04:55 -
|
||||
Rule sol87 1987 only - Aug 14 12:04:45s -0:04:45 -
|
||||
Rule sol87 1987 only - Aug 15 12:04:35s -0:04:35 -
|
||||
Rule sol87 1987 only - Aug 16 12:04:25s -0:04:25 -
|
||||
Rule sol87 1987 only - Aug 17 12:04:10s -0:04:10 -
|
||||
Rule sol87 1987 only - Aug 18 12:04:00s -0:04:00 -
|
||||
Rule sol87 1987 only - Aug 19 12:03:45s -0:03:45 -
|
||||
Rule sol87 1987 only - Aug 20 12:03:30s -0:03:30 -
|
||||
Rule sol87 1987 only - Aug 21 12:03:15s -0:03:15 -
|
||||
Rule sol87 1987 only - Aug 22 12:03:00s -0:03:00 -
|
||||
Rule sol87 1987 only - Aug 23 12:02:45s -0:02:45 -
|
||||
Rule sol87 1987 only - Aug 24 12:02:30s -0:02:30 -
|
||||
Rule sol87 1987 only - Aug 25 12:02:15s -0:02:15 -
|
||||
Rule sol87 1987 only - Aug 26 12:02:00s -0:02:00 -
|
||||
Rule sol87 1987 only - Aug 27 12:01:40s -0:01:40 -
|
||||
Rule sol87 1987 only - Aug 28 12:01:25s -0:01:25 -
|
||||
Rule sol87 1987 only - Aug 29 12:01:05s -0:01:05 -
|
||||
Rule sol87 1987 only - Aug 30 12:00:50s -0:00:50 -
|
||||
Rule sol87 1987 only - Aug 31 12:00:30s -0:00:30 -
|
||||
Rule sol87 1987 only - Sep 1 12:00:10s -0:00:10 -
|
||||
Rule sol87 1987 only - Sep 2 11:59:50s 0:00:10 -
|
||||
Rule sol87 1987 only - Sep 3 11:59:35s 0:00:25 -
|
||||
Rule sol87 1987 only - Sep 4 11:59:15s 0:00:45 -
|
||||
Rule sol87 1987 only - Sep 5 11:58:55s 0:01:05 -
|
||||
Rule sol87 1987 only - Sep 6 11:58:35s 0:01:25 -
|
||||
Rule sol87 1987 only - Sep 7 11:58:15s 0:01:45 -
|
||||
Rule sol87 1987 only - Sep 8 11:57:55s 0:02:05 -
|
||||
Rule sol87 1987 only - Sep 9 11:57:30s 0:02:30 -
|
||||
Rule sol87 1987 only - Sep 10 11:57:10s 0:02:50 -
|
||||
Rule sol87 1987 only - Sep 11 11:56:50s 0:03:10 -
|
||||
Rule sol87 1987 only - Sep 12 11:56:30s 0:03:30 -
|
||||
Rule sol87 1987 only - Sep 13 11:56:10s 0:03:50 -
|
||||
Rule sol87 1987 only - Sep 14 11:55:45s 0:04:15 -
|
||||
Rule sol87 1987 only - Sep 15 11:55:25s 0:04:35 -
|
||||
Rule sol87 1987 only - Sep 16 11:55:05s 0:04:55 -
|
||||
Rule sol87 1987 only - Sep 17 11:54:45s 0:05:15 -
|
||||
Rule sol87 1987 only - Sep 18 11:54:20s 0:05:40 -
|
||||
Rule sol87 1987 only - Sep 19 11:54:00s 0:06:00 -
|
||||
Rule sol87 1987 only - Sep 20 11:53:40s 0:06:20 -
|
||||
Rule sol87 1987 only - Sep 21 11:53:15s 0:06:45 -
|
||||
Rule sol87 1987 only - Sep 22 11:52:55s 0:07:05 -
|
||||
Rule sol87 1987 only - Sep 23 11:52:35s 0:07:25 -
|
||||
Rule sol87 1987 only - Sep 24 11:52:15s 0:07:45 -
|
||||
Rule sol87 1987 only - Sep 25 11:51:55s 0:08:05 -
|
||||
Rule sol87 1987 only - Sep 26 11:51:35s 0:08:25 -
|
||||
Rule sol87 1987 only - Sep 27 11:51:10s 0:08:50 -
|
||||
Rule sol87 1987 only - Sep 28 11:50:50s 0:09:10 -
|
||||
Rule sol87 1987 only - Sep 29 11:50:30s 0:09:30 -
|
||||
Rule sol87 1987 only - Sep 30 11:50:10s 0:09:50 -
|
||||
Rule sol87 1987 only - Oct 1 11:49:50s 0:10:10 -
|
||||
Rule sol87 1987 only - Oct 2 11:49:35s 0:10:25 -
|
||||
Rule sol87 1987 only - Oct 3 11:49:15s 0:10:45 -
|
||||
Rule sol87 1987 only - Oct 4 11:48:55s 0:11:05 -
|
||||
Rule sol87 1987 only - Oct 5 11:48:35s 0:11:25 -
|
||||
Rule sol87 1987 only - Oct 6 11:48:20s 0:11:40 -
|
||||
Rule sol87 1987 only - Oct 7 11:48:00s 0:12:00 -
|
||||
Rule sol87 1987 only - Oct 8 11:47:45s 0:12:15 -
|
||||
Rule sol87 1987 only - Oct 9 11:47:25s 0:12:35 -
|
||||
Rule sol87 1987 only - Oct 10 11:47:10s 0:12:50 -
|
||||
Rule sol87 1987 only - Oct 11 11:46:55s 0:13:05 -
|
||||
Rule sol87 1987 only - Oct 12 11:46:40s 0:13:20 -
|
||||
Rule sol87 1987 only - Oct 13 11:46:25s 0:13:35 -
|
||||
Rule sol87 1987 only - Oct 14 11:46:10s 0:13:50 -
|
||||
Rule sol87 1987 only - Oct 15 11:45:55s 0:14:05 -
|
||||
Rule sol87 1987 only - Oct 16 11:45:45s 0:14:15 -
|
||||
Rule sol87 1987 only - Oct 17 11:45:30s 0:14:30 -
|
||||
Rule sol87 1987 only - Oct 18 11:45:20s 0:14:40 -
|
||||
Rule sol87 1987 only - Oct 19 11:45:05s 0:14:55 -
|
||||
Rule sol87 1987 only - Oct 20 11:44:55s 0:15:05 -
|
||||
Rule sol87 1987 only - Oct 21 11:44:45s 0:15:15 -
|
||||
Rule sol87 1987 only - Oct 22 11:44:35s 0:15:25 -
|
||||
Rule sol87 1987 only - Oct 23 11:44:25s 0:15:35 -
|
||||
Rule sol87 1987 only - Oct 24 11:44:20s 0:15:40 -
|
||||
Rule sol87 1987 only - Oct 25 11:44:10s 0:15:50 -
|
||||
Rule sol87 1987 only - Oct 26 11:44:05s 0:15:55 -
|
||||
Rule sol87 1987 only - Oct 27 11:43:55s 0:16:05 -
|
||||
Rule sol87 1987 only - Oct 28 11:43:50s 0:16:10 -
|
||||
Rule sol87 1987 only - Oct 29 11:43:45s 0:16:15 -
|
||||
Rule sol87 1987 only - Oct 30 11:43:45s 0:16:15 -
|
||||
Rule sol87 1987 only - Oct 31 11:43:40s 0:16:20 -
|
||||
Rule sol87 1987 only - Nov 1 11:43:40s 0:16:20 -
|
||||
Rule sol87 1987 only - Nov 2 11:43:35s 0:16:25 -
|
||||
Rule sol87 1987 only - Nov 3 11:43:35s 0:16:25 -
|
||||
Rule sol87 1987 only - Nov 4 11:43:35s 0:16:25 -
|
||||
Rule sol87 1987 only - Nov 5 11:43:35s 0:16:25 -
|
||||
Rule sol87 1987 only - Nov 6 11:43:40s 0:16:20 -
|
||||
Rule sol87 1987 only - Nov 7 11:43:40s 0:16:20 -
|
||||
Rule sol87 1987 only - Nov 8 11:43:45s 0:16:15 -
|
||||
Rule sol87 1987 only - Nov 9 11:43:50s 0:16:10 -
|
||||
Rule sol87 1987 only - Nov 10 11:43:55s 0:16:05 -
|
||||
Rule sol87 1987 only - Nov 11 11:44:00s 0:16:00 -
|
||||
Rule sol87 1987 only - Nov 12 11:44:05s 0:15:55 -
|
||||
Rule sol87 1987 only - Nov 13 11:44:15s 0:15:45 -
|
||||
Rule sol87 1987 only - Nov 14 11:44:20s 0:15:40 -
|
||||
Rule sol87 1987 only - Nov 15 11:44:30s 0:15:30 -
|
||||
Rule sol87 1987 only - Nov 16 11:44:40s 0:15:20 -
|
||||
Rule sol87 1987 only - Nov 17 11:44:50s 0:15:10 -
|
||||
Rule sol87 1987 only - Nov 18 11:45:05s 0:14:55 -
|
||||
Rule sol87 1987 only - Nov 19 11:45:15s 0:14:45 -
|
||||
Rule sol87 1987 only - Nov 20 11:45:30s 0:14:30 -
|
||||
Rule sol87 1987 only - Nov 21 11:45:45s 0:14:15 -
|
||||
Rule sol87 1987 only - Nov 22 11:46:00s 0:14:00 -
|
||||
Rule sol87 1987 only - Nov 23 11:46:15s 0:13:45 -
|
||||
Rule sol87 1987 only - Nov 24 11:46:30s 0:13:30 -
|
||||
Rule sol87 1987 only - Nov 25 11:46:50s 0:13:10 -
|
||||
Rule sol87 1987 only - Nov 26 11:47:10s 0:12:50 -
|
||||
Rule sol87 1987 only - Nov 27 11:47:25s 0:12:35 -
|
||||
Rule sol87 1987 only - Nov 28 11:47:45s 0:12:15 -
|
||||
Rule sol87 1987 only - Nov 29 11:48:05s 0:11:55 -
|
||||
Rule sol87 1987 only - Nov 30 11:48:30s 0:11:30 -
|
||||
Rule sol87 1987 only - Dec 1 11:48:50s 0:11:10 -
|
||||
Rule sol87 1987 only - Dec 2 11:49:10s 0:10:50 -
|
||||
Rule sol87 1987 only - Dec 3 11:49:35s 0:10:25 -
|
||||
Rule sol87 1987 only - Dec 4 11:50:00s 0:10:00 -
|
||||
Rule sol87 1987 only - Dec 5 11:50:25s 0:09:35 -
|
||||
Rule sol87 1987 only - Dec 6 11:50:50s 0:09:10 -
|
||||
Rule sol87 1987 only - Dec 7 11:51:15s 0:08:45 -
|
||||
Rule sol87 1987 only - Dec 8 11:51:40s 0:08:20 -
|
||||
Rule sol87 1987 only - Dec 9 11:52:05s 0:07:55 -
|
||||
Rule sol87 1987 only - Dec 10 11:52:30s 0:07:30 -
|
||||
Rule sol87 1987 only - Dec 11 11:53:00s 0:07:00 -
|
||||
Rule sol87 1987 only - Dec 12 11:53:25s 0:06:35 -
|
||||
Rule sol87 1987 only - Dec 13 11:53:55s 0:06:05 -
|
||||
Rule sol87 1987 only - Dec 14 11:54:25s 0:05:35 -
|
||||
Rule sol87 1987 only - Dec 15 11:54:50s 0:05:10 -
|
||||
Rule sol87 1987 only - Dec 16 11:55:20s 0:04:40 -
|
||||
Rule sol87 1987 only - Dec 17 11:55:50s 0:04:10 -
|
||||
Rule sol87 1987 only - Dec 18 11:56:20s 0:03:40 -
|
||||
Rule sol87 1987 only - Dec 19 11:56:50s 0:03:10 -
|
||||
Rule sol87 1987 only - Dec 20 11:57:20s 0:02:40 -
|
||||
Rule sol87 1987 only - Dec 21 11:57:50s 0:02:10 -
|
||||
Rule sol87 1987 only - Dec 22 11:58:20s 0:01:40 -
|
||||
Rule sol87 1987 only - Dec 23 11:58:50s 0:01:10 -
|
||||
Rule sol87 1987 only - Dec 24 11:59:20s 0:00:40 -
|
||||
Rule sol87 1987 only - Dec 25 11:59:50s 0:00:10 -
|
||||
Rule sol87 1987 only - Dec 26 12:00:20s -0:00:20 -
|
||||
Rule sol87 1987 only - Dec 27 12:00:45s -0:00:45 -
|
||||
Rule sol87 1987 only - Dec 28 12:01:15s -0:01:15 -
|
||||
Rule sol87 1987 only - Dec 29 12:01:45s -0:01:45 -
|
||||
Rule sol87 1987 only - Dec 30 12:02:15s -0:02:15 -
|
||||
Rule sol87 1987 only - Dec 31 12:02:45s -0:02:45 -
|
||||
|
||||
# Riyadh is at about 46 degrees 46 minutes East: 3 hrs, 7 mins, 4 secs
|
||||
# Before and after 1987, we'll operate on local mean solar time.
|
||||
|
||||
# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
|
||||
Zone Asia/Riyadh87 3:07:04 - zzz 1987
|
||||
3:07:04 sol87 zzz 1988
|
||||
3:07:04 - zzz
|
||||
# For backward compatibility...
|
||||
Link Asia/Riyadh87 Mideast/Riyadh87
|
@ -1,413 +0,0 @@
|
||||
#
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# <pre>
|
||||
# This file is in the public domain, so clarified as of
|
||||
# 2009-05-17 by Arthur David Olson.
|
||||
|
||||
# Apparent noon times below are for Riyadh; they're a bit off for other places.
|
||||
# Times were computed using formulas in the U.S. Naval Observatory's
|
||||
# Almanac for Computers 1988; the formulas "will give EqT to an accuracy of
|
||||
# [plus or minus two] seconds during the current year."
|
||||
#
|
||||
# Rounding to the nearest five seconds results in fewer than
|
||||
# 256 different "time types"--a limit that's faced because time types are
|
||||
# stored on disk as unsigned chars.
|
||||
|
||||
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
|
||||
Rule sol88 1988 only - Jan 1 12:03:15s -0:03:15 -
|
||||
Rule sol88 1988 only - Jan 2 12:03:40s -0:03:40 -
|
||||
Rule sol88 1988 only - Jan 3 12:04:10s -0:04:10 -
|
||||
Rule sol88 1988 only - Jan 4 12:04:40s -0:04:40 -
|
||||
Rule sol88 1988 only - Jan 5 12:05:05s -0:05:05 -
|
||||
Rule sol88 1988 only - Jan 6 12:05:30s -0:05:30 -
|
||||
Rule sol88 1988 only - Jan 7 12:06:00s -0:06:00 -
|
||||
Rule sol88 1988 only - Jan 8 12:06:25s -0:06:25 -
|
||||
Rule sol88 1988 only - Jan 9 12:06:50s -0:06:50 -
|
||||
Rule sol88 1988 only - Jan 10 12:07:15s -0:07:15 -
|
||||
Rule sol88 1988 only - Jan 11 12:07:40s -0:07:40 -
|
||||
Rule sol88 1988 only - Jan 12 12:08:05s -0:08:05 -
|
||||
Rule sol88 1988 only - Jan 13 12:08:25s -0:08:25 -
|
||||
Rule sol88 1988 only - Jan 14 12:08:50s -0:08:50 -
|
||||
Rule sol88 1988 only - Jan 15 12:09:10s -0:09:10 -
|
||||
Rule sol88 1988 only - Jan 16 12:09:30s -0:09:30 -
|
||||
Rule sol88 1988 only - Jan 17 12:09:50s -0:09:50 -
|
||||
Rule sol88 1988 only - Jan 18 12:10:10s -0:10:10 -
|
||||
Rule sol88 1988 only - Jan 19 12:10:30s -0:10:30 -
|
||||
Rule sol88 1988 only - Jan 20 12:10:50s -0:10:50 -
|
||||
Rule sol88 1988 only - Jan 21 12:11:05s -0:11:05 -
|
||||
Rule sol88 1988 only - Jan 22 12:11:25s -0:11:25 -
|
||||
Rule sol88 1988 only - Jan 23 12:11:40s -0:11:40 -
|
||||
Rule sol88 1988 only - Jan 24 12:11:55s -0:11:55 -
|
||||
Rule sol88 1988 only - Jan 25 12:12:10s -0:12:10 -
|
||||
Rule sol88 1988 only - Jan 26 12:12:25s -0:12:25 -
|
||||
Rule sol88 1988 only - Jan 27 12:12:40s -0:12:40 -
|
||||
Rule sol88 1988 only - Jan 28 12:12:50s -0:12:50 -
|
||||
Rule sol88 1988 only - Jan 29 12:13:00s -0:13:00 -
|
||||
Rule sol88 1988 only - Jan 30 12:13:10s -0:13:10 -
|
||||
Rule sol88 1988 only - Jan 31 12:13:20s -0:13:20 -
|
||||
Rule sol88 1988 only - Feb 1 12:13:30s -0:13:30 -
|
||||
Rule sol88 1988 only - Feb 2 12:13:40s -0:13:40 -
|
||||
Rule sol88 1988 only - Feb 3 12:13:45s -0:13:45 -
|
||||
Rule sol88 1988 only - Feb 4 12:13:55s -0:13:55 -
|
||||
Rule sol88 1988 only - Feb 5 12:14:00s -0:14:00 -
|
||||
Rule sol88 1988 only - Feb 6 12:14:05s -0:14:05 -
|
||||
Rule sol88 1988 only - Feb 7 12:14:10s -0:14:10 -
|
||||
Rule sol88 1988 only - Feb 8 12:14:10s -0:14:10 -
|
||||
Rule sol88 1988 only - Feb 9 12:14:15s -0:14:15 -
|
||||
Rule sol88 1988 only - Feb 10 12:14:15s -0:14:15 -
|
||||
Rule sol88 1988 only - Feb 11 12:14:15s -0:14:15 -
|
||||
Rule sol88 1988 only - Feb 12 12:14:15s -0:14:15 -
|
||||
Rule sol88 1988 only - Feb 13 12:14:15s -0:14:15 -
|
||||
Rule sol88 1988 only - Feb 14 12:14:15s -0:14:15 -
|
||||
Rule sol88 1988 only - Feb 15 12:14:10s -0:14:10 -
|
||||
Rule sol88 1988 only - Feb 16 12:14:10s -0:14:10 -
|
||||
Rule sol88 1988 only - Feb 17 12:14:05s -0:14:05 -
|
||||
Rule sol88 1988 only - Feb 18 12:14:00s -0:14:00 -
|
||||
Rule sol88 1988 only - Feb 19 12:13:55s -0:13:55 -
|
||||
Rule sol88 1988 only - Feb 20 12:13:50s -0:13:50 -
|
||||
Rule sol88 1988 only - Feb 21 12:13:45s -0:13:45 -
|
||||
Rule sol88 1988 only - Feb 22 12:13:40s -0:13:40 -
|
||||
Rule sol88 1988 only - Feb 23 12:13:30s -0:13:30 -
|
||||
Rule sol88 1988 only - Feb 24 12:13:20s -0:13:20 -
|
||||
Rule sol88 1988 only - Feb 25 12:13:15s -0:13:15 -
|
||||
Rule sol88 1988 only - Feb 26 12:13:05s -0:13:05 -
|
||||
Rule sol88 1988 only - Feb 27 12:12:55s -0:12:55 -
|
||||
Rule sol88 1988 only - Feb 28 12:12:45s -0:12:45 -
|
||||
Rule sol88 1988 only - Feb 29 12:12:30s -0:12:30 -
|
||||
Rule sol88 1988 only - Mar 1 12:12:20s -0:12:20 -
|
||||
Rule sol88 1988 only - Mar 2 12:12:10s -0:12:10 -
|
||||
Rule sol88 1988 only - Mar 3 12:11:55s -0:11:55 -
|
||||
Rule sol88 1988 only - Mar 4 12:11:45s -0:11:45 -
|
||||
Rule sol88 1988 only - Mar 5 12:11:30s -0:11:30 -
|
||||
Rule sol88 1988 only - Mar 6 12:11:15s -0:11:15 -
|
||||
Rule sol88 1988 only - Mar 7 12:11:00s -0:11:00 -
|
||||
Rule sol88 1988 only - Mar 8 12:10:45s -0:10:45 -
|
||||
Rule sol88 1988 only - Mar 9 12:10:30s -0:10:30 -
|
||||
Rule sol88 1988 only - Mar 10 12:10:15s -0:10:15 -
|
||||
Rule sol88 1988 only - Mar 11 12:10:00s -0:10:00 -
|
||||
Rule sol88 1988 only - Mar 12 12:09:45s -0:09:45 -
|
||||
Rule sol88 1988 only - Mar 13 12:09:30s -0:09:30 -
|
||||
Rule sol88 1988 only - Mar 14 12:09:10s -0:09:10 -
|
||||
Rule sol88 1988 only - Mar 15 12:08:55s -0:08:55 -
|
||||
Rule sol88 1988 only - Mar 16 12:08:40s -0:08:40 -
|
||||
Rule sol88 1988 only - Mar 17 12:08:20s -0:08:20 -
|
||||
Rule sol88 1988 only - Mar 18 12:08:05s -0:08:05 -
|
||||
Rule sol88 1988 only - Mar 19 12:07:45s -0:07:45 -
|
||||
Rule sol88 1988 only - Mar 20 12:07:30s -0:07:30 -
|
||||
Rule sol88 1988 only - Mar 21 12:07:10s -0:07:10 -
|
||||
Rule sol88 1988 only - Mar 22 12:06:50s -0:06:50 -
|
||||
Rule sol88 1988 only - Mar 23 12:06:35s -0:06:35 -
|
||||
Rule sol88 1988 only - Mar 24 12:06:15s -0:06:15 -
|
||||
Rule sol88 1988 only - Mar 25 12:06:00s -0:06:00 -
|
||||
Rule sol88 1988 only - Mar 26 12:05:40s -0:05:40 -
|
||||
Rule sol88 1988 only - Mar 27 12:05:20s -0:05:20 -
|
||||
Rule sol88 1988 only - Mar 28 12:05:05s -0:05:05 -
|
||||
Rule sol88 1988 only - Mar 29 12:04:45s -0:04:45 -
|
||||
Rule sol88 1988 only - Mar 30 12:04:25s -0:04:25 -
|
||||
Rule sol88 1988 only - Mar 31 12:04:10s -0:04:10 -
|
||||
Rule sol88 1988 only - Apr 1 12:03:50s -0:03:50 -
|
||||
Rule sol88 1988 only - Apr 2 12:03:35s -0:03:35 -
|
||||
Rule sol88 1988 only - Apr 3 12:03:15s -0:03:15 -
|
||||
Rule sol88 1988 only - Apr 4 12:03:00s -0:03:00 -
|
||||
Rule sol88 1988 only - Apr 5 12:02:40s -0:02:40 -
|
||||
Rule sol88 1988 only - Apr 6 12:02:25s -0:02:25 -
|
||||
Rule sol88 1988 only - Apr 7 12:02:05s -0:02:05 -
|
||||
Rule sol88 1988 only - Apr 8 12:01:50s -0:01:50 -
|
||||
Rule sol88 1988 only - Apr 9 12:01:35s -0:01:35 -
|
||||
Rule sol88 1988 only - Apr 10 12:01:15s -0:01:15 -
|
||||
Rule sol88 1988 only - Apr 11 12:01:00s -0:01:00 -
|
||||
Rule sol88 1988 only - Apr 12 12:00:45s -0:00:45 -
|
||||
Rule sol88 1988 only - Apr 13 12:00:30s -0:00:30 -
|
||||
Rule sol88 1988 only - Apr 14 12:00:15s -0:00:15 -
|
||||
Rule sol88 1988 only - Apr 15 12:00:00s 0:00:00 -
|
||||
Rule sol88 1988 only - Apr 16 11:59:45s 0:00:15 -
|
||||
Rule sol88 1988 only - Apr 17 11:59:30s 0:00:30 -
|
||||
Rule sol88 1988 only - Apr 18 11:59:20s 0:00:40 -
|
||||
Rule sol88 1988 only - Apr 19 11:59:05s 0:00:55 -
|
||||
Rule sol88 1988 only - Apr 20 11:58:55s 0:01:05 -
|
||||
Rule sol88 1988 only - Apr 21 11:58:40s 0:01:20 -
|
||||
Rule sol88 1988 only - Apr 22 11:58:30s 0:01:30 -
|
||||
Rule sol88 1988 only - Apr 23 11:58:15s 0:01:45 -
|
||||
Rule sol88 1988 only - Apr 24 11:58:05s 0:01:55 -
|
||||
Rule sol88 1988 only - Apr 25 11:57:55s 0:02:05 -
|
||||
Rule sol88 1988 only - Apr 26 11:57:45s 0:02:15 -
|
||||
Rule sol88 1988 only - Apr 27 11:57:35s 0:02:25 -
|
||||
Rule sol88 1988 only - Apr 28 11:57:30s 0:02:30 -
|
||||
Rule sol88 1988 only - Apr 29 11:57:20s 0:02:40 -
|
||||
Rule sol88 1988 only - Apr 30 11:57:10s 0:02:50 -
|
||||
Rule sol88 1988 only - May 1 11:57:05s 0:02:55 -
|
||||
Rule sol88 1988 only - May 2 11:56:55s 0:03:05 -
|
||||
Rule sol88 1988 only - May 3 11:56:50s 0:03:10 -
|
||||
Rule sol88 1988 only - May 4 11:56:45s 0:03:15 -
|
||||
Rule sol88 1988 only - May 5 11:56:40s 0:03:20 -
|
||||
Rule sol88 1988 only - May 6 11:56:35s 0:03:25 -
|
||||
Rule sol88 1988 only - May 7 11:56:30s 0:03:30 -
|
||||
Rule sol88 1988 only - May 8 11:56:25s 0:03:35 -
|
||||
Rule sol88 1988 only - May 9 11:56:25s 0:03:35 -
|
||||
Rule sol88 1988 only - May 10 11:56:20s 0:03:40 -
|
||||
Rule sol88 1988 only - May 11 11:56:20s 0:03:40 -
|
||||
Rule sol88 1988 only - May 12 11:56:20s 0:03:40 -
|
||||
Rule sol88 1988 only - May 13 11:56:20s 0:03:40 -
|
||||
Rule sol88 1988 only - May 14 11:56:20s 0:03:40 -
|
||||
Rule sol88 1988 only - May 15 11:56:20s 0:03:40 -
|
||||
Rule sol88 1988 only - May 16 11:56:20s 0:03:40 -
|
||||
Rule sol88 1988 only - May 17 11:56:20s 0:03:40 -
|
||||
Rule sol88 1988 only - May 18 11:56:25s 0:03:35 -
|
||||
Rule sol88 1988 only - May 19 11:56:25s 0:03:35 -
|
||||
Rule sol88 1988 only - May 20 11:56:30s 0:03:30 -
|
||||
Rule sol88 1988 only - May 21 11:56:35s 0:03:25 -
|
||||
Rule sol88 1988 only - May 22 11:56:40s 0:03:20 -
|
||||
Rule sol88 1988 only - May 23 11:56:45s 0:03:15 -
|
||||
Rule sol88 1988 only - May 24 11:56:50s 0:03:10 -
|
||||
Rule sol88 1988 only - May 25 11:56:55s 0:03:05 -
|
||||
Rule sol88 1988 only - May 26 11:57:00s 0:03:00 -
|
||||
Rule sol88 1988 only - May 27 11:57:05s 0:02:55 -
|
||||
Rule sol88 1988 only - May 28 11:57:15s 0:02:45 -
|
||||
Rule sol88 1988 only - May 29 11:57:20s 0:02:40 -
|
||||
Rule sol88 1988 only - May 30 11:57:30s 0:02:30 -
|
||||
Rule sol88 1988 only - May 31 11:57:40s 0:02:20 -
|
||||
Rule sol88 1988 only - Jun 1 11:57:50s 0:02:10 -
|
||||
Rule sol88 1988 only - Jun 2 11:57:55s 0:02:05 -
|
||||
Rule sol88 1988 only - Jun 3 11:58:05s 0:01:55 -
|
||||
Rule sol88 1988 only - Jun 4 11:58:15s 0:01:45 -
|
||||
Rule sol88 1988 only - Jun 5 11:58:30s 0:01:30 -
|
||||
Rule sol88 1988 only - Jun 6 11:58:40s 0:01:20 -
|
||||
Rule sol88 1988 only - Jun 7 11:58:50s 0:01:10 -
|
||||
Rule sol88 1988 only - Jun 8 11:59:00s 0:01:00 -
|
||||
Rule sol88 1988 only - Jun 9 11:59:15s 0:00:45 -
|
||||
Rule sol88 1988 only - Jun 10 11:59:25s 0:00:35 -
|
||||
Rule sol88 1988 only - Jun 11 11:59:35s 0:00:25 -
|
||||
Rule sol88 1988 only - Jun 12 11:59:50s 0:00:10 -
|
||||
Rule sol88 1988 only - Jun 13 12:00:00s 0:00:00 -
|
||||
Rule sol88 1988 only - Jun 14 12:00:15s -0:00:15 -
|
||||
Rule sol88 1988 only - Jun 15 12:00:25s -0:00:25 -
|
||||
Rule sol88 1988 only - Jun 16 12:00:40s -0:00:40 -
|
||||
Rule sol88 1988 only - Jun 17 12:00:55s -0:00:55 -
|
||||
Rule sol88 1988 only - Jun 18 12:01:05s -0:01:05 -
|
||||
Rule sol88 1988 only - Jun 19 12:01:20s -0:01:20 -
|
||||
Rule sol88 1988 only - Jun 20 12:01:30s -0:01:30 -
|
||||
Rule sol88 1988 only - Jun 21 12:01:45s -0:01:45 -
|
||||
Rule sol88 1988 only - Jun 22 12:02:00s -0:02:00 -
|
||||
Rule sol88 1988 only - Jun 23 12:02:10s -0:02:10 -
|
||||
Rule sol88 1988 only - Jun 24 12:02:25s -0:02:25 -
|
||||
Rule sol88 1988 only - Jun 25 12:02:35s -0:02:35 -
|
||||
Rule sol88 1988 only - Jun 26 12:02:50s -0:02:50 -
|
||||
Rule sol88 1988 only - Jun 27 12:03:00s -0:03:00 -
|
||||
Rule sol88 1988 only - Jun 28 12:03:15s -0:03:15 -
|
||||
Rule sol88 1988 only - Jun 29 12:03:25s -0:03:25 -
|
||||
Rule sol88 1988 only - Jun 30 12:03:40s -0:03:40 -
|
||||
Rule sol88 1988 only - Jul 1 12:03:50s -0:03:50 -
|
||||
Rule sol88 1988 only - Jul 2 12:04:00s -0:04:00 -
|
||||
Rule sol88 1988 only - Jul 3 12:04:10s -0:04:10 -
|
||||
Rule sol88 1988 only - Jul 4 12:04:25s -0:04:25 -
|
||||
Rule sol88 1988 only - Jul 5 12:04:35s -0:04:35 -
|
||||
Rule sol88 1988 only - Jul 6 12:04:45s -0:04:45 -
|
||||
Rule sol88 1988 only - Jul 7 12:04:55s -0:04:55 -
|
||||
Rule sol88 1988 only - Jul 8 12:05:05s -0:05:05 -
|
||||
Rule sol88 1988 only - Jul 9 12:05:10s -0:05:10 -
|
||||
Rule sol88 1988 only - Jul 10 12:05:20s -0:05:20 -
|
||||
Rule sol88 1988 only - Jul 11 12:05:30s -0:05:30 -
|
||||
Rule sol88 1988 only - Jul 12 12:05:35s -0:05:35 -
|
||||
Rule sol88 1988 only - Jul 13 12:05:45s -0:05:45 -
|
||||
Rule sol88 1988 only - Jul 14 12:05:50s -0:05:50 -
|
||||
Rule sol88 1988 only - Jul 15 12:05:55s -0:05:55 -
|
||||
Rule sol88 1988 only - Jul 16 12:06:00s -0:06:00 -
|
||||
Rule sol88 1988 only - Jul 17 12:06:05s -0:06:05 -
|
||||
Rule sol88 1988 only - Jul 18 12:06:10s -0:06:10 -
|
||||
Rule sol88 1988 only - Jul 19 12:06:15s -0:06:15 -
|
||||
Rule sol88 1988 only - Jul 20 12:06:20s -0:06:20 -
|
||||
Rule sol88 1988 only - Jul 21 12:06:25s -0:06:25 -
|
||||
Rule sol88 1988 only - Jul 22 12:06:25s -0:06:25 -
|
||||
Rule sol88 1988 only - Jul 23 12:06:25s -0:06:25 -
|
||||
Rule sol88 1988 only - Jul 24 12:06:30s -0:06:30 -
|
||||
Rule sol88 1988 only - Jul 25 12:06:30s -0:06:30 -
|
||||
Rule sol88 1988 only - Jul 26 12:06:30s -0:06:30 -
|
||||
Rule sol88 1988 only - Jul 27 12:06:30s -0:06:30 -
|
||||
Rule sol88 1988 only - Jul 28 12:06:30s -0:06:30 -
|
||||
Rule sol88 1988 only - Jul 29 12:06:25s -0:06:25 -
|
||||
Rule sol88 1988 only - Jul 30 12:06:25s -0:06:25 -
|
||||
Rule sol88 1988 only - Jul 31 12:06:20s -0:06:20 -
|
||||
Rule sol88 1988 only - Aug 1 12:06:15s -0:06:15 -
|
||||
Rule sol88 1988 only - Aug 2 12:06:15s -0:06:15 -
|
||||
Rule sol88 1988 only - Aug 3 12:06:10s -0:06:10 -
|
||||
Rule sol88 1988 only - Aug 4 12:06:05s -0:06:05 -
|
||||
Rule sol88 1988 only - Aug 5 12:05:55s -0:05:55 -
|
||||
Rule sol88 1988 only - Aug 6 12:05:50s -0:05:50 -
|
||||
Rule sol88 1988 only - Aug 7 12:05:45s -0:05:45 -
|
||||
Rule sol88 1988 only - Aug 8 12:05:35s -0:05:35 -
|
||||
Rule sol88 1988 only - Aug 9 12:05:25s -0:05:25 -
|
||||
Rule sol88 1988 only - Aug 10 12:05:20s -0:05:20 -
|
||||
Rule sol88 1988 only - Aug 11 12:05:10s -0:05:10 -
|
||||
Rule sol88 1988 only - Aug 12 12:05:00s -0:05:00 -
|
||||
Rule sol88 1988 only - Aug 13 12:04:50s -0:04:50 -
|
||||
Rule sol88 1988 only - Aug 14 12:04:35s -0:04:35 -
|
||||
Rule sol88 1988 only - Aug 15 12:04:25s -0:04:25 -
|
||||
Rule sol88 1988 only - Aug 16 12:04:15s -0:04:15 -
|
||||
Rule sol88 1988 only - Aug 17 12:04:00s -0:04:00 -
|
||||
Rule sol88 1988 only - Aug 18 12:03:50s -0:03:50 -
|
||||
Rule sol88 1988 only - Aug 19 12:03:35s -0:03:35 -
|
||||
Rule sol88 1988 only - Aug 20 12:03:20s -0:03:20 -
|
||||
Rule sol88 1988 only - Aug 21 12:03:05s -0:03:05 -
|
||||
Rule sol88 1988 only - Aug 22 12:02:50s -0:02:50 -
|
||||
Rule sol88 1988 only - Aug 23 12:02:35s -0:02:35 -
|
||||
Rule sol88 1988 only - Aug 24 12:02:20s -0:02:20 -
|
||||
Rule sol88 1988 only - Aug 25 12:02:00s -0:02:00 -
|
||||
Rule sol88 1988 only - Aug 26 12:01:45s -0:01:45 -
|
||||
Rule sol88 1988 only - Aug 27 12:01:30s -0:01:30 -
|
||||
Rule sol88 1988 only - Aug 28 12:01:10s -0:01:10 -
|
||||
Rule sol88 1988 only - Aug 29 12:00:50s -0:00:50 -
|
||||
Rule sol88 1988 only - Aug 30 12:00:35s -0:00:35 -
|
||||
Rule sol88 1988 only - Aug 31 12:00:15s -0:00:15 -
|
||||
Rule sol88 1988 only - Sep 1 11:59:55s 0:00:05 -
|
||||
Rule sol88 1988 only - Sep 2 11:59:35s 0:00:25 -
|
||||
Rule sol88 1988 only - Sep 3 11:59:20s 0:00:40 -
|
||||
Rule sol88 1988 only - Sep 4 11:59:00s 0:01:00 -
|
||||
Rule sol88 1988 only - Sep 5 11:58:40s 0:01:20 -
|
||||
Rule sol88 1988 only - Sep 6 11:58:20s 0:01:40 -
|
||||
Rule sol88 1988 only - Sep 7 11:58:00s 0:02:00 -
|
||||
Rule sol88 1988 only - Sep 8 11:57:35s 0:02:25 -
|
||||
Rule sol88 1988 only - Sep 9 11:57:15s 0:02:45 -
|
||||
Rule sol88 1988 only - Sep 10 11:56:55s 0:03:05 -
|
||||
Rule sol88 1988 only - Sep 11 11:56:35s 0:03:25 -
|
||||
Rule sol88 1988 only - Sep 12 11:56:15s 0:03:45 -
|
||||
Rule sol88 1988 only - Sep 13 11:55:50s 0:04:10 -
|
||||
Rule sol88 1988 only - Sep 14 11:55:30s 0:04:30 -
|
||||
Rule sol88 1988 only - Sep 15 11:55:10s 0:04:50 -
|
||||
Rule sol88 1988 only - Sep 16 11:54:50s 0:05:10 -
|
||||
Rule sol88 1988 only - Sep 17 11:54:25s 0:05:35 -
|
||||
Rule sol88 1988 only - Sep 18 11:54:05s 0:05:55 -
|
||||
Rule sol88 1988 only - Sep 19 11:53:45s 0:06:15 -
|
||||
Rule sol88 1988 only - Sep 20 11:53:25s 0:06:35 -
|
||||
Rule sol88 1988 only - Sep 21 11:53:00s 0:07:00 -
|
||||
Rule sol88 1988 only - Sep 22 11:52:40s 0:07:20 -
|
||||
Rule sol88 1988 only - Sep 23 11:52:20s 0:07:40 -
|
||||
Rule sol88 1988 only - Sep 24 11:52:00s 0:08:00 -
|
||||
Rule sol88 1988 only - Sep 25 11:51:40s 0:08:20 -
|
||||
Rule sol88 1988 only - Sep 26 11:51:15s 0:08:45 -
|
||||
Rule sol88 1988 only - Sep 27 11:50:55s 0:09:05 -
|
||||
Rule sol88 1988 only - Sep 28 11:50:35s 0:09:25 -
|
||||
Rule sol88 1988 only - Sep 29 11:50:15s 0:09:45 -
|
||||
Rule sol88 1988 only - Sep 30 11:49:55s 0:10:05 -
|
||||
Rule sol88 1988 only - Oct 1 11:49:35s 0:10:25 -
|
||||
Rule sol88 1988 only - Oct 2 11:49:20s 0:10:40 -
|
||||
Rule sol88 1988 only - Oct 3 11:49:00s 0:11:00 -
|
||||
Rule sol88 1988 only - Oct 4 11:48:40s 0:11:20 -
|
||||
Rule sol88 1988 only - Oct 5 11:48:25s 0:11:35 -
|
||||
Rule sol88 1988 only - Oct 6 11:48:05s 0:11:55 -
|
||||
Rule sol88 1988 only - Oct 7 11:47:50s 0:12:10 -
|
||||
Rule sol88 1988 only - Oct 8 11:47:30s 0:12:30 -
|
||||
Rule sol88 1988 only - Oct 9 11:47:15s 0:12:45 -
|
||||
Rule sol88 1988 only - Oct 10 11:47:00s 0:13:00 -
|
||||
Rule sol88 1988 only - Oct 11 11:46:45s 0:13:15 -
|
||||
Rule sol88 1988 only - Oct 12 11:46:30s 0:13:30 -
|
||||
Rule sol88 1988 only - Oct 13 11:46:15s 0:13:45 -
|
||||
Rule sol88 1988 only - Oct 14 11:46:00s 0:14:00 -
|
||||
Rule sol88 1988 only - Oct 15 11:45:45s 0:14:15 -
|
||||
Rule sol88 1988 only - Oct 16 11:45:35s 0:14:25 -
|
||||
Rule sol88 1988 only - Oct 17 11:45:20s 0:14:40 -
|
||||
Rule sol88 1988 only - Oct 18 11:45:10s 0:14:50 -
|
||||
Rule sol88 1988 only - Oct 19 11:45:00s 0:15:00 -
|
||||
Rule sol88 1988 only - Oct 20 11:44:45s 0:15:15 -
|
||||
Rule sol88 1988 only - Oct 21 11:44:40s 0:15:20 -
|
||||
Rule sol88 1988 only - Oct 22 11:44:30s 0:15:30 -
|
||||
Rule sol88 1988 only - Oct 23 11:44:20s 0:15:40 -
|
||||
Rule sol88 1988 only - Oct 24 11:44:10s 0:15:50 -
|
||||
Rule sol88 1988 only - Oct 25 11:44:05s 0:15:55 -
|
||||
Rule sol88 1988 only - Oct 26 11:44:00s 0:16:00 -
|
||||
Rule sol88 1988 only - Oct 27 11:43:55s 0:16:05 -
|
||||
Rule sol88 1988 only - Oct 28 11:43:50s 0:16:10 -
|
||||
Rule sol88 1988 only - Oct 29 11:43:45s 0:16:15 -
|
||||
Rule sol88 1988 only - Oct 30 11:43:40s 0:16:20 -
|
||||
Rule sol88 1988 only - Oct 31 11:43:40s 0:16:20 -
|
||||
Rule sol88 1988 only - Nov 1 11:43:35s 0:16:25 -
|
||||
Rule sol88 1988 only - Nov 2 11:43:35s 0:16:25 -
|
||||
Rule sol88 1988 only - Nov 3 11:43:35s 0:16:25 -
|
||||
Rule sol88 1988 only - Nov 4 11:43:35s 0:16:25 -
|
||||
Rule sol88 1988 only - Nov 5 11:43:40s 0:16:20 -
|
||||
Rule sol88 1988 only - Nov 6 11:43:40s 0:16:20 -
|
||||
Rule sol88 1988 only - Nov 7 11:43:45s 0:16:15 -
|
||||
Rule sol88 1988 only - Nov 8 11:43:45s 0:16:15 -
|
||||
Rule sol88 1988 only - Nov 9 11:43:50s 0:16:10 -
|
||||
Rule sol88 1988 only - Nov 10 11:44:00s 0:16:00 -
|
||||
Rule sol88 1988 only - Nov 11 11:44:05s 0:15:55 -
|
||||
Rule sol88 1988 only - Nov 12 11:44:10s 0:15:50 -
|
||||
Rule sol88 1988 only - Nov 13 11:44:20s 0:15:40 -
|
||||
Rule sol88 1988 only - Nov 14 11:44:30s 0:15:30 -
|
||||
Rule sol88 1988 only - Nov 15 11:44:40s 0:15:20 -
|
||||
Rule sol88 1988 only - Nov 16 11:44:50s 0:15:10 -
|
||||
Rule sol88 1988 only - Nov 17 11:45:00s 0:15:00 -
|
||||
Rule sol88 1988 only - Nov 18 11:45:15s 0:14:45 -
|
||||
Rule sol88 1988 only - Nov 19 11:45:25s 0:14:35 -
|
||||
Rule sol88 1988 only - Nov 20 11:45:40s 0:14:20 -
|
||||
Rule sol88 1988 only - Nov 21 11:45:55s 0:14:05 -
|
||||
Rule sol88 1988 only - Nov 22 11:46:10s 0:13:50 -
|
||||
Rule sol88 1988 only - Nov 23 11:46:30s 0:13:30 -
|
||||
Rule sol88 1988 only - Nov 24 11:46:45s 0:13:15 -
|
||||
Rule sol88 1988 only - Nov 25 11:47:05s 0:12:55 -
|
||||
Rule sol88 1988 only - Nov 26 11:47:20s 0:12:40 -
|
||||
Rule sol88 1988 only - Nov 27 11:47:40s 0:12:20 -
|
||||
Rule sol88 1988 only - Nov 28 11:48:00s 0:12:00 -
|
||||
Rule sol88 1988 only - Nov 29 11:48:25s 0:11:35 -
|
||||
Rule sol88 1988 only - Nov 30 11:48:45s 0:11:15 -
|
||||
Rule sol88 1988 only - Dec 1 11:49:05s 0:10:55 -
|
||||
Rule sol88 1988 only - Dec 2 11:49:30s 0:10:30 -
|
||||
Rule sol88 1988 only - Dec 3 11:49:55s 0:10:05 -
|
||||
Rule sol88 1988 only - Dec 4 11:50:15s 0:09:45 -
|
||||
Rule sol88 1988 only - Dec 5 11:50:40s 0:09:20 -
|
||||
Rule sol88 1988 only - Dec 6 11:51:05s 0:08:55 -
|
||||
Rule sol88 1988 only - Dec 7 11:51:35s 0:08:25 -
|
||||
Rule sol88 1988 only - Dec 8 11:52:00s 0:08:00 -
|
||||
Rule sol88 1988 only - Dec 9 11:52:25s 0:07:35 -
|
||||
Rule sol88 1988 only - Dec 10 11:52:55s 0:07:05 -
|
||||
Rule sol88 1988 only - Dec 11 11:53:20s 0:06:40 -
|
||||
Rule sol88 1988 only - Dec 12 11:53:50s 0:06:10 -
|
||||
Rule sol88 1988 only - Dec 13 11:54:15s 0:05:45 -
|
||||
Rule sol88 1988 only - Dec 14 11:54:45s 0:05:15 -
|
||||
Rule sol88 1988 only - Dec 15 11:55:15s 0:04:45 -
|
||||
Rule sol88 1988 only - Dec 16 11:55:45s 0:04:15 -
|
||||
Rule sol88 1988 only - Dec 17 11:56:15s 0:03:45 -
|
||||
Rule sol88 1988 only - Dec 18 11:56:40s 0:03:20 -
|
||||
Rule sol88 1988 only - Dec 19 11:57:10s 0:02:50 -
|
||||
Rule sol88 1988 only - Dec 20 11:57:40s 0:02:20 -
|
||||
Rule sol88 1988 only - Dec 21 11:58:10s 0:01:50 -
|
||||
Rule sol88 1988 only - Dec 22 11:58:40s 0:01:20 -
|
||||
Rule sol88 1988 only - Dec 23 11:59:10s 0:00:50 -
|
||||
Rule sol88 1988 only - Dec 24 11:59:40s 0:00:20 -
|
||||
Rule sol88 1988 only - Dec 25 12:00:10s -0:00:10 -
|
||||
Rule sol88 1988 only - Dec 26 12:00:40s -0:00:40 -
|
||||
Rule sol88 1988 only - Dec 27 12:01:10s -0:01:10 -
|
||||
Rule sol88 1988 only - Dec 28 12:01:40s -0:01:40 -
|
||||
Rule sol88 1988 only - Dec 29 12:02:10s -0:02:10 -
|
||||
Rule sol88 1988 only - Dec 30 12:02:35s -0:02:35 -
|
||||
Rule sol88 1988 only - Dec 31 12:03:05s -0:03:05 -
|
||||
|
||||
# Riyadh is at about 46 degrees 46 minutes East: 3 hrs, 7 mins, 4 secs
|
||||
# Before and after 1988, we'll operate on local mean solar time.
|
||||
|
||||
# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
|
||||
Zone Asia/Riyadh88 3:07:04 - zzz 1988
|
||||
3:07:04 sol88 zzz 1989
|
||||
3:07:04 - zzz
|
||||
# For backward compatibility...
|
||||
Link Asia/Riyadh88 Mideast/Riyadh88
|
@ -1,418 +0,0 @@
|
||||
#
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# <pre>
|
||||
# This file is in the public domain, so clarified as of
|
||||
# 2009-05-17 by Arthur David Olson.
|
||||
|
||||
# Apparent noon times below are for Riyadh; they're a bit off for other places.
|
||||
# Times were computed using a formula provided by the U. S. Naval Observatory:
|
||||
# eqt = -105.8 * sin(l) + 596.2 * sin(2 * l) + 4.4 * sin(3 * l)
|
||||
# -12.7 * sin(4 * l) - 429.0 * cos(l) - 2.1 * cos (2 * l)
|
||||
# + 19.3 * cos(3 * l);
|
||||
# where l is the "mean longitude of the Sun" given by
|
||||
# l = 279.642 degrees + 0.985647 * d
|
||||
# and d is the interval in days from January 0, 0 hours Universal Time
|
||||
# (equaling the day of the year plus the fraction of a day from zero hours).
|
||||
# The accuracy of the formula is plus or minus three seconds.
|
||||
#
|
||||
# Rounding to the nearest five seconds results in fewer than
|
||||
# 256 different "time types"--a limit that's faced because time types are
|
||||
# stored on disk as unsigned chars.
|
||||
|
||||
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
|
||||
Rule sol89 1989 only - Jan 1 12:03:35s -0:03:35 -
|
||||
Rule sol89 1989 only - Jan 2 12:04:05s -0:04:05 -
|
||||
Rule sol89 1989 only - Jan 3 12:04:30s -0:04:30 -
|
||||
Rule sol89 1989 only - Jan 4 12:05:00s -0:05:00 -
|
||||
Rule sol89 1989 only - Jan 5 12:05:25s -0:05:25 -
|
||||
Rule sol89 1989 only - Jan 6 12:05:50s -0:05:50 -
|
||||
Rule sol89 1989 only - Jan 7 12:06:15s -0:06:15 -
|
||||
Rule sol89 1989 only - Jan 8 12:06:45s -0:06:45 -
|
||||
Rule sol89 1989 only - Jan 9 12:07:10s -0:07:10 -
|
||||
Rule sol89 1989 only - Jan 10 12:07:35s -0:07:35 -
|
||||
Rule sol89 1989 only - Jan 11 12:07:55s -0:07:55 -
|
||||
Rule sol89 1989 only - Jan 12 12:08:20s -0:08:20 -
|
||||
Rule sol89 1989 only - Jan 13 12:08:45s -0:08:45 -
|
||||
Rule sol89 1989 only - Jan 14 12:09:05s -0:09:05 -
|
||||
Rule sol89 1989 only - Jan 15 12:09:25s -0:09:25 -
|
||||
Rule sol89 1989 only - Jan 16 12:09:45s -0:09:45 -
|
||||
Rule sol89 1989 only - Jan 17 12:10:05s -0:10:05 -
|
||||
Rule sol89 1989 only - Jan 18 12:10:25s -0:10:25 -
|
||||
Rule sol89 1989 only - Jan 19 12:10:45s -0:10:45 -
|
||||
Rule sol89 1989 only - Jan 20 12:11:05s -0:11:05 -
|
||||
Rule sol89 1989 only - Jan 21 12:11:20s -0:11:20 -
|
||||
Rule sol89 1989 only - Jan 22 12:11:35s -0:11:35 -
|
||||
Rule sol89 1989 only - Jan 23 12:11:55s -0:11:55 -
|
||||
Rule sol89 1989 only - Jan 24 12:12:10s -0:12:10 -
|
||||
Rule sol89 1989 only - Jan 25 12:12:20s -0:12:20 -
|
||||
Rule sol89 1989 only - Jan 26 12:12:35s -0:12:35 -
|
||||
Rule sol89 1989 only - Jan 27 12:12:50s -0:12:50 -
|
||||
Rule sol89 1989 only - Jan 28 12:13:00s -0:13:00 -
|
||||
Rule sol89 1989 only - Jan 29 12:13:10s -0:13:10 -
|
||||
Rule sol89 1989 only - Jan 30 12:13:20s -0:13:20 -
|
||||
Rule sol89 1989 only - Jan 31 12:13:30s -0:13:30 -
|
||||
Rule sol89 1989 only - Feb 1 12:13:40s -0:13:40 -
|
||||
Rule sol89 1989 only - Feb 2 12:13:45s -0:13:45 -
|
||||
Rule sol89 1989 only - Feb 3 12:13:55s -0:13:55 -
|
||||
Rule sol89 1989 only - Feb 4 12:14:00s -0:14:00 -
|
||||
Rule sol89 1989 only - Feb 5 12:14:05s -0:14:05 -
|
||||
Rule sol89 1989 only - Feb 6 12:14:10s -0:14:10 -
|
||||
Rule sol89 1989 only - Feb 7 12:14:10s -0:14:10 -
|
||||
Rule sol89 1989 only - Feb 8 12:14:15s -0:14:15 -
|
||||
Rule sol89 1989 only - Feb 9 12:14:15s -0:14:15 -
|
||||
Rule sol89 1989 only - Feb 10 12:14:20s -0:14:20 -
|
||||
Rule sol89 1989 only - Feb 11 12:14:20s -0:14:20 -
|
||||
Rule sol89 1989 only - Feb 12 12:14:20s -0:14:20 -
|
||||
Rule sol89 1989 only - Feb 13 12:14:15s -0:14:15 -
|
||||
Rule sol89 1989 only - Feb 14 12:14:15s -0:14:15 -
|
||||
Rule sol89 1989 only - Feb 15 12:14:10s -0:14:10 -
|
||||
Rule sol89 1989 only - Feb 16 12:14:10s -0:14:10 -
|
||||
Rule sol89 1989 only - Feb 17 12:14:05s -0:14:05 -
|
||||
Rule sol89 1989 only - Feb 18 12:14:00s -0:14:00 -
|
||||
Rule sol89 1989 only - Feb 19 12:13:55s -0:13:55 -
|
||||
Rule sol89 1989 only - Feb 20 12:13:50s -0:13:50 -
|
||||
Rule sol89 1989 only - Feb 21 12:13:40s -0:13:40 -
|
||||
Rule sol89 1989 only - Feb 22 12:13:35s -0:13:35 -
|
||||
Rule sol89 1989 only - Feb 23 12:13:25s -0:13:25 -
|
||||
Rule sol89 1989 only - Feb 24 12:13:15s -0:13:15 -
|
||||
Rule sol89 1989 only - Feb 25 12:13:05s -0:13:05 -
|
||||
Rule sol89 1989 only - Feb 26 12:12:55s -0:12:55 -
|
||||
Rule sol89 1989 only - Feb 27 12:12:45s -0:12:45 -
|
||||
Rule sol89 1989 only - Feb 28 12:12:35s -0:12:35 -
|
||||
Rule sol89 1989 only - Mar 1 12:12:25s -0:12:25 -
|
||||
Rule sol89 1989 only - Mar 2 12:12:10s -0:12:10 -
|
||||
Rule sol89 1989 only - Mar 3 12:12:00s -0:12:00 -
|
||||
Rule sol89 1989 only - Mar 4 12:11:45s -0:11:45 -
|
||||
Rule sol89 1989 only - Mar 5 12:11:35s -0:11:35 -
|
||||
Rule sol89 1989 only - Mar 6 12:11:20s -0:11:20 -
|
||||
Rule sol89 1989 only - Mar 7 12:11:05s -0:11:05 -
|
||||
Rule sol89 1989 only - Mar 8 12:10:50s -0:10:50 -
|
||||
Rule sol89 1989 only - Mar 9 12:10:35s -0:10:35 -
|
||||
Rule sol89 1989 only - Mar 10 12:10:20s -0:10:20 -
|
||||
Rule sol89 1989 only - Mar 11 12:10:05s -0:10:05 -
|
||||
Rule sol89 1989 only - Mar 12 12:09:50s -0:09:50 -
|
||||
Rule sol89 1989 only - Mar 13 12:09:30s -0:09:30 -
|
||||
Rule sol89 1989 only - Mar 14 12:09:15s -0:09:15 -
|
||||
Rule sol89 1989 only - Mar 15 12:09:00s -0:09:00 -
|
||||
Rule sol89 1989 only - Mar 16 12:08:40s -0:08:40 -
|
||||
Rule sol89 1989 only - Mar 17 12:08:25s -0:08:25 -
|
||||
Rule sol89 1989 only - Mar 18 12:08:05s -0:08:05 -
|
||||
Rule sol89 1989 only - Mar 19 12:07:50s -0:07:50 -
|
||||
Rule sol89 1989 only - Mar 20 12:07:30s -0:07:30 -
|
||||
Rule sol89 1989 only - Mar 21 12:07:15s -0:07:15 -
|
||||
Rule sol89 1989 only - Mar 22 12:06:55s -0:06:55 -
|
||||
Rule sol89 1989 only - Mar 23 12:06:35s -0:06:35 -
|
||||
Rule sol89 1989 only - Mar 24 12:06:20s -0:06:20 -
|
||||
Rule sol89 1989 only - Mar 25 12:06:00s -0:06:00 -
|
||||
Rule sol89 1989 only - Mar 26 12:05:40s -0:05:40 -
|
||||
Rule sol89 1989 only - Mar 27 12:05:25s -0:05:25 -
|
||||
Rule sol89 1989 only - Mar 28 12:05:05s -0:05:05 -
|
||||
Rule sol89 1989 only - Mar 29 12:04:50s -0:04:50 -
|
||||
Rule sol89 1989 only - Mar 30 12:04:30s -0:04:30 -
|
||||
Rule sol89 1989 only - Mar 31 12:04:10s -0:04:10 -
|
||||
Rule sol89 1989 only - Apr 1 12:03:55s -0:03:55 -
|
||||
Rule sol89 1989 only - Apr 2 12:03:35s -0:03:35 -
|
||||
Rule sol89 1989 only - Apr 3 12:03:20s -0:03:20 -
|
||||
Rule sol89 1989 only - Apr 4 12:03:00s -0:03:00 -
|
||||
Rule sol89 1989 only - Apr 5 12:02:45s -0:02:45 -
|
||||
Rule sol89 1989 only - Apr 6 12:02:25s -0:02:25 -
|
||||
Rule sol89 1989 only - Apr 7 12:02:10s -0:02:10 -
|
||||
Rule sol89 1989 only - Apr 8 12:01:50s -0:01:50 -
|
||||
Rule sol89 1989 only - Apr 9 12:01:35s -0:01:35 -
|
||||
Rule sol89 1989 only - Apr 10 12:01:20s -0:01:20 -
|
||||
Rule sol89 1989 only - Apr 11 12:01:05s -0:01:05 -
|
||||
Rule sol89 1989 only - Apr 12 12:00:50s -0:00:50 -
|
||||
Rule sol89 1989 only - Apr 13 12:00:35s -0:00:35 -
|
||||
Rule sol89 1989 only - Apr 14 12:00:20s -0:00:20 -
|
||||
Rule sol89 1989 only - Apr 15 12:00:05s -0:00:05 -
|
||||
Rule sol89 1989 only - Apr 16 11:59:50s 0:00:10 -
|
||||
Rule sol89 1989 only - Apr 17 11:59:35s 0:00:25 -
|
||||
Rule sol89 1989 only - Apr 18 11:59:20s 0:00:40 -
|
||||
Rule sol89 1989 only - Apr 19 11:59:10s 0:00:50 -
|
||||
Rule sol89 1989 only - Apr 20 11:58:55s 0:01:05 -
|
||||
Rule sol89 1989 only - Apr 21 11:58:45s 0:01:15 -
|
||||
Rule sol89 1989 only - Apr 22 11:58:30s 0:01:30 -
|
||||
Rule sol89 1989 only - Apr 23 11:58:20s 0:01:40 -
|
||||
Rule sol89 1989 only - Apr 24 11:58:10s 0:01:50 -
|
||||
Rule sol89 1989 only - Apr 25 11:58:00s 0:02:00 -
|
||||
Rule sol89 1989 only - Apr 26 11:57:50s 0:02:10 -
|
||||
Rule sol89 1989 only - Apr 27 11:57:40s 0:02:20 -
|
||||
Rule sol89 1989 only - Apr 28 11:57:30s 0:02:30 -
|
||||
Rule sol89 1989 only - Apr 29 11:57:20s 0:02:40 -
|
||||
Rule sol89 1989 only - Apr 30 11:57:15s 0:02:45 -
|
||||
Rule sol89 1989 only - May 1 11:57:05s 0:02:55 -
|
||||
Rule sol89 1989 only - May 2 11:57:00s 0:03:00 -
|
||||
Rule sol89 1989 only - May 3 11:56:50s 0:03:10 -
|
||||
Rule sol89 1989 only - May 4 11:56:45s 0:03:15 -
|
||||
Rule sol89 1989 only - May 5 11:56:40s 0:03:20 -
|
||||
Rule sol89 1989 only - May 6 11:56:35s 0:03:25 -
|
||||
Rule sol89 1989 only - May 7 11:56:30s 0:03:30 -
|
||||
Rule sol89 1989 only - May 8 11:56:30s 0:03:30 -
|
||||
Rule sol89 1989 only - May 9 11:56:25s 0:03:35 -
|
||||
Rule sol89 1989 only - May 10 11:56:25s 0:03:35 -
|
||||
Rule sol89 1989 only - May 11 11:56:20s 0:03:40 -
|
||||
Rule sol89 1989 only - May 12 11:56:20s 0:03:40 -
|
||||
Rule sol89 1989 only - May 13 11:56:20s 0:03:40 -
|
||||
Rule sol89 1989 only - May 14 11:56:20s 0:03:40 -
|
||||
Rule sol89 1989 only - May 15 11:56:20s 0:03:40 -
|
||||
Rule sol89 1989 only - May 16 11:56:20s 0:03:40 -
|
||||
Rule sol89 1989 only - May 17 11:56:20s 0:03:40 -
|
||||
Rule sol89 1989 only - May 18 11:56:25s 0:03:35 -
|
||||
Rule sol89 1989 only - May 19 11:56:25s 0:03:35 -
|
||||
Rule sol89 1989 only - May 20 11:56:30s 0:03:30 -
|
||||
Rule sol89 1989 only - May 21 11:56:35s 0:03:25 -
|
||||
Rule sol89 1989 only - May 22 11:56:35s 0:03:25 -
|
||||
Rule sol89 1989 only - May 23 11:56:40s 0:03:20 -
|
||||
Rule sol89 1989 only - May 24 11:56:45s 0:03:15 -
|
||||
Rule sol89 1989 only - May 25 11:56:55s 0:03:05 -
|
||||
Rule sol89 1989 only - May 26 11:57:00s 0:03:00 -
|
||||
Rule sol89 1989 only - May 27 11:57:05s 0:02:55 -
|
||||
Rule sol89 1989 only - May 28 11:57:15s 0:02:45 -
|
||||
Rule sol89 1989 only - May 29 11:57:20s 0:02:40 -
|
||||
Rule sol89 1989 only - May 30 11:57:30s 0:02:30 -
|
||||
Rule sol89 1989 only - May 31 11:57:35s 0:02:25 -
|
||||
Rule sol89 1989 only - Jun 1 11:57:45s 0:02:15 -
|
||||
Rule sol89 1989 only - Jun 2 11:57:55s 0:02:05 -
|
||||
Rule sol89 1989 only - Jun 3 11:58:05s 0:01:55 -
|
||||
Rule sol89 1989 only - Jun 4 11:58:15s 0:01:45 -
|
||||
Rule sol89 1989 only - Jun 5 11:58:25s 0:01:35 -
|
||||
Rule sol89 1989 only - Jun 6 11:58:35s 0:01:25 -
|
||||
Rule sol89 1989 only - Jun 7 11:58:45s 0:01:15 -
|
||||
Rule sol89 1989 only - Jun 8 11:59:00s 0:01:00 -
|
||||
Rule sol89 1989 only - Jun 9 11:59:10s 0:00:50 -
|
||||
Rule sol89 1989 only - Jun 10 11:59:20s 0:00:40 -
|
||||
Rule sol89 1989 only - Jun 11 11:59:35s 0:00:25 -
|
||||
Rule sol89 1989 only - Jun 12 11:59:45s 0:00:15 -
|
||||
Rule sol89 1989 only - Jun 13 12:00:00s 0:00:00 -
|
||||
Rule sol89 1989 only - Jun 14 12:00:10s -0:00:10 -
|
||||
Rule sol89 1989 only - Jun 15 12:00:25s -0:00:25 -
|
||||
Rule sol89 1989 only - Jun 16 12:00:35s -0:00:35 -
|
||||
Rule sol89 1989 only - Jun 17 12:00:50s -0:00:50 -
|
||||
Rule sol89 1989 only - Jun 18 12:01:05s -0:01:05 -
|
||||
Rule sol89 1989 only - Jun 19 12:01:15s -0:01:15 -
|
||||
Rule sol89 1989 only - Jun 20 12:01:30s -0:01:30 -
|
||||
Rule sol89 1989 only - Jun 21 12:01:40s -0:01:40 -
|
||||
Rule sol89 1989 only - Jun 22 12:01:55s -0:01:55 -
|
||||
Rule sol89 1989 only - Jun 23 12:02:10s -0:02:10 -
|
||||
Rule sol89 1989 only - Jun 24 12:02:20s -0:02:20 -
|
||||
Rule sol89 1989 only - Jun 25 12:02:35s -0:02:35 -
|
||||
Rule sol89 1989 only - Jun 26 12:02:45s -0:02:45 -
|
||||
Rule sol89 1989 only - Jun 27 12:03:00s -0:03:00 -
|
||||
Rule sol89 1989 only - Jun 28 12:03:10s -0:03:10 -
|
||||
Rule sol89 1989 only - Jun 29 12:03:25s -0:03:25 -
|
||||
Rule sol89 1989 only - Jun 30 12:03:35s -0:03:35 -
|
||||
Rule sol89 1989 only - Jul 1 12:03:45s -0:03:45 -
|
||||
Rule sol89 1989 only - Jul 2 12:04:00s -0:04:00 -
|
||||
Rule sol89 1989 only - Jul 3 12:04:10s -0:04:10 -
|
||||
Rule sol89 1989 only - Jul 4 12:04:20s -0:04:20 -
|
||||
Rule sol89 1989 only - Jul 5 12:04:30s -0:04:30 -
|
||||
Rule sol89 1989 only - Jul 6 12:04:40s -0:04:40 -
|
||||
Rule sol89 1989 only - Jul 7 12:04:50s -0:04:50 -
|
||||
Rule sol89 1989 only - Jul 8 12:05:00s -0:05:00 -
|
||||
Rule sol89 1989 only - Jul 9 12:05:10s -0:05:10 -
|
||||
Rule sol89 1989 only - Jul 10 12:05:20s -0:05:20 -
|
||||
Rule sol89 1989 only - Jul 11 12:05:25s -0:05:25 -
|
||||
Rule sol89 1989 only - Jul 12 12:05:35s -0:05:35 -
|
||||
Rule sol89 1989 only - Jul 13 12:05:40s -0:05:40 -
|
||||
Rule sol89 1989 only - Jul 14 12:05:50s -0:05:50 -
|
||||
Rule sol89 1989 only - Jul 15 12:05:55s -0:05:55 -
|
||||
Rule sol89 1989 only - Jul 16 12:06:00s -0:06:00 -
|
||||
Rule sol89 1989 only - Jul 17 12:06:05s -0:06:05 -
|
||||
Rule sol89 1989 only - Jul 18 12:06:10s -0:06:10 -
|
||||
Rule sol89 1989 only - Jul 19 12:06:15s -0:06:15 -
|
||||
Rule sol89 1989 only - Jul 20 12:06:20s -0:06:20 -
|
||||
Rule sol89 1989 only - Jul 21 12:06:20s -0:06:20 -
|
||||
Rule sol89 1989 only - Jul 22 12:06:25s -0:06:25 -
|
||||
Rule sol89 1989 only - Jul 23 12:06:25s -0:06:25 -
|
||||
Rule sol89 1989 only - Jul 24 12:06:30s -0:06:30 -
|
||||
Rule sol89 1989 only - Jul 25 12:06:30s -0:06:30 -
|
||||
Rule sol89 1989 only - Jul 26 12:06:30s -0:06:30 -
|
||||
Rule sol89 1989 only - Jul 27 12:06:30s -0:06:30 -
|
||||
Rule sol89 1989 only - Jul 28 12:06:30s -0:06:30 -
|
||||
Rule sol89 1989 only - Jul 29 12:06:25s -0:06:25 -
|
||||
Rule sol89 1989 only - Jul 30 12:06:25s -0:06:25 -
|
||||
Rule sol89 1989 only - Jul 31 12:06:20s -0:06:20 -
|
||||
Rule sol89 1989 only - Aug 1 12:06:20s -0:06:20 -
|
||||
Rule sol89 1989 only - Aug 2 12:06:15s -0:06:15 -
|
||||
Rule sol89 1989 only - Aug 3 12:06:10s -0:06:10 -
|
||||
Rule sol89 1989 only - Aug 4 12:06:05s -0:06:05 -
|
||||
Rule sol89 1989 only - Aug 5 12:06:00s -0:06:00 -
|
||||
Rule sol89 1989 only - Aug 6 12:05:50s -0:05:50 -
|
||||
Rule sol89 1989 only - Aug 7 12:05:45s -0:05:45 -
|
||||
Rule sol89 1989 only - Aug 8 12:05:35s -0:05:35 -
|
||||
Rule sol89 1989 only - Aug 9 12:05:30s -0:05:30 -
|
||||
Rule sol89 1989 only - Aug 10 12:05:20s -0:05:20 -
|
||||
Rule sol89 1989 only - Aug 11 12:05:10s -0:05:10 -
|
||||
Rule sol89 1989 only - Aug 12 12:05:00s -0:05:00 -
|
||||
Rule sol89 1989 only - Aug 13 12:04:50s -0:04:50 -
|
||||
Rule sol89 1989 only - Aug 14 12:04:40s -0:04:40 -
|
||||
Rule sol89 1989 only - Aug 15 12:04:30s -0:04:30 -
|
||||
Rule sol89 1989 only - Aug 16 12:04:15s -0:04:15 -
|
||||
Rule sol89 1989 only - Aug 17 12:04:05s -0:04:05 -
|
||||
Rule sol89 1989 only - Aug 18 12:03:50s -0:03:50 -
|
||||
Rule sol89 1989 only - Aug 19 12:03:35s -0:03:35 -
|
||||
Rule sol89 1989 only - Aug 20 12:03:25s -0:03:25 -
|
||||
Rule sol89 1989 only - Aug 21 12:03:10s -0:03:10 -
|
||||
Rule sol89 1989 only - Aug 22 12:02:55s -0:02:55 -
|
||||
Rule sol89 1989 only - Aug 23 12:02:40s -0:02:40 -
|
||||
Rule sol89 1989 only - Aug 24 12:02:20s -0:02:20 -
|
||||
Rule sol89 1989 only - Aug 25 12:02:05s -0:02:05 -
|
||||
Rule sol89 1989 only - Aug 26 12:01:50s -0:01:50 -
|
||||
Rule sol89 1989 only - Aug 27 12:01:30s -0:01:30 -
|
||||
Rule sol89 1989 only - Aug 28 12:01:15s -0:01:15 -
|
||||
Rule sol89 1989 only - Aug 29 12:00:55s -0:00:55 -
|
||||
Rule sol89 1989 only - Aug 30 12:00:40s -0:00:40 -
|
||||
Rule sol89 1989 only - Aug 31 12:00:20s -0:00:20 -
|
||||
Rule sol89 1989 only - Sep 1 12:00:00s 0:00:00 -
|
||||
Rule sol89 1989 only - Sep 2 11:59:45s 0:00:15 -
|
||||
Rule sol89 1989 only - Sep 3 11:59:25s 0:00:35 -
|
||||
Rule sol89 1989 only - Sep 4 11:59:05s 0:00:55 -
|
||||
Rule sol89 1989 only - Sep 5 11:58:45s 0:01:15 -
|
||||
Rule sol89 1989 only - Sep 6 11:58:25s 0:01:35 -
|
||||
Rule sol89 1989 only - Sep 7 11:58:05s 0:01:55 -
|
||||
Rule sol89 1989 only - Sep 8 11:57:45s 0:02:15 -
|
||||
Rule sol89 1989 only - Sep 9 11:57:20s 0:02:40 -
|
||||
Rule sol89 1989 only - Sep 10 11:57:00s 0:03:00 -
|
||||
Rule sol89 1989 only - Sep 11 11:56:40s 0:03:20 -
|
||||
Rule sol89 1989 only - Sep 12 11:56:20s 0:03:40 -
|
||||
Rule sol89 1989 only - Sep 13 11:56:00s 0:04:00 -
|
||||
Rule sol89 1989 only - Sep 14 11:55:35s 0:04:25 -
|
||||
Rule sol89 1989 only - Sep 15 11:55:15s 0:04:45 -
|
||||
Rule sol89 1989 only - Sep 16 11:54:55s 0:05:05 -
|
||||
Rule sol89 1989 only - Sep 17 11:54:35s 0:05:25 -
|
||||
Rule sol89 1989 only - Sep 18 11:54:10s 0:05:50 -
|
||||
Rule sol89 1989 only - Sep 19 11:53:50s 0:06:10 -
|
||||
Rule sol89 1989 only - Sep 20 11:53:30s 0:06:30 -
|
||||
Rule sol89 1989 only - Sep 21 11:53:10s 0:06:50 -
|
||||
Rule sol89 1989 only - Sep 22 11:52:45s 0:07:15 -
|
||||
Rule sol89 1989 only - Sep 23 11:52:25s 0:07:35 -
|
||||
Rule sol89 1989 only - Sep 24 11:52:05s 0:07:55 -
|
||||
Rule sol89 1989 only - Sep 25 11:51:45s 0:08:15 -
|
||||
Rule sol89 1989 only - Sep 26 11:51:25s 0:08:35 -
|
||||
Rule sol89 1989 only - Sep 27 11:51:05s 0:08:55 -
|
||||
Rule sol89 1989 only - Sep 28 11:50:40s 0:09:20 -
|
||||
Rule sol89 1989 only - Sep 29 11:50:20s 0:09:40 -
|
||||
Rule sol89 1989 only - Sep 30 11:50:00s 0:10:00 -
|
||||
Rule sol89 1989 only - Oct 1 11:49:45s 0:10:15 -
|
||||
Rule sol89 1989 only - Oct 2 11:49:25s 0:10:35 -
|
||||
Rule sol89 1989 only - Oct 3 11:49:05s 0:10:55 -
|
||||
Rule sol89 1989 only - Oct 4 11:48:45s 0:11:15 -
|
||||
Rule sol89 1989 only - Oct 5 11:48:30s 0:11:30 -
|
||||
Rule sol89 1989 only - Oct 6 11:48:10s 0:11:50 -
|
||||
Rule sol89 1989 only - Oct 7 11:47:50s 0:12:10 -
|
||||
Rule sol89 1989 only - Oct 8 11:47:35s 0:12:25 -
|
||||
Rule sol89 1989 only - Oct 9 11:47:20s 0:12:40 -
|
||||
Rule sol89 1989 only - Oct 10 11:47:00s 0:13:00 -
|
||||
Rule sol89 1989 only - Oct 11 11:46:45s 0:13:15 -
|
||||
Rule sol89 1989 only - Oct 12 11:46:30s 0:13:30 -
|
||||
Rule sol89 1989 only - Oct 13 11:46:15s 0:13:45 -
|
||||
Rule sol89 1989 only - Oct 14 11:46:00s 0:14:00 -
|
||||
Rule sol89 1989 only - Oct 15 11:45:50s 0:14:10 -
|
||||
Rule sol89 1989 only - Oct 16 11:45:35s 0:14:25 -
|
||||
Rule sol89 1989 only - Oct 17 11:45:20s 0:14:40 -
|
||||
Rule sol89 1989 only - Oct 18 11:45:10s 0:14:50 -
|
||||
Rule sol89 1989 only - Oct 19 11:45:00s 0:15:00 -
|
||||
Rule sol89 1989 only - Oct 20 11:44:50s 0:15:10 -
|
||||
Rule sol89 1989 only - Oct 21 11:44:40s 0:15:20 -
|
||||
Rule sol89 1989 only - Oct 22 11:44:30s 0:15:30 -
|
||||
Rule sol89 1989 only - Oct 23 11:44:20s 0:15:40 -
|
||||
Rule sol89 1989 only - Oct 24 11:44:10s 0:15:50 -
|
||||
Rule sol89 1989 only - Oct 25 11:44:05s 0:15:55 -
|
||||
Rule sol89 1989 only - Oct 26 11:44:00s 0:16:00 -
|
||||
Rule sol89 1989 only - Oct 27 11:43:50s 0:16:10 -
|
||||
Rule sol89 1989 only - Oct 28 11:43:45s 0:16:15 -
|
||||
Rule sol89 1989 only - Oct 29 11:43:40s 0:16:20 -
|
||||
Rule sol89 1989 only - Oct 30 11:43:40s 0:16:20 -
|
||||
Rule sol89 1989 only - Oct 31 11:43:35s 0:16:25 -
|
||||
Rule sol89 1989 only - Nov 1 11:43:35s 0:16:25 -
|
||||
Rule sol89 1989 only - Nov 2 11:43:35s 0:16:25 -
|
||||
Rule sol89 1989 only - Nov 3 11:43:30s 0:16:30 -
|
||||
Rule sol89 1989 only - Nov 4 11:43:35s 0:16:25 -
|
||||
Rule sol89 1989 only - Nov 5 11:43:35s 0:16:25 -
|
||||
Rule sol89 1989 only - Nov 6 11:43:35s 0:16:25 -
|
||||
Rule sol89 1989 only - Nov 7 11:43:40s 0:16:20 -
|
||||
Rule sol89 1989 only - Nov 8 11:43:45s 0:16:15 -
|
||||
Rule sol89 1989 only - Nov 9 11:43:50s 0:16:10 -
|
||||
Rule sol89 1989 only - Nov 10 11:43:55s 0:16:05 -
|
||||
Rule sol89 1989 only - Nov 11 11:44:00s 0:16:00 -
|
||||
Rule sol89 1989 only - Nov 12 11:44:05s 0:15:55 -
|
||||
Rule sol89 1989 only - Nov 13 11:44:15s 0:15:45 -
|
||||
Rule sol89 1989 only - Nov 14 11:44:25s 0:15:35 -
|
||||
Rule sol89 1989 only - Nov 15 11:44:35s 0:15:25 -
|
||||
Rule sol89 1989 only - Nov 16 11:44:45s 0:15:15 -
|
||||
Rule sol89 1989 only - Nov 17 11:44:55s 0:15:05 -
|
||||
Rule sol89 1989 only - Nov 18 11:45:10s 0:14:50 -
|
||||
Rule sol89 1989 only - Nov 19 11:45:20s 0:14:40 -
|
||||
Rule sol89 1989 only - Nov 20 11:45:35s 0:14:25 -
|
||||
Rule sol89 1989 only - Nov 21 11:45:50s 0:14:10 -
|
||||
Rule sol89 1989 only - Nov 22 11:46:05s 0:13:55 -
|
||||
Rule sol89 1989 only - Nov 23 11:46:25s 0:13:35 -
|
||||
Rule sol89 1989 only - Nov 24 11:46:40s 0:13:20 -
|
||||
Rule sol89 1989 only - Nov 25 11:47:00s 0:13:00 -
|
||||
Rule sol89 1989 only - Nov 26 11:47:20s 0:12:40 -
|
||||
Rule sol89 1989 only - Nov 27 11:47:35s 0:12:25 -
|
||||
Rule sol89 1989 only - Nov 28 11:47:55s 0:12:05 -
|
||||
Rule sol89 1989 only - Nov 29 11:48:20s 0:11:40 -
|
||||
Rule sol89 1989 only - Nov 30 11:48:40s 0:11:20 -
|
||||
Rule sol89 1989 only - Dec 1 11:49:00s 0:11:00 -
|
||||
Rule sol89 1989 only - Dec 2 11:49:25s 0:10:35 -
|
||||
Rule sol89 1989 only - Dec 3 11:49:50s 0:10:10 -
|
||||
Rule sol89 1989 only - Dec 4 11:50:15s 0:09:45 -
|
||||
Rule sol89 1989 only - Dec 5 11:50:35s 0:09:25 -
|
||||
Rule sol89 1989 only - Dec 6 11:51:00s 0:09:00 -
|
||||
Rule sol89 1989 only - Dec 7 11:51:30s 0:08:30 -
|
||||
Rule sol89 1989 only - Dec 8 11:51:55s 0:08:05 -
|
||||
Rule sol89 1989 only - Dec 9 11:52:20s 0:07:40 -
|
||||
Rule sol89 1989 only - Dec 10 11:52:50s 0:07:10 -
|
||||
Rule sol89 1989 only - Dec 11 11:53:15s 0:06:45 -
|
||||
Rule sol89 1989 only - Dec 12 11:53:45s 0:06:15 -
|
||||
Rule sol89 1989 only - Dec 13 11:54:10s 0:05:50 -
|
||||
Rule sol89 1989 only - Dec 14 11:54:40s 0:05:20 -
|
||||
Rule sol89 1989 only - Dec 15 11:55:10s 0:04:50 -
|
||||
Rule sol89 1989 only - Dec 16 11:55:40s 0:04:20 -
|
||||
Rule sol89 1989 only - Dec 17 11:56:05s 0:03:55 -
|
||||
Rule sol89 1989 only - Dec 18 11:56:35s 0:03:25 -
|
||||
Rule sol89 1989 only - Dec 19 11:57:05s 0:02:55 -
|
||||
Rule sol89 1989 only - Dec 20 11:57:35s 0:02:25 -
|
||||
Rule sol89 1989 only - Dec 21 11:58:05s 0:01:55 -
|
||||
Rule sol89 1989 only - Dec 22 11:58:35s 0:01:25 -
|
||||
Rule sol89 1989 only - Dec 23 11:59:05s 0:00:55 -
|
||||
Rule sol89 1989 only - Dec 24 11:59:35s 0:00:25 -
|
||||
Rule sol89 1989 only - Dec 25 12:00:05s -0:00:05 -
|
||||
Rule sol89 1989 only - Dec 26 12:00:35s -0:00:35 -
|
||||
Rule sol89 1989 only - Dec 27 12:01:05s -0:01:05 -
|
||||
Rule sol89 1989 only - Dec 28 12:01:35s -0:01:35 -
|
||||
Rule sol89 1989 only - Dec 29 12:02:00s -0:02:00 -
|
||||
Rule sol89 1989 only - Dec 30 12:02:30s -0:02:30 -
|
||||
Rule sol89 1989 only - Dec 31 12:03:00s -0:03:00 -
|
||||
|
||||
# Riyadh is at about 46 degrees 46 minutes East: 3 hrs, 7 mins, 4 secs
|
||||
# Before and after 1989, we'll operate on local mean solar time.
|
||||
|
||||
# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
|
||||
Zone Asia/Riyadh89 3:07:04 - zzz 1989
|
||||
3:07:04 sol89 zzz 1990
|
||||
3:07:04 - zzz
|
||||
# For backward compatibility...
|
||||
Link Asia/Riyadh89 Mideast/Riyadh89
|
@ -1,470 +0,0 @@
|
||||
#
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# tzdb timezone descriptions (deprecated version)
|
||||
#
|
||||
# This file is in the public domain, so clarified as of
|
||||
# 2009-05-17 by Arthur David Olson.
|
||||
#
|
||||
# From Paul Eggert (2021-09-20):
|
||||
# This file is intended as a backward-compatibility aid for older programs.
|
||||
# New programs should use zone1970.tab. This file is like zone1970.tab (see
|
||||
# zone1970.tab's comments), but with the following additional restrictions:
|
||||
#
|
||||
# 1. This file contains only ASCII characters.
|
||||
# 2. The first data column contains exactly one country code.
|
||||
#
|
||||
# Because of (2), each row stands for an area that is the intersection
|
||||
# of a region identified by a country code and of a timezone where civil
|
||||
# clocks have agreed since 1970; this is a narrower definition than
|
||||
# that of zone1970.tab.
|
||||
#
|
||||
# Unlike zone1970.tab, a row's third column can be a Link from
|
||||
# 'backward' instead of a Zone.
|
||||
#
|
||||
# This table is intended as an aid for users, to help them select timezones
|
||||
# appropriate for their practical needs. It is not intended to take or
|
||||
# endorse any position on legal or territorial claims.
|
||||
#
|
||||
#country-
|
||||
#code coordinates TZ comments
|
||||
AD +4230+00131 Europe/Andorra
|
||||
AE +2518+05518 Asia/Dubai
|
||||
AF +3431+06912 Asia/Kabul
|
||||
AG +1703-06148 America/Antigua
|
||||
AI +1812-06304 America/Anguilla
|
||||
AL +4120+01950 Europe/Tirane
|
||||
AM +4011+04430 Asia/Yerevan
|
||||
AO -0848+01314 Africa/Luanda
|
||||
AQ -7750+16636 Antarctica/McMurdo New Zealand time - McMurdo, South Pole
|
||||
AQ -6617+11031 Antarctica/Casey Casey
|
||||
AQ -6835+07758 Antarctica/Davis Davis
|
||||
AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville
|
||||
AQ -6736+06253 Antarctica/Mawson Mawson
|
||||
AQ -6448-06406 Antarctica/Palmer Palmer
|
||||
AQ -6734-06808 Antarctica/Rothera Rothera
|
||||
AQ -690022+0393524 Antarctica/Syowa Syowa
|
||||
AQ -720041+0023206 Antarctica/Troll Troll
|
||||
AQ -7824+10654 Antarctica/Vostok Vostok
|
||||
AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF)
|
||||
AR -3124-06411 America/Argentina/Cordoba Argentina (most areas: CB, CC, CN, ER, FM, MN, SE, SF)
|
||||
AR -2447-06525 America/Argentina/Salta Salta (SA, LP, NQ, RN)
|
||||
AR -2411-06518 America/Argentina/Jujuy Jujuy (JY)
|
||||
AR -2649-06513 America/Argentina/Tucuman Tucuman (TM)
|
||||
AR -2828-06547 America/Argentina/Catamarca Catamarca (CT), Chubut (CH)
|
||||
AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR)
|
||||
AR -3132-06831 America/Argentina/San_Juan San Juan (SJ)
|
||||
AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ)
|
||||
AR -3319-06621 America/Argentina/San_Luis San Luis (SL)
|
||||
AR -5138-06913 America/Argentina/Rio_Gallegos Santa Cruz (SC)
|
||||
AR -5448-06818 America/Argentina/Ushuaia Tierra del Fuego (TF)
|
||||
AS -1416-17042 Pacific/Pago_Pago
|
||||
AT +4813+01620 Europe/Vienna
|
||||
AU -3133+15905 Australia/Lord_Howe Lord Howe Island
|
||||
AU -5430+15857 Antarctica/Macquarie Macquarie Island
|
||||
AU -4253+14719 Australia/Hobart Tasmania
|
||||
AU -3749+14458 Australia/Melbourne Victoria
|
||||
AU -3352+15113 Australia/Sydney New South Wales (most areas)
|
||||
AU -3157+14127 Australia/Broken_Hill New South Wales (Yancowinna)
|
||||
AU -2728+15302 Australia/Brisbane Queensland (most areas)
|
||||
AU -2016+14900 Australia/Lindeman Queensland (Whitsunday Islands)
|
||||
AU -3455+13835 Australia/Adelaide South Australia
|
||||
AU -1228+13050 Australia/Darwin Northern Territory
|
||||
AU -3157+11551 Australia/Perth Western Australia (most areas)
|
||||
AU -3143+12852 Australia/Eucla Western Australia (Eucla)
|
||||
AW +1230-06958 America/Aruba
|
||||
AX +6006+01957 Europe/Mariehamn
|
||||
AZ +4023+04951 Asia/Baku
|
||||
BA +4352+01825 Europe/Sarajevo
|
||||
BB +1306-05937 America/Barbados
|
||||
BD +2343+09025 Asia/Dhaka
|
||||
BE +5050+00420 Europe/Brussels
|
||||
BF +1222-00131 Africa/Ouagadougou
|
||||
BG +4241+02319 Europe/Sofia
|
||||
BH +2623+05035 Asia/Bahrain
|
||||
BI -0323+02922 Africa/Bujumbura
|
||||
BJ +0629+00237 Africa/Porto-Novo
|
||||
BL +1753-06251 America/St_Barthelemy
|
||||
BM +3217-06446 Atlantic/Bermuda
|
||||
BN +0456+11455 Asia/Brunei
|
||||
BO -1630-06809 America/La_Paz
|
||||
BQ +120903-0681636 America/Kralendijk
|
||||
BR -0351-03225 America/Noronha Atlantic islands
|
||||
BR -0127-04829 America/Belem Para (east), Amapa
|
||||
BR -0343-03830 America/Fortaleza Brazil (northeast: MA, PI, CE, RN, PB)
|
||||
BR -0803-03454 America/Recife Pernambuco
|
||||
BR -0712-04812 America/Araguaina Tocantins
|
||||
BR -0940-03543 America/Maceio Alagoas, Sergipe
|
||||
BR -1259-03831 America/Bahia Bahia
|
||||
BR -2332-04637 America/Sao_Paulo Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS)
|
||||
BR -2027-05437 America/Campo_Grande Mato Grosso do Sul
|
||||
BR -1535-05605 America/Cuiaba Mato Grosso
|
||||
BR -0226-05452 America/Santarem Para (west)
|
||||
BR -0846-06354 America/Porto_Velho Rondonia
|
||||
BR +0249-06040 America/Boa_Vista Roraima
|
||||
BR -0308-06001 America/Manaus Amazonas (east)
|
||||
BR -0640-06952 America/Eirunepe Amazonas (west)
|
||||
BR -0958-06748 America/Rio_Branco Acre
|
||||
BS +2505-07721 America/Nassau
|
||||
BT +2728+08939 Asia/Thimphu
|
||||
BW -2439+02555 Africa/Gaborone
|
||||
BY +5354+02734 Europe/Minsk
|
||||
BZ +1730-08812 America/Belize
|
||||
CA +4734-05243 America/St_Johns Newfoundland, Labrador (SE)
|
||||
CA +4439-06336 America/Halifax Atlantic - NS (most areas), PE
|
||||
CA +4612-05957 America/Glace_Bay Atlantic - NS (Cape Breton)
|
||||
CA +4606-06447 America/Moncton Atlantic - New Brunswick
|
||||
CA +5320-06025 America/Goose_Bay Atlantic - Labrador (most areas)
|
||||
CA +5125-05707 America/Blanc-Sablon AST - QC (Lower North Shore)
|
||||
CA +4339-07923 America/Toronto Eastern - ON & QC (most areas)
|
||||
CA +6344-06828 America/Iqaluit Eastern - NU (most areas)
|
||||
CA +484531-0913718 America/Atikokan EST - ON (Atikokan), NU (Coral H)
|
||||
CA +4953-09709 America/Winnipeg Central - ON (west), Manitoba
|
||||
CA +744144-0944945 America/Resolute Central - NU (Resolute)
|
||||
CA +624900-0920459 America/Rankin_Inlet Central - NU (central)
|
||||
CA +5024-10439 America/Regina CST - SK (most areas)
|
||||
CA +5017-10750 America/Swift_Current CST - SK (midwest)
|
||||
CA +5333-11328 America/Edmonton Mountain - AB, BC(E), NT(E), SK(W)
|
||||
CA +690650-1050310 America/Cambridge_Bay Mountain - NU (west)
|
||||
CA +682059-1334300 America/Inuvik Mountain - NT (west)
|
||||
CA +4906-11631 America/Creston MST - BC (Creston)
|
||||
CA +5546-12014 America/Dawson_Creek MST - BC (Dawson Cr, Ft St John)
|
||||
CA +5848-12242 America/Fort_Nelson MST - BC (Ft Nelson)
|
||||
CA +6043-13503 America/Whitehorse MST - Yukon (east)
|
||||
CA +6404-13925 America/Dawson MST - Yukon (west)
|
||||
CA +4916-12307 America/Vancouver Pacific - BC (most areas)
|
||||
CC -1210+09655 Indian/Cocos
|
||||
CD -0418+01518 Africa/Kinshasa Dem. Rep. of Congo (west)
|
||||
CD -1140+02728 Africa/Lubumbashi Dem. Rep. of Congo (east)
|
||||
CF +0422+01835 Africa/Bangui
|
||||
CG -0416+01517 Africa/Brazzaville
|
||||
CH +4723+00832 Europe/Zurich
|
||||
CI +0519-00402 Africa/Abidjan
|
||||
CK -2114-15946 Pacific/Rarotonga
|
||||
CL -3327-07040 America/Santiago most of Chile
|
||||
CL -5309-07055 America/Punta_Arenas Region of Magallanes
|
||||
CL -2709-10926 Pacific/Easter Easter Island
|
||||
CM +0403+00942 Africa/Douala
|
||||
CN +3114+12128 Asia/Shanghai Beijing Time
|
||||
CN +4348+08735 Asia/Urumqi Xinjiang Time
|
||||
CO +0436-07405 America/Bogota
|
||||
CR +0956-08405 America/Costa_Rica
|
||||
CU +2308-08222 America/Havana
|
||||
CV +1455-02331 Atlantic/Cape_Verde
|
||||
CW +1211-06900 America/Curacao
|
||||
CX -1025+10543 Indian/Christmas
|
||||
CY +3510+03322 Asia/Nicosia most of Cyprus
|
||||
CY +3507+03357 Asia/Famagusta Northern Cyprus
|
||||
CZ +5005+01426 Europe/Prague
|
||||
DE +5230+01322 Europe/Berlin most of Germany
|
||||
DE +4742+00841 Europe/Busingen Busingen
|
||||
DJ +1136+04309 Africa/Djibouti
|
||||
DK +5540+01235 Europe/Copenhagen
|
||||
DM +1518-06124 America/Dominica
|
||||
DO +1828-06954 America/Santo_Domingo
|
||||
DZ +3647+00303 Africa/Algiers
|
||||
EC -0210-07950 America/Guayaquil Ecuador (mainland)
|
||||
EC -0054-08936 Pacific/Galapagos Galapagos Islands
|
||||
EE +5925+02445 Europe/Tallinn
|
||||
EG +3003+03115 Africa/Cairo
|
||||
EH +2709-01312 Africa/El_Aaiun
|
||||
ER +1520+03853 Africa/Asmara
|
||||
ES +4024-00341 Europe/Madrid Spain (mainland)
|
||||
ES +3553-00519 Africa/Ceuta Ceuta, Melilla
|
||||
ES +2806-01524 Atlantic/Canary Canary Islands
|
||||
ET +0902+03842 Africa/Addis_Ababa
|
||||
FI +6010+02458 Europe/Helsinki
|
||||
FJ -1808+17825 Pacific/Fiji
|
||||
FK -5142-05751 Atlantic/Stanley
|
||||
FM +0725+15147 Pacific/Chuuk Chuuk/Truk, Yap
|
||||
FM +0658+15813 Pacific/Pohnpei Pohnpei/Ponape
|
||||
FM +0519+16259 Pacific/Kosrae Kosrae
|
||||
FO +6201-00646 Atlantic/Faroe
|
||||
FR +4852+00220 Europe/Paris
|
||||
GA +0023+00927 Africa/Libreville
|
||||
GB +513030-0000731 Europe/London
|
||||
GD +1203-06145 America/Grenada
|
||||
GE +4143+04449 Asia/Tbilisi
|
||||
GF +0456-05220 America/Cayenne
|
||||
GG +492717-0023210 Europe/Guernsey
|
||||
GH +0533-00013 Africa/Accra
|
||||
GI +3608-00521 Europe/Gibraltar
|
||||
GL +6411-05144 America/Nuuk most of Greenland
|
||||
GL +7646-01840 America/Danmarkshavn National Park (east coast)
|
||||
GL +7029-02158 America/Scoresbysund Scoresbysund/Ittoqqortoormiit
|
||||
GL +7634-06847 America/Thule Thule/Pituffik
|
||||
GM +1328-01639 Africa/Banjul
|
||||
GN +0931-01343 Africa/Conakry
|
||||
GP +1614-06132 America/Guadeloupe
|
||||
GQ +0345+00847 Africa/Malabo
|
||||
GR +3758+02343 Europe/Athens
|
||||
GS -5416-03632 Atlantic/South_Georgia
|
||||
GT +1438-09031 America/Guatemala
|
||||
GU +1328+14445 Pacific/Guam
|
||||
GW +1151-01535 Africa/Bissau
|
||||
GY +0648-05810 America/Guyana
|
||||
HK +2217+11409 Asia/Hong_Kong
|
||||
HN +1406-08713 America/Tegucigalpa
|
||||
HR +4548+01558 Europe/Zagreb
|
||||
HT +1832-07220 America/Port-au-Prince
|
||||
HU +4730+01905 Europe/Budapest
|
||||
ID -0610+10648 Asia/Jakarta Java, Sumatra
|
||||
ID -0002+10920 Asia/Pontianak Borneo (west, central)
|
||||
ID -0507+11924 Asia/Makassar Borneo (east, south), Sulawesi/Celebes, Bali, Nusa Tengarra, Timor (west)
|
||||
ID -0232+14042 Asia/Jayapura New Guinea (West Papua / Irian Jaya), Malukus/Moluccas
|
||||
IE +5320-00615 Europe/Dublin
|
||||
IL +314650+0351326 Asia/Jerusalem
|
||||
IM +5409-00428 Europe/Isle_of_Man
|
||||
IN +2232+08822 Asia/Kolkata
|
||||
IO -0720+07225 Indian/Chagos
|
||||
IQ +3321+04425 Asia/Baghdad
|
||||
IR +3540+05126 Asia/Tehran
|
||||
IS +6409-02151 Atlantic/Reykjavik
|
||||
IT +4154+01229 Europe/Rome
|
||||
JE +491101-0020624 Europe/Jersey
|
||||
JM +175805-0764736 America/Jamaica
|
||||
JO +3157+03556 Asia/Amman
|
||||
JP +353916+1394441 Asia/Tokyo
|
||||
KE -0117+03649 Africa/Nairobi
|
||||
KG +4254+07436 Asia/Bishkek
|
||||
KH +1133+10455 Asia/Phnom_Penh
|
||||
KI +0125+17300 Pacific/Tarawa Gilbert Islands
|
||||
KI -0247-17143 Pacific/Kanton Phoenix Islands
|
||||
KI +0152-15720 Pacific/Kiritimati Line Islands
|
||||
KM -1141+04316 Indian/Comoro
|
||||
KN +1718-06243 America/St_Kitts
|
||||
KP +3901+12545 Asia/Pyongyang
|
||||
KR +3733+12658 Asia/Seoul
|
||||
KW +2920+04759 Asia/Kuwait
|
||||
KY +1918-08123 America/Cayman
|
||||
KZ +4315+07657 Asia/Almaty most of Kazakhstan
|
||||
KZ +4448+06528 Asia/Qyzylorda Qyzylorda/Kyzylorda/Kzyl-Orda
|
||||
KZ +5312+06337 Asia/Qostanay Qostanay/Kostanay/Kustanay
|
||||
KZ +5017+05710 Asia/Aqtobe Aqtobe/Aktobe
|
||||
KZ +4431+05016 Asia/Aqtau Mangghystau/Mankistau
|
||||
KZ +4707+05156 Asia/Atyrau Atyrau/Atirau/Gur'yev
|
||||
KZ +5113+05121 Asia/Oral West Kazakhstan
|
||||
LA +1758+10236 Asia/Vientiane
|
||||
LB +3353+03530 Asia/Beirut
|
||||
LC +1401-06100 America/St_Lucia
|
||||
LI +4709+00931 Europe/Vaduz
|
||||
LK +0656+07951 Asia/Colombo
|
||||
LR +0618-01047 Africa/Monrovia
|
||||
LS -2928+02730 Africa/Maseru
|
||||
LT +5441+02519 Europe/Vilnius
|
||||
LU +4936+00609 Europe/Luxembourg
|
||||
LV +5657+02406 Europe/Riga
|
||||
LY +3254+01311 Africa/Tripoli
|
||||
MA +3339-00735 Africa/Casablanca
|
||||
MC +4342+00723 Europe/Monaco
|
||||
MD +4700+02850 Europe/Chisinau
|
||||
ME +4226+01916 Europe/Podgorica
|
||||
MF +1804-06305 America/Marigot
|
||||
MG -1855+04731 Indian/Antananarivo
|
||||
MH +0709+17112 Pacific/Majuro most of Marshall Islands
|
||||
MH +0905+16720 Pacific/Kwajalein Kwajalein
|
||||
MK +4159+02126 Europe/Skopje
|
||||
ML +1239-00800 Africa/Bamako
|
||||
MM +1647+09610 Asia/Yangon
|
||||
MN +4755+10653 Asia/Ulaanbaatar most of Mongolia
|
||||
MN +4801+09139 Asia/Hovd Bayan-Olgii, Hovd, Uvs
|
||||
MO +221150+1133230 Asia/Macau
|
||||
MP +1512+14545 Pacific/Saipan
|
||||
MQ +1436-06105 America/Martinique
|
||||
MR +1806-01557 Africa/Nouakchott
|
||||
MS +1643-06213 America/Montserrat
|
||||
MT +3554+01431 Europe/Malta
|
||||
MU -2010+05730 Indian/Mauritius
|
||||
MV +0410+07330 Indian/Maldives
|
||||
MW -1547+03500 Africa/Blantyre
|
||||
MX +1924-09909 America/Mexico_City Central Mexico
|
||||
MX +2105-08646 America/Cancun Quintana Roo
|
||||
MX +2058-08937 America/Merida Campeche, Yucatan
|
||||
MX +2540-10019 America/Monterrey Durango; Coahuila, Nuevo Leon, Tamaulipas (most areas)
|
||||
MX +2550-09730 America/Matamoros Coahuila, Nuevo Leon, Tamaulipas (US border)
|
||||
MX +2838-10605 America/Chihuahua Chihuahua (most areas)
|
||||
MX +3144-10629 America/Ciudad_Juarez Chihuahua (US border - west)
|
||||
MX +2934-10425 America/Ojinaga Chihuahua (US border - east)
|
||||
MX +2313-10625 America/Mazatlan Baja California Sur, Nayarit (most areas), Sinaloa
|
||||
MX +2048-10515 America/Bahia_Banderas Bahia de Banderas
|
||||
MX +2904-11058 America/Hermosillo Sonora
|
||||
MX +3232-11701 America/Tijuana Baja California
|
||||
MY +0310+10142 Asia/Kuala_Lumpur Malaysia (peninsula)
|
||||
MY +0133+11020 Asia/Kuching Sabah, Sarawak
|
||||
MZ -2558+03235 Africa/Maputo
|
||||
NA -2234+01706 Africa/Windhoek
|
||||
NC -2216+16627 Pacific/Noumea
|
||||
NE +1331+00207 Africa/Niamey
|
||||
NF -2903+16758 Pacific/Norfolk
|
||||
NG +0627+00324 Africa/Lagos
|
||||
NI +1209-08617 America/Managua
|
||||
NL +5222+00454 Europe/Amsterdam
|
||||
NO +5955+01045 Europe/Oslo
|
||||
NP +2743+08519 Asia/Kathmandu
|
||||
NR -0031+16655 Pacific/Nauru
|
||||
NU -1901-16955 Pacific/Niue
|
||||
NZ -3652+17446 Pacific/Auckland most of New Zealand
|
||||
NZ -4357-17633 Pacific/Chatham Chatham Islands
|
||||
OM +2336+05835 Asia/Muscat
|
||||
PA +0858-07932 America/Panama
|
||||
PE -1203-07703 America/Lima
|
||||
PF -1732-14934 Pacific/Tahiti Society Islands
|
||||
PF -0900-13930 Pacific/Marquesas Marquesas Islands
|
||||
PF -2308-13457 Pacific/Gambier Gambier Islands
|
||||
PG -0930+14710 Pacific/Port_Moresby most of Papua New Guinea
|
||||
PG -0613+15534 Pacific/Bougainville Bougainville
|
||||
PH +1435+12100 Asia/Manila
|
||||
PK +2452+06703 Asia/Karachi
|
||||
PL +5215+02100 Europe/Warsaw
|
||||
PM +4703-05620 America/Miquelon
|
||||
PN -2504-13005 Pacific/Pitcairn
|
||||
PR +182806-0660622 America/Puerto_Rico
|
||||
PS +3130+03428 Asia/Gaza Gaza Strip
|
||||
PS +313200+0350542 Asia/Hebron West Bank
|
||||
PT +3843-00908 Europe/Lisbon Portugal (mainland)
|
||||
PT +3238-01654 Atlantic/Madeira Madeira Islands
|
||||
PT +3744-02540 Atlantic/Azores Azores
|
||||
PW +0720+13429 Pacific/Palau
|
||||
PY -2516-05740 America/Asuncion
|
||||
QA +2517+05132 Asia/Qatar
|
||||
RE -2052+05528 Indian/Reunion
|
||||
RO +4426+02606 Europe/Bucharest
|
||||
RS +4450+02030 Europe/Belgrade
|
||||
RU +5443+02030 Europe/Kaliningrad MSK-01 - Kaliningrad
|
||||
RU +554521+0373704 Europe/Moscow MSK+00 - Moscow area
|
||||
# The obsolescent zone.tab format cannot represent Europe/Simferopol well.
|
||||
# Put it in RU section and list as UA. See "territorial claims" above.
|
||||
# Programs should use zone1970.tab instead; see above.
|
||||
UA +4457+03406 Europe/Simferopol Crimea
|
||||
RU +5836+04939 Europe/Kirov MSK+00 - Kirov
|
||||
RU +4844+04425 Europe/Volgograd MSK+00 - Volgograd
|
||||
RU +4621+04803 Europe/Astrakhan MSK+01 - Astrakhan
|
||||
RU +5134+04602 Europe/Saratov MSK+01 - Saratov
|
||||
RU +5420+04824 Europe/Ulyanovsk MSK+01 - Ulyanovsk
|
||||
RU +5312+05009 Europe/Samara MSK+01 - Samara, Udmurtia
|
||||
RU +5651+06036 Asia/Yekaterinburg MSK+02 - Urals
|
||||
RU +5500+07324 Asia/Omsk MSK+03 - Omsk
|
||||
RU +5502+08255 Asia/Novosibirsk MSK+04 - Novosibirsk
|
||||
RU +5322+08345 Asia/Barnaul MSK+04 - Altai
|
||||
RU +5630+08458 Asia/Tomsk MSK+04 - Tomsk
|
||||
RU +5345+08707 Asia/Novokuznetsk MSK+04 - Kemerovo
|
||||
RU +5601+09250 Asia/Krasnoyarsk MSK+04 - Krasnoyarsk area
|
||||
RU +5216+10420 Asia/Irkutsk MSK+05 - Irkutsk, Buryatia
|
||||
RU +5203+11328 Asia/Chita MSK+06 - Zabaykalsky
|
||||
RU +6200+12940 Asia/Yakutsk MSK+06 - Lena River
|
||||
RU +623923+1353314 Asia/Khandyga MSK+06 - Tomponsky, Ust-Maysky
|
||||
RU +4310+13156 Asia/Vladivostok MSK+07 - Amur River
|
||||
RU +643337+1431336 Asia/Ust-Nera MSK+07 - Oymyakonsky
|
||||
RU +5934+15048 Asia/Magadan MSK+08 - Magadan
|
||||
RU +4658+14242 Asia/Sakhalin MSK+08 - Sakhalin Island
|
||||
RU +6728+15343 Asia/Srednekolymsk MSK+08 - Sakha (E), N Kuril Is
|
||||
RU +5301+15839 Asia/Kamchatka MSK+09 - Kamchatka
|
||||
RU +6445+17729 Asia/Anadyr MSK+09 - Bering Sea
|
||||
RW -0157+03004 Africa/Kigali
|
||||
SA +2438+04643 Asia/Riyadh
|
||||
SB -0932+16012 Pacific/Guadalcanal
|
||||
SC -0440+05528 Indian/Mahe
|
||||
SD +1536+03232 Africa/Khartoum
|
||||
SE +5920+01803 Europe/Stockholm
|
||||
SG +0117+10351 Asia/Singapore
|
||||
SH -1555-00542 Atlantic/St_Helena
|
||||
SI +4603+01431 Europe/Ljubljana
|
||||
SJ +7800+01600 Arctic/Longyearbyen
|
||||
SK +4809+01707 Europe/Bratislava
|
||||
SL +0830-01315 Africa/Freetown
|
||||
SM +4355+01228 Europe/San_Marino
|
||||
SN +1440-01726 Africa/Dakar
|
||||
SO +0204+04522 Africa/Mogadishu
|
||||
SR +0550-05510 America/Paramaribo
|
||||
SS +0451+03137 Africa/Juba
|
||||
ST +0020+00644 Africa/Sao_Tome
|
||||
SV +1342-08912 America/El_Salvador
|
||||
SX +180305-0630250 America/Lower_Princes
|
||||
SY +3330+03618 Asia/Damascus
|
||||
SZ -2618+03106 Africa/Mbabane
|
||||
TC +2128-07108 America/Grand_Turk
|
||||
TD +1207+01503 Africa/Ndjamena
|
||||
TF -492110+0701303 Indian/Kerguelen
|
||||
TG +0608+00113 Africa/Lome
|
||||
TH +1345+10031 Asia/Bangkok
|
||||
TJ +3835+06848 Asia/Dushanbe
|
||||
TK -0922-17114 Pacific/Fakaofo
|
||||
TL -0833+12535 Asia/Dili
|
||||
TM +3757+05823 Asia/Ashgabat
|
||||
TN +3648+01011 Africa/Tunis
|
||||
TO -210800-1751200 Pacific/Tongatapu
|
||||
TR +4101+02858 Europe/Istanbul
|
||||
TT +1039-06131 America/Port_of_Spain
|
||||
TV -0831+17913 Pacific/Funafuti
|
||||
TW +2503+12130 Asia/Taipei
|
||||
TZ -0648+03917 Africa/Dar_es_Salaam
|
||||
UA +5026+03031 Europe/Kyiv most of Ukraine
|
||||
UG +0019+03225 Africa/Kampala
|
||||
UM +2813-17722 Pacific/Midway Midway Islands
|
||||
UM +1917+16637 Pacific/Wake Wake Island
|
||||
US +404251-0740023 America/New_York Eastern (most areas)
|
||||
US +421953-0830245 America/Detroit Eastern - MI (most areas)
|
||||
US +381515-0854534 America/Kentucky/Louisville Eastern - KY (Louisville area)
|
||||
US +364947-0845057 America/Kentucky/Monticello Eastern - KY (Wayne)
|
||||
US +394606-0860929 America/Indiana/Indianapolis Eastern - IN (most areas)
|
||||
US +384038-0873143 America/Indiana/Vincennes Eastern - IN (Da, Du, K, Mn)
|
||||
US +410305-0863611 America/Indiana/Winamac Eastern - IN (Pulaski)
|
||||
US +382232-0862041 America/Indiana/Marengo Eastern - IN (Crawford)
|
||||
US +382931-0871643 America/Indiana/Petersburg Eastern - IN (Pike)
|
||||
US +384452-0850402 America/Indiana/Vevay Eastern - IN (Switzerland)
|
||||
US +415100-0873900 America/Chicago Central (most areas)
|
||||
US +375711-0864541 America/Indiana/Tell_City Central - IN (Perry)
|
||||
US +411745-0863730 America/Indiana/Knox Central - IN (Starke)
|
||||
US +450628-0873651 America/Menominee Central - MI (Wisconsin border)
|
||||
US +470659-1011757 America/North_Dakota/Center Central - ND (Oliver)
|
||||
US +465042-1012439 America/North_Dakota/New_Salem Central - ND (Morton rural)
|
||||
US +471551-1014640 America/North_Dakota/Beulah Central - ND (Mercer)
|
||||
US +394421-1045903 America/Denver Mountain (most areas)
|
||||
US +433649-1161209 America/Boise Mountain - ID (south), OR (east)
|
||||
US +332654-1120424 America/Phoenix MST - AZ (except Navajo)
|
||||
US +340308-1181434 America/Los_Angeles Pacific
|
||||
US +611305-1495401 America/Anchorage Alaska (most areas)
|
||||
US +581807-1342511 America/Juneau Alaska - Juneau area
|
||||
US +571035-1351807 America/Sitka Alaska - Sitka area
|
||||
US +550737-1313435 America/Metlakatla Alaska - Annette Island
|
||||
US +593249-1394338 America/Yakutat Alaska - Yakutat
|
||||
US +643004-1652423 America/Nome Alaska (west)
|
||||
US +515248-1763929 America/Adak Alaska - western Aleutians
|
||||
US +211825-1575130 Pacific/Honolulu Hawaii
|
||||
UY -345433-0561245 America/Montevideo
|
||||
UZ +3940+06648 Asia/Samarkand Uzbekistan (west)
|
||||
UZ +4120+06918 Asia/Tashkent Uzbekistan (east)
|
||||
VA +415408+0122711 Europe/Vatican
|
||||
VC +1309-06114 America/St_Vincent
|
||||
VE +1030-06656 America/Caracas
|
||||
VG +1827-06437 America/Tortola
|
||||
VI +1821-06456 America/St_Thomas
|
||||
VN +1045+10640 Asia/Ho_Chi_Minh
|
||||
VU -1740+16825 Pacific/Efate
|
||||
WF -1318-17610 Pacific/Wallis
|
||||
WS -1350-17144 Pacific/Apia
|
||||
YE +1245+04512 Asia/Aden
|
||||
YT -1247+04514 Indian/Mayotte
|
||||
ZA -2615+02800 Africa/Johannesburg
|
||||
ZM -1525+02817 Africa/Lusaka
|
||||
ZW -1750+03103 Africa/Harare
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2008, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2008, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -33,8 +33,7 @@
|
||||
TZDATA = ../../../../../../../src/java.base/share/data/tzdata
|
||||
TZDATA_VER = `grep '^tzdata' $(TZDATA)/VERSION`
|
||||
TZNAME = africa antarctica asia australasia europe northamerica \
|
||||
solar87 solar88 solar89 southamerica \
|
||||
backward
|
||||
southamerica backward
|
||||
TZFILES = $(addprefix $(TZDATA)/, $(TZNAME))
|
||||
ALIASLIST = aliases.txt
|
||||
DISPLAYNAMES = displaynames.txt
|
||||
|
@ -1,66 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* <code>BackEnd</code> is an abstract base class for a back-end of compiling
|
||||
* Olson's zoneinfo database and generating Java zoneinfo database.
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
abstract class BackEnd {
|
||||
|
||||
/**
|
||||
* Receives each zone's TimeZone information which was created by
|
||||
* {@link Zoneinfo#parse} in class <code>Zoneinfo</code>,
|
||||
* and processes it.
|
||||
*
|
||||
* @param tz Timezone object for each zone
|
||||
* @return 0 if no error occurred, otherwise 1.
|
||||
*/
|
||||
abstract int processZoneinfo(Timezone tz);
|
||||
|
||||
/**
|
||||
* Receives whole information which is generated by JavaZic's front-end
|
||||
* in the form of Mapping object and generates all Java zone information
|
||||
* files.
|
||||
*
|
||||
* @param m Mappings object which is generated by
|
||||
* {@link Main#compile() Main.compile()}.
|
||||
* @return 0 if no error occurred, otherwise 1.
|
||||
*/
|
||||
abstract int generateSrc(Mappings m);
|
||||
|
||||
/**
|
||||
* Decides which backend class should be used and returns its instance.
|
||||
* @return an instance of backend class
|
||||
*/
|
||||
static BackEnd getBackEnd() {
|
||||
if (Zoneinfo.isYearForTimeZoneDataSpecified) {
|
||||
return new Simple();
|
||||
} else if (Main.outputDoc) {
|
||||
return new GenDoc();
|
||||
} else {
|
||||
return new Gen();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,73 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8073446 8262110
|
||||
* @summary Tests DST related beyond the year 2037
|
||||
* @run testng Beyond2037
|
||||
*/
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import org.testng.annotations.DataProvider;
|
||||
import org.testng.annotations.Test;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
@Test
|
||||
public class Beyond2037 {
|
||||
|
||||
@DataProvider
|
||||
Object[][] dstTransition() {
|
||||
return new Object[][] {
|
||||
{"2037/03/08 01:59:59:999", "2037/03/08 01:59:59:999"},
|
||||
{"2037/03/08 02:00:00:000", "2037/03/08 03:00:00:000"},
|
||||
{"2038/03/14 01:59:59:999", "2038/03/14 01:59:59:999"},
|
||||
{"2038/03/14 02:00:00:000", "2038/03/14 03:00:00:000"},
|
||||
{"2099/03/08 01:59:59:999", "2099/03/08 01:59:59:999"},
|
||||
{"2099/03/08 02:00:00:000", "2099/03/08 03:00:00:000"},
|
||||
{"2100/03/14 01:59:59:999", "2100/03/14 01:59:59:999"},
|
||||
{"2100/03/14 02:00:00:000", "2100/03/14 03:00:00:000"},
|
||||
{"8000/03/12 01:59:59:999", "8000/03/12 01:59:59:999"},
|
||||
{"8000/03/12 02:00:00:000", "8000/03/12 03:00:00:000"},
|
||||
};
|
||||
}
|
||||
|
||||
@Test(dataProvider="dstTransition")
|
||||
public void testDstTransition(String source, String expected) throws Exception {
|
||||
var timeZone = TimeZone.getTimeZone("America/New_York");
|
||||
var sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:SSS" );
|
||||
sdf.setTimeZone(timeZone);
|
||||
assertEquals(sdf.format(sdf.parse(source)), expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetOffset() throws Exception {
|
||||
var timeZone = TimeZone.getTimeZone("PST8PDT");
|
||||
var df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
df.setTimeZone(timeZone);
|
||||
var tMilli = df.parse("7681-03-09 03:20:49").getTime();
|
||||
assertEquals(timeZone.getOffset(tMilli), -25200000);
|
||||
}
|
||||
}
|
@ -1,65 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.util.zip.CRC32;
|
||||
|
||||
/**
|
||||
* Checksum provides methods for calculating a CRC32 value for a
|
||||
* transitions table.
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
public class Checksum extends CRC32
|
||||
{
|
||||
/**
|
||||
* Updates the CRC32 value from each byte of the given int
|
||||
* value. The bytes are used in the big endian order.
|
||||
* @param val the int value
|
||||
*/
|
||||
public void update(int val) {
|
||||
byte[] b = new byte[4];
|
||||
b[0] = (byte)((val >>> 24) & 0xff);
|
||||
b[1] = (byte)((val >>> 16) & 0xff);
|
||||
b[2] = (byte)((val >>> 8) & 0xff);
|
||||
b[3] = (byte)(val & 0xff);
|
||||
update(b);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the CRC32 value from each byte of the given long
|
||||
* value. The bytes are used in the big endian order.
|
||||
* @param val the long value
|
||||
*/
|
||||
void update(long val) {
|
||||
byte[] b = new byte[8];
|
||||
b[0] = (byte)((val >>> 56) & 0xff);
|
||||
b[1] = (byte)((val >>> 48) & 0xff);
|
||||
b[2] = (byte)((val >>> 40) & 0xff);
|
||||
b[3] = (byte)((val >>> 32) & 0xff);
|
||||
b[4] = (byte)((val >>> 24) & 0xff);
|
||||
b[5] = (byte)((val >>> 16) & 0xff);
|
||||
b[6] = (byte)((val >>> 8) & 0xff);
|
||||
b[7] = (byte)(val & 0xff);
|
||||
update(b);
|
||||
}
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Day of week enum.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
|
||||
enum DayOfWeek {
|
||||
SUNDAY("Sun"),
|
||||
MONDAY("Mon"),
|
||||
TUESDAY("Tue"),
|
||||
WEDNESDAY("Wed"),
|
||||
THURSDAY("Thu"),
|
||||
FRIDAY("Fri"),
|
||||
SATURDAY("Sat");
|
||||
|
||||
private final String abbr;
|
||||
|
||||
private DayOfWeek(String abbr) {
|
||||
this.abbr = abbr;
|
||||
}
|
||||
|
||||
String getAbbr() {
|
||||
return abbr;
|
||||
}
|
||||
|
||||
int value() {
|
||||
return ordinal() + 1;
|
||||
}
|
||||
}
|
@ -1,342 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* <code>Gen</code> is one of back-end classes of javazic, and generates
|
||||
* ZoneInfoMappings and zone-specific file for each zone.
|
||||
*/
|
||||
class Gen extends BackEnd {
|
||||
|
||||
/**
|
||||
* Generates datafile in binary TLV format for each time zone.
|
||||
* Regarding contents of output files, see {@link ZoneInfoFile}.
|
||||
*
|
||||
* @param Timezone
|
||||
* @return 0 if no errors, or 1 if error occurred.
|
||||
*/
|
||||
int processZoneinfo(Timezone tz) {
|
||||
try {
|
||||
int size;
|
||||
String outputDir = Main.getOutputDir();
|
||||
String zonefile = ZoneInfoFile.getFileName(tz.getName());
|
||||
|
||||
/* If outputDir doesn't end with file-separator, adds it. */
|
||||
if (!outputDir.endsWith(File.separator)) {
|
||||
outputDir += File.separatorChar;
|
||||
}
|
||||
|
||||
/* If zonefile includes file-separator, it's treated as part of
|
||||
* pathname. And make directory if necessary.
|
||||
*/
|
||||
int index = zonefile.lastIndexOf(File.separatorChar);
|
||||
if (index != -1) {
|
||||
outputDir += zonefile.substring(0, index+1);
|
||||
}
|
||||
File outD = new File(outputDir);
|
||||
outD.mkdirs();
|
||||
|
||||
FileOutputStream fos =
|
||||
new FileOutputStream(outputDir + zonefile.substring(index+1));
|
||||
DataOutputStream dos = new DataOutputStream(fos);
|
||||
|
||||
/* Output Label */
|
||||
dos.write(ZoneInfoFile.JAVAZI_LABEL, 0,
|
||||
ZoneInfoFile.JAVAZI_LABEL.length);
|
||||
|
||||
/* Output Version of ZoneInfoFile */
|
||||
dos.writeByte(ZoneInfoFile.JAVAZI_VERSION);
|
||||
|
||||
List<Long> transitions = tz.getTransitions();
|
||||
if (transitions != null) {
|
||||
List<Integer> dstOffsets = tz.getDstOffsets();
|
||||
List<Integer> offsets = tz.getOffsets();
|
||||
|
||||
if ((dstOffsets == null && offsets != null) ||
|
||||
(dstOffsets != null && offsets == null)) {
|
||||
Main.panic("Data not exist. (dstOffsets or offsets)");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Output Transition records */
|
||||
dos.writeByte(ZoneInfoFile.TAG_Transition);
|
||||
size = transitions.size();
|
||||
dos.writeShort((size * 8) & 0xFFFF);
|
||||
int dstoffset;
|
||||
for (int i = 0; i < size; i++) {
|
||||
/* if DST offset is 0, this means DST isn't used.
|
||||
* (NOT: offset's index is 0.)
|
||||
*/
|
||||
if ((dstoffset = dstOffsets.get(i).intValue()) == -1) {
|
||||
dstoffset = 0;
|
||||
}
|
||||
|
||||
dos.writeLong((transitions.get(i).longValue() << 12)
|
||||
| (dstoffset << 4)
|
||||
| offsets.get(i).intValue());
|
||||
|
||||
}
|
||||
|
||||
/* Output data for GMTOffset */
|
||||
List<Integer> gmtoffset = tz.getGmtOffsets();
|
||||
dos.writeByte(ZoneInfoFile.TAG_Offset);
|
||||
size = gmtoffset.size();
|
||||
dos.writeShort((size * 4) & 0xFFFF);
|
||||
for (int i = 0; i < size; i++) {
|
||||
dos.writeInt(gmtoffset.get(i));
|
||||
}
|
||||
}
|
||||
|
||||
/* Output data for SimpleTimeZone */
|
||||
List<RuleRec> stz = tz.getLastRules();
|
||||
if (stz != null) {
|
||||
RuleRec[] rr = new RuleRec[2];
|
||||
boolean wall = true;
|
||||
|
||||
rr[0] = stz.get(0);
|
||||
rr[1] = stz.get(1);
|
||||
|
||||
dos.writeByte(ZoneInfoFile.TAG_SimpleTimeZone);
|
||||
wall = rr[0].getTime().isWall() && rr[1].getTime().isWall();
|
||||
if (wall) {
|
||||
dos.writeShort(32);
|
||||
} else {
|
||||
dos.writeShort(40);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 2; i++) {
|
||||
dos.writeInt(rr[i].getMonthNum() - 1); // 0-based month number
|
||||
dos.writeInt(rr[i].getDay().getDayForSimpleTimeZone());
|
||||
dos.writeInt(rr[i].getDay().getDayOfWeekForSimpleTimeZoneInt());
|
||||
dos.writeInt((int)rr[i].getTime().getTime());
|
||||
if (!wall) {
|
||||
dos.writeInt((rr[i].getTime().getType() & 0xFF) - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Output RawOffset */
|
||||
dos.writeByte(ZoneInfoFile.TAG_RawOffset);
|
||||
dos.writeShort(4);
|
||||
dos.writeInt(tz.getRawOffset());
|
||||
|
||||
/* Output willGMTOffsetChange flag */
|
||||
if (tz.willGMTOffsetChange()) {
|
||||
dos.writeByte(ZoneInfoFile.TAG_GMTOffsetWillChange);
|
||||
dos.writeShort(1);
|
||||
dos.writeByte(1);
|
||||
}
|
||||
|
||||
/* Output LastDSTSaving */
|
||||
dos.writeByte(ZoneInfoFile.TAG_LastDSTSaving);
|
||||
dos.writeShort(2);
|
||||
dos.writeShort(tz.getLastDSTSaving()/1000);
|
||||
|
||||
/* Output checksum */
|
||||
dos.writeByte(ZoneInfoFile.TAG_CRC32);
|
||||
dos.writeShort(4);
|
||||
dos.writeInt(tz.getCRC32());
|
||||
|
||||
fos.close();
|
||||
dos.close();
|
||||
} catch(IOException e) {
|
||||
Main.panic("IO error: "+e.getMessage());
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates ZoneInfoMappings in binary TLV format for each zone.
|
||||
* Regarding contents of output files, see {@link ZoneInfoFile}.
|
||||
*
|
||||
* @param Mappings
|
||||
* @return 0 if no errors, or 1 if error occurred.
|
||||
*/
|
||||
int generateSrc(Mappings map) {
|
||||
try {
|
||||
int index;
|
||||
int block_size;
|
||||
int roi_size;
|
||||
long fp;
|
||||
String outputDir = Main.getOutputDir();
|
||||
|
||||
/* If outputDir doesn't end with file-separator, adds it. */
|
||||
if (!outputDir.endsWith(File.separator)) {
|
||||
outputDir += File.separatorChar;
|
||||
}
|
||||
|
||||
File outD = new File(outputDir);
|
||||
outD.mkdirs();
|
||||
|
||||
/* Open ZoneInfoMapping file to write. */
|
||||
RandomAccessFile raf =
|
||||
new RandomAccessFile(outputDir + ZoneInfoFile.JAVAZM_FILE_NAME, "rw");
|
||||
|
||||
/* Whether rawOffsetIndex list exists or not. */
|
||||
List<Integer> roi = map.getRawOffsetsIndex();
|
||||
if (roi == null) {
|
||||
Main.panic("Data not exist. (rawOffsetsIndex)");
|
||||
return 1;
|
||||
}
|
||||
roi_size = roi.size();
|
||||
|
||||
/* Whether rawOffsetIndexTable list exists or not. */
|
||||
List<Set<String>> roit = map.getRawOffsetsIndexTable();
|
||||
if (roit == null || roit.size() != roi_size) {
|
||||
Main.panic("Data not exist. (rawOffsetsIndexTable) Otherwise, Invalid size");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Output Label */
|
||||
raf.write(ZoneInfoFile.JAVAZM_LABEL, 0,
|
||||
ZoneInfoFile.JAVAZM_LABEL.length);
|
||||
|
||||
/* Output Version */
|
||||
raf.writeByte(ZoneInfoFile.JAVAZM_VERSION);
|
||||
|
||||
index = ZoneInfoFile.JAVAZM_LABEL.length + 2;
|
||||
|
||||
/* Output Version of Olson's tzdata */
|
||||
byte[] b = Main.getVersionName().getBytes("UTF-8");
|
||||
raf.writeByte(ZoneInfoFile.TAG_TZDataVersion);
|
||||
raf.writeShort((b.length+1) & 0xFFFF);
|
||||
raf.write(b);
|
||||
raf.writeByte(0x00);
|
||||
index += b.length + 4;
|
||||
|
||||
/* Output ID list. */
|
||||
raf.writeByte(ZoneInfoFile.TAG_ZoneIDs);
|
||||
block_size = 2;
|
||||
raf.writeShort(block_size & 0xFFFF);
|
||||
short nID = 0;
|
||||
raf.writeShort(nID & 0xFFFF);
|
||||
for (int i = 0; i < roi_size; i++) {
|
||||
for (String key : roit.get(i)) {
|
||||
byte size = (byte)key.getBytes("UTF-8").length;
|
||||
raf.writeByte(size & 0xFF);
|
||||
raf.write(key.getBytes("UTF-8"), 0, size);
|
||||
block_size += 1 + size;
|
||||
nID++;
|
||||
}
|
||||
}
|
||||
fp = raf.getFilePointer();
|
||||
raf.seek(index);
|
||||
raf.writeShort((block_size) & 0xFFFF);
|
||||
raf.writeShort(nID & 0xFFFF);
|
||||
raf.seek(fp);
|
||||
|
||||
/* Output sorted rawOffset list. */
|
||||
raf.writeByte(ZoneInfoFile.TAG_RawOffsets);
|
||||
index += 3 + block_size;
|
||||
block_size = roi_size * 4;
|
||||
raf.writeShort(block_size & 0xFFFF);
|
||||
for (int i = 0; i < roi_size; i++) {
|
||||
raf.writeInt(Integer.parseInt(roi.get(i).toString()));
|
||||
}
|
||||
|
||||
/* Output sorted rawOffsetIndex list. */
|
||||
raf.writeByte(ZoneInfoFile.TAG_RawOffsetIndices);
|
||||
index += 3 + block_size;
|
||||
block_size = 0;
|
||||
raf.writeShort(block_size & 0xFFFF);
|
||||
int num;
|
||||
for (int i = 0; i < roi_size; i++) {
|
||||
num = roit.get(i).size();
|
||||
block_size += num;
|
||||
for (int j = 0; j < num; j++) {
|
||||
raf.writeByte(i);
|
||||
}
|
||||
}
|
||||
fp = raf.getFilePointer();
|
||||
raf.seek(index);
|
||||
raf.writeShort((block_size) & 0xFFFF);
|
||||
raf.seek(fp);
|
||||
|
||||
/* Whether alias list exists or not. */
|
||||
Map<String,String> a = map.getAliases();
|
||||
if (a == null) {
|
||||
Main.panic("Data not exist. (aliases)");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Output ID list. */
|
||||
raf.writeByte(ZoneInfoFile.TAG_ZoneAliases);
|
||||
index += 3 + block_size;
|
||||
block_size = 2;
|
||||
raf.writeShort(block_size & 0xFFFF);
|
||||
raf.writeShort(a.size() & 0xFFFF);
|
||||
for (String key : a.keySet()) {
|
||||
String alias = a.get(key);
|
||||
byte key_size = (byte)key.length();
|
||||
byte alias_size = (byte)alias.length();
|
||||
raf.writeByte(key_size & 0xFF);
|
||||
raf.write(key.getBytes("UTF-8"), 0, key_size);
|
||||
raf.writeByte(alias_size & 0xFF);
|
||||
raf.write(alias.getBytes("UTF-8"), 0, alias_size);
|
||||
block_size += 2 + key_size + alias_size;
|
||||
}
|
||||
fp = raf.getFilePointer();
|
||||
raf.seek(index);
|
||||
raf.writeShort((block_size) & 0xFFFF);
|
||||
raf.seek(fp);
|
||||
|
||||
/* Output the exclude list if it exists. */
|
||||
List<String> excludedZones = map.getExcludeList();
|
||||
if (excludedZones != null) {
|
||||
raf.writeByte(ZoneInfoFile.TAG_ExcludedZones);
|
||||
index += 3 + block_size;
|
||||
block_size = 2;
|
||||
raf.writeShort(block_size & 0xFFFF); // place holder
|
||||
raf.writeShort(excludedZones.size()); // the number of excluded zones
|
||||
for (String name : excludedZones) {
|
||||
byte size = (byte) name.length();
|
||||
raf.writeByte(size); // byte length
|
||||
raf.write(name.getBytes("UTF-8"), 0, size); // zone name
|
||||
block_size += 1 + size;
|
||||
}
|
||||
fp = raf.getFilePointer();
|
||||
raf.seek(index);
|
||||
raf.writeShort(block_size & 0xFFFF);
|
||||
raf.seek(fp);
|
||||
}
|
||||
|
||||
/* Close ZoneInfoMapping file. */
|
||||
raf.close();
|
||||
} catch(IOException e) {
|
||||
Main.panic("IO error: "+e.getMessage());
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
@ -1,776 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.SortedMap;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeMap;
|
||||
import java.util.TreeSet;
|
||||
|
||||
/**
|
||||
* <code>GenDoc</code> is one of back-end classes of javazic, and generates
|
||||
* index.html and other html files which prints the detailed time zone
|
||||
* information for each zone.
|
||||
*/
|
||||
class GenDoc extends BackEnd {
|
||||
|
||||
private static final String docDir = "doc";
|
||||
|
||||
private static final String header1 =
|
||||
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Frameset//EN\"" +
|
||||
"\"http://www.w3.org/TR/REC-html40/frameset.dtd\">\n" +
|
||||
"<HTML>\n<HEAD>\n<!-- Generated by javazic on ";
|
||||
private static final String header2 =
|
||||
"-->\n<TITLE>\n" +
|
||||
"Java Platform, Standard Edition - TimeZone information based on ";
|
||||
private static final String header3 =
|
||||
"-->\n<TITLE>\n" +
|
||||
"Java Platform, Standard Edition TimeZone - ";
|
||||
private static final String header4 =
|
||||
"</TITLE>\n" +
|
||||
"</HEAD>\n\n";
|
||||
|
||||
private static final String body1 =
|
||||
"<BODY BGCOLOR=\"white\">\n";
|
||||
private static final String body2 =
|
||||
"</BODY>\n";
|
||||
|
||||
private static final String footer =
|
||||
"</HTML>\n";
|
||||
|
||||
|
||||
// list of time zone name and zonefile name/real time zone name
|
||||
// e.g.
|
||||
// key (String) : value (String)
|
||||
// "America/Denver" : "America/Denver.html" (real time zone)
|
||||
// "America/Shiprock" : "America/Denver" (alias)
|
||||
TreeMap<String,String> timezoneList = new TreeMap<String,String>();
|
||||
|
||||
// list of time zone's display name and time zone name
|
||||
// e.g.
|
||||
// key (String) : value (String)
|
||||
// "Tokyo, Asia" : "Asia/Tokyo"
|
||||
// "Marengo, Indiana, America" : "America/Indiana/Marengo"
|
||||
// (aliases included)
|
||||
TreeMap<String,String> displayNameList = new TreeMap<String,String>();
|
||||
|
||||
// list of top level regions
|
||||
// e.g.
|
||||
// key (String) : value (String)
|
||||
// "America" : "America.html"
|
||||
// (including entries in America/Indiana/, America/Kentucky/, ...)
|
||||
TreeMap<String,String> regionList = new TreeMap<String,String>();
|
||||
|
||||
// mapping list from zone name to latitude & longitude
|
||||
// This list is generated from zone.tab.
|
||||
// e.g.
|
||||
// key (String) : value (LatitudeAndLongitude object)
|
||||
// "Asia/Tokyo" : latitude=35.3916, longitude=13.9444
|
||||
// (aliases not included)
|
||||
HashMap<String,LatitudeAndLongitude> mapList = null;
|
||||
|
||||
// SortedMap of zone IDs sorted by their GMT offsets. If zone's GMT
|
||||
// offset will change in the future, its last known offset is
|
||||
// used.
|
||||
SortedMap<Integer, Set<String>> zonesByOffset = new TreeMap<Integer, Set<String>>();
|
||||
|
||||
/**
|
||||
* Generates HTML document for each zone.
|
||||
* @param Timezone
|
||||
* @return 0 if no errors, or 1 if error occurred.
|
||||
*/
|
||||
int processZoneinfo(Timezone tz) {
|
||||
try {
|
||||
int size;
|
||||
int index;
|
||||
String outputDir = Main.getOutputDir();
|
||||
String zonename = tz.getName();
|
||||
String zonefile = ZoneInfoFile.getFileName(zonename) + ".html";
|
||||
List<RuleRec> stz = tz.getLastRules();
|
||||
timezoneList.put(zonename, zonefile);
|
||||
displayNameList.put(transform(zonename), zonename);
|
||||
|
||||
// Populate zonesByOffset. (Zones that will change their
|
||||
// GMT offsets are also added to zonesByOffset here.)
|
||||
int lastKnownOffset = tz.getRawOffset();
|
||||
Set<String> set = zonesByOffset.get(lastKnownOffset);
|
||||
if (set == null) {
|
||||
set = new TreeSet<String>();
|
||||
zonesByOffset.put(lastKnownOffset, set);
|
||||
}
|
||||
set.add(zonename);
|
||||
|
||||
/* If outputDir doesn't end with file-separator, adds it. */
|
||||
if (!outputDir.endsWith(File.separator)) {
|
||||
outputDir += File.separatorChar;
|
||||
}
|
||||
outputDir += docDir + File.separatorChar;
|
||||
|
||||
index = zonename.indexOf('/');
|
||||
if (index != -1) {
|
||||
regionList.put(zonename.substring(0, index),
|
||||
zonename.substring(0, index) + ".html");
|
||||
}
|
||||
|
||||
/* If zonefile includes file-separator, it's treated as part of
|
||||
* pathname. And make directory if necessary.
|
||||
*/
|
||||
index = zonefile.lastIndexOf('/');
|
||||
if (index != -1) {
|
||||
zonefile.replace('/', File.separatorChar);
|
||||
outputDir += zonefile.substring(0, index+1);
|
||||
}
|
||||
File outD = new File(outputDir);
|
||||
outD.mkdirs();
|
||||
|
||||
/* If mapfile is available, add a link to the appropriate map */
|
||||
if (mapList == null && Main.getMapFile() != null) {
|
||||
mapList = new HashMap<String, LatitudeAndLongitude>();
|
||||
FileReader fr = new FileReader(Main.getMapFile());
|
||||
BufferedReader in = new BufferedReader(fr);
|
||||
String line;
|
||||
while ((line = in.readLine()) != null) {
|
||||
// skip blank and comment lines
|
||||
if (line.length() == 0 || line.charAt(0) == '#') {
|
||||
continue;
|
||||
}
|
||||
StringTokenizer tokens = new StringTokenizer(line);
|
||||
String token = tokens.nextToken(); /* We don't use the first token. */
|
||||
token = tokens.nextToken();
|
||||
LatitudeAndLongitude location = new LatitudeAndLongitude(token);
|
||||
token = tokens.nextToken();
|
||||
mapList.put(token, location);
|
||||
}
|
||||
in.close();
|
||||
}
|
||||
|
||||
/* Open zoneinfo file to write. */
|
||||
FileWriter fw = new FileWriter(outputDir + zonefile.substring(index+1));
|
||||
BufferedWriter out = new BufferedWriter(fw);
|
||||
|
||||
out.write(header1 + new Date() + header3 + zonename + header4);
|
||||
out.write(body1 + "<FONT size=\"+2\"><B>" + zonename + "</B></FONT>");
|
||||
LatitudeAndLongitude location = (mapList != null ? mapList.get(zonename) : null);
|
||||
if (location != null) {
|
||||
int deg, min, sec;
|
||||
|
||||
deg = location.getLatDeg();
|
||||
min = location.getLatMin();
|
||||
sec = location.getLatSec();
|
||||
if (deg < 0) {
|
||||
min = -min;
|
||||
sec = -sec;
|
||||
} else if (min < 0) {
|
||||
sec = -sec;
|
||||
}
|
||||
out.write(" " +
|
||||
"<A HREF=\"http://www.mapquest.com/maps/map.adp?" +
|
||||
"latlongtype=degrees" +
|
||||
"&latdeg=" + deg +
|
||||
"&latmin=" + min +
|
||||
"&latsec=" + sec);
|
||||
|
||||
deg = location.getLongDeg();
|
||||
min = location.getLongMin();
|
||||
sec = location.getLongSec();
|
||||
if (deg < 0) {
|
||||
min = -min;
|
||||
sec = -sec;
|
||||
} else if (min < 0) {
|
||||
sec = -sec;
|
||||
}
|
||||
out.write("&longdeg=" + deg +
|
||||
"&longmin=" + min +
|
||||
"&longsec=" + sec +
|
||||
"\" target=\"_blank\">[map]</A>");
|
||||
}
|
||||
out.write("\n<P>\n");
|
||||
|
||||
List<ZoneRec> zone = tz.getZones();
|
||||
List<RuleRec> rule = tz.getRules();
|
||||
if (rule != null && zone != null) {
|
||||
out.write("<TABLE BORDER=\"0\" WIDTH=\"100%\" CELLPADDING=\"1\" CELLSPACING=\"0\">\n" +
|
||||
"<TR>\n" +
|
||||
"<TD BGCOLOR=\"#EEEEFF\" WIDTH=\"50%\" ALIGN=\"CENTER\"><BR>" +
|
||||
"<A HREF=\"#Rules\">Rules</A><BR></TD>\n" +
|
||||
"<TD BGCOLOR=\"#EEEEFF\" WIDTH=\"50%\" ALIGN=\"CENTER\">" +
|
||||
"<A HREF=\"#Zone\"><BR>Zone<BR></A></TD>\n" +
|
||||
"</TR>\n</TABLE>\n");
|
||||
}
|
||||
|
||||
/* Output Rule records. */
|
||||
if (rule != null) {
|
||||
size = rule.size();
|
||||
out.write("<P>\n<A NAME=\"Rules\">" +
|
||||
"<FONT SIZE=\"+1\"><B>Rules</B></FONT></A>\n" +
|
||||
"<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" CELLSPACING=\"0\">\n" +
|
||||
"<TR BGCOLOR=\"#CCCCFF\">\n" +
|
||||
"<TD>NAME</TD><TD>FROM</TD><TD>TO</TD><TD>TYPE</TD>" +
|
||||
"<TD>IN</TD><TD>ON</TD><TD>AT</TD><TD>SAVE</TD>" +
|
||||
"<TD>LETTER/S</TD><TD>NOTES</TD>\n</TR>\n");
|
||||
for (int i = 0; i < size; i++) {
|
||||
out.write("<TR BGCOLOR=\"#FFFFFF\">\n");
|
||||
StringTokenizer st = new StringTokenizer(rule.get(i).getLine());
|
||||
String s;
|
||||
if (st.hasMoreTokens()) { /* RULE - truncated */
|
||||
st.nextToken();
|
||||
}
|
||||
if (st.hasMoreTokens()) { /* NAME */
|
||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
||||
}
|
||||
if (st.hasMoreTokens()) { /* FROM */
|
||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
||||
}
|
||||
if (st.hasMoreTokens()) { /* TO */
|
||||
s = st.nextToken();
|
||||
if (s.equals("min") || s.equals("max")) {
|
||||
out.write("<TD><FONT COLOR=\"red\">" + s + "</FONT></TD>");
|
||||
} else {
|
||||
out.write("<TD>" + s + "</TD>");
|
||||
}
|
||||
}
|
||||
if (st.hasMoreTokens()) { /* TYPE */
|
||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
||||
}
|
||||
if (st.hasMoreTokens()) { /* IN */
|
||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
||||
}
|
||||
if (st.hasMoreTokens()) { /* ON */
|
||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
||||
}
|
||||
if (st.hasMoreTokens()) { /* AT */
|
||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
||||
}
|
||||
if (st.hasMoreTokens()) { /* SAVE */
|
||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
||||
}
|
||||
if (st.hasMoreTokens()) { /* LETTER/S */
|
||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
||||
}
|
||||
if (st.hasMoreTokens()) { /* NOTES */
|
||||
s = st.nextToken();
|
||||
while (st.hasMoreTokens()) {
|
||||
s += " " + st.nextToken();
|
||||
}
|
||||
index = s.indexOf('#');
|
||||
out.write("<TD>" + s.substring(index+1) + "</TD>\n");
|
||||
} else {
|
||||
out.write("<TD> </TD>\n");
|
||||
}
|
||||
out.write("</TR>\n");
|
||||
}
|
||||
out.write("</TABLE>\n<P> <P>\n");
|
||||
}
|
||||
|
||||
/* Output Zone records. */
|
||||
if (zone != null) {
|
||||
size = zone.size();
|
||||
out.write("<P>\n<A NAME=\"Zone\">" +
|
||||
"<FONT SIZE=\"+1\"><B>Zone</B></FONT></A>\n" +
|
||||
"<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" CELLSPACING=\"0\">\n" +
|
||||
"<TR BGCOLOR=\"#CCCCFF\">\n<TD>GMTOFF</TD>" +
|
||||
"<TD>RULES</TD><TD>FORMAT</TD><TD>UNTIL</TD>" +
|
||||
"<TD>NOTES</TD>\n</TR>\n");
|
||||
for (int i = 0; i < size; i++) {
|
||||
out.write("<TR>\n");
|
||||
StringTokenizer st = new StringTokenizer(zone.get(i).getLine());
|
||||
String s = st.nextToken();
|
||||
if (s.equals("Zone")) { /* NAME */
|
||||
s = st.nextToken();
|
||||
s = st.nextToken();
|
||||
}
|
||||
out.write("<TD>" + s + "</TD>"); /* GMTOFFSET */
|
||||
if (st.hasMoreTokens()) { /* RULES */
|
||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
||||
}
|
||||
if (st.hasMoreTokens()) { /* FORMAT */
|
||||
s = st.nextToken();
|
||||
index = s.indexOf('#');
|
||||
if (index != -1) {
|
||||
if (index != 0) {
|
||||
out.write("<TD>" + s.substring(0, index-1) +
|
||||
"</TD>"); /* FORMAT */
|
||||
s = s.substring(index+1);
|
||||
} else {
|
||||
out.write("<TD> </TD>"); /* FORMAT */
|
||||
}
|
||||
while (st.hasMoreTokens()) {
|
||||
s += " " + st.nextToken();
|
||||
}
|
||||
out.write("<TD> </TD>"); /* UNTIL */
|
||||
out.write("<TD>" + s + "</TD>\n</TR>\n"); /* NOTES */
|
||||
continue;
|
||||
} else {
|
||||
out.write("<TD>" + s + "</TD>"); /* FORMAT */
|
||||
}
|
||||
}
|
||||
|
||||
if (st.hasMoreTokens()) { /* UNTIL */
|
||||
s = st.nextToken();
|
||||
while (st.hasMoreTokens()) {
|
||||
s += " " + st.nextToken();
|
||||
}
|
||||
index = s.indexOf('#');
|
||||
if (index != -1) {
|
||||
if (index != 0) {
|
||||
out.write("<TD>" + s.substring(0, index-1) +
|
||||
"</TD>"); /* UNTIL */
|
||||
} else {
|
||||
out.write("<TD> </TD>"); /* UNTIL */
|
||||
}
|
||||
out.write("<TD>" + s.substring(index+1) +
|
||||
"</TD>\n"); /* NOTES */
|
||||
} else {
|
||||
out.write("<TD>" + s + "</TD>"); /* UNTIL */
|
||||
out.write("<TD> </TD>\n"); /* NOTES */
|
||||
}
|
||||
} else {
|
||||
out.write("<TD> </TD>"); /* UNTIL */
|
||||
out.write("<TD> </TD>\n"); /* NOTES */
|
||||
}
|
||||
out.write("</TR>\n");
|
||||
}
|
||||
out.write("</TABLE>\n");
|
||||
}
|
||||
out.write(body2 + footer);
|
||||
|
||||
out.close();
|
||||
fw.close();
|
||||
} catch(IOException e) {
|
||||
Main.panic("IO error: "+e.getMessage());
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates index.html and other top-level frame files.
|
||||
* @param Mappings
|
||||
* @return 0 if no errors, or 1 if error occurred.
|
||||
*/
|
||||
int generateSrc(Mappings map) {
|
||||
try {
|
||||
int len;
|
||||
Object o[];
|
||||
String outputDir = Main.getOutputDir();
|
||||
FileWriter fw1, fw2;
|
||||
BufferedWriter out1, out2;
|
||||
|
||||
/* Whether alias list exists or not. */
|
||||
Map<String,String> a = map.getAliases();
|
||||
if (a == null) {
|
||||
Main.panic("Data not exist. (aliases)");
|
||||
return 1;
|
||||
}
|
||||
|
||||
timezoneList.putAll(a);
|
||||
|
||||
/* If outputDir doesn't end with file-separator, adds it. */
|
||||
if (!outputDir.endsWith(File.separator)) {
|
||||
outputDir += File.separatorChar;
|
||||
}
|
||||
outputDir += docDir + File.separatorChar;
|
||||
|
||||
File outD = new File(outputDir);
|
||||
outD.mkdirs();
|
||||
|
||||
/* Creates index.html */
|
||||
fw1 = new FileWriter(outputDir + "index.html", false);
|
||||
out1 = new BufferedWriter(fw1);
|
||||
|
||||
out1.write(header1 + new Date() + header2 + Main.getVersionName() +
|
||||
header4 +
|
||||
"<FRAMESET cols=\"20%,80%\">\n" +
|
||||
"<FRAMESET rows=\"30%,70%\">\n" +
|
||||
"<FRAME src=\"overview-frame.html\" name=\"TimeZoneListFrame\">\n" +
|
||||
"<FRAME src=\"allTimeZone-frame1.html\" name=\"allTimeZoneFrame\">\n" +
|
||||
"</FRAMESET>" +
|
||||
"<FRAME src=\"overview-summary.html\" name=\"rightFrame\">\n" +
|
||||
"</FRAMESET>\n" +
|
||||
"<NOFRAMES>\n" +
|
||||
"<H2>\nFrame Alert\n</H2>\n\n" +
|
||||
"<P>\n\n" +
|
||||
"This document is designed to be viewed using the frames feature. If you see this\n" +
|
||||
"message, you are using a non-frame-capable web client.\n" +
|
||||
"<BR>\n" +
|
||||
"Link to<A HREF=\"overview-summary.html\">Non-frame version.</A>\n" +
|
||||
"</NOFRAMES>\n" + footer);
|
||||
|
||||
out1.close();
|
||||
fw1.close();
|
||||
|
||||
|
||||
/* Creates overview-frame.html */
|
||||
fw1 = new FileWriter(outputDir + "overview-frame.html", false);
|
||||
out1 = new BufferedWriter(fw1);
|
||||
|
||||
out1.write(header1 + new Date() + header2 + Main.getVersionName() +
|
||||
header4 + body1 +
|
||||
"<TABLE BORDER=\"0\" WIDTH=\"100%\">\n<TR>\n" +
|
||||
"<TD NOWRAP><FONT size=\"+1\">\n" +
|
||||
"<B>Java<sup><font size=-2>TM</font></sup> Platform<br>Standard Ed.</B></FONT></TD>\n" +
|
||||
"</TR>\n</TABLE>\n\n" +
|
||||
"<TABLE BORDER=\"0\" WIDTH=\"100%\">\n<TR>\n<TD NOWRAP>" +
|
||||
"<P>\n<FONT size=\"+1\">\nAll Time Zones Sorted By:</FONT>\n<BR>\n" +
|
||||
" <A HREF=\"allTimeZone-frame1.html\" TARGET=\"allTimeZoneFrame\">GMT offsets</A></FONT>\n<BR>\n" +
|
||||
" <A HREF=\"allTimeZone-frame2.html\" TARGET=\"allTimeZoneFrame\">Zone names</A></FONT>\n<BR>" +
|
||||
" <A HREF=\"allTimeZone-frame3.html\" TARGET=\"allTimeZoneFrame\">City names</A></FONT>\n" +
|
||||
"<P>\n<FONT size=\"+1\">\nContinents and Oceans</FONT>\n<BR>\n");
|
||||
|
||||
for (String regionKey : regionList.keySet()) {
|
||||
out1.write(" <A HREF=\"" + regionList.get(regionKey) +
|
||||
"\" TARGET=\"allTimeZoneFrame\">" + regionKey +
|
||||
"</A><BR>\n");
|
||||
|
||||
fw2 = new FileWriter(outputDir + regionList.get(regionKey),
|
||||
false);
|
||||
out2 = new BufferedWriter(fw2);
|
||||
|
||||
out2.write(header1 + new Date() + header3 + regionKey +
|
||||
header4 + body1 + "<FONT size=\"+1\"><B>" +
|
||||
regionKey + "</B></FONT>\n<BR>\n<TABLE>\n<TR>\n<TD>");
|
||||
|
||||
boolean found = false;
|
||||
for (String timezoneKey : timezoneList.keySet()) {
|
||||
int regionIndex = timezoneKey.indexOf('/');
|
||||
if (regionIndex == -1 ||
|
||||
!regionKey.equals(timezoneKey.substring(0, regionIndex))) {
|
||||
if (found) {
|
||||
break;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
found = true;
|
||||
if (a.containsKey(timezoneKey)) {
|
||||
Object realName = a.get(timezoneKey);
|
||||
while (a.containsKey(realName)) {
|
||||
realName = a.get(realName);
|
||||
}
|
||||
out2.write(timezoneKey +
|
||||
" (alias for " + "<A HREF=\"" +
|
||||
timezoneList.get(realName) +
|
||||
"\" TARGET=\"rightFrame\">" +
|
||||
realName + "</A>)");
|
||||
} else {
|
||||
out2.write("<A HREF=\"" + timezoneList.get(timezoneKey) +
|
||||
"\" TARGET=\"rightFrame\">" + timezoneKey +
|
||||
"</A>");
|
||||
}
|
||||
out2.write("<BR>\n");
|
||||
}
|
||||
out2.write("</TD>\n</TR>\n</TABLE>\n" + body2 + footer);
|
||||
|
||||
out2.close();
|
||||
fw2.close();
|
||||
}
|
||||
out1.write("</FONT></TD>\n</TR></TABLE>\n" + body2 + footer);
|
||||
|
||||
out1.close();
|
||||
fw1.close();
|
||||
|
||||
|
||||
/* Creates allTimeZone-frame1.html (Sorted by GMT offsets) */
|
||||
fw1 = new FileWriter(outputDir + "allTimeZone-frame1.html", false);
|
||||
out1 = new BufferedWriter(fw1);
|
||||
|
||||
out1.write(header1 + new Date() + header2 + Main.getVersionName() +
|
||||
header4 + body1 +
|
||||
"<FONT size=\"+1\"><B>Sorted by GMT offsets</B></FONT>\n" +
|
||||
"<BR>\n\n" + "<TABLE BORDER=\"0\" WIDTH=\"100%\">\n" +
|
||||
"<TR>\n<TD NOWRAP>\n");
|
||||
|
||||
List<Integer> roi = map.getRawOffsetsIndex();
|
||||
List<Set<String>> roit = map.getRawOffsetsIndexTable();
|
||||
|
||||
int index = 0;
|
||||
for (Integer offset : zonesByOffset.keySet()) {
|
||||
int off = roi.get(index);
|
||||
Set<String> perRO = zonesByOffset.get(offset);
|
||||
if (offset == off) {
|
||||
// Merge aliases into zonesByOffset
|
||||
perRO.addAll(roit.get(index));
|
||||
}
|
||||
index++;
|
||||
|
||||
for (String timezoneKey : perRO) {
|
||||
out1.write("<TR>\n<TD><FONT SIZE=\"-1\">(" +
|
||||
Time.toGMTFormat(offset.toString()) +
|
||||
")</FONT></TD>\n<TD>");
|
||||
|
||||
if (a.containsKey(timezoneKey)) {
|
||||
Object realName = a.get(timezoneKey);
|
||||
while (a.containsKey(realName)) {
|
||||
realName = a.get(realName);
|
||||
}
|
||||
out1.write(timezoneKey +
|
||||
" (alias for " + "<A HREF=\"" +
|
||||
timezoneList.get(realName) +
|
||||
"\" TARGET=\"rightFrame\">" + realName +
|
||||
"</A>)");
|
||||
} else {
|
||||
out1.write("<A HREF=\"" + timezoneList.get(timezoneKey) +
|
||||
"\" TARGET=\"rightFrame\">" + timezoneKey +
|
||||
"</A>");
|
||||
}
|
||||
out1.write("</TD>\n</TR>\n");
|
||||
}
|
||||
}
|
||||
out1.write("</FONT></TD>\n</TR>\n</TABLE>\n" + body2 + footer);
|
||||
|
||||
out1.close();
|
||||
fw1.close();
|
||||
|
||||
|
||||
/* Creates allTimeZone-frame2.html (Sorted by zone names) */
|
||||
fw1 = new FileWriter(outputDir + "allTimeZone-frame2.html", false);
|
||||
out1 = new BufferedWriter(fw1);
|
||||
|
||||
out1.write(header1 + new Date() + header2 + Main.getVersionName() +
|
||||
header4 + body1 +
|
||||
"<FONT size=\"+1\"><B>Sorted by zone names</B></FONT>\n" +
|
||||
"<BR>\n\n" + "<TABLE BORDER=\"0\" WIDTH=\"100%\">\n" +
|
||||
"<TR>\n<TD NOWRAP>\n");
|
||||
o = timezoneList.keySet().toArray();
|
||||
len = timezoneList.size();
|
||||
for (int i = 0; i < len; i++) {
|
||||
Object timezoneKey = o[i];
|
||||
if (a.containsKey(timezoneKey)) {
|
||||
Object realName = a.get(timezoneKey);
|
||||
while (a.containsKey(realName)) {
|
||||
realName = a.get(realName);
|
||||
}
|
||||
out1.write(timezoneKey +
|
||||
" (alias for " +
|
||||
"<A HREF=\"" + timezoneList.get(realName) +
|
||||
"\" TARGET=\"rightFrame\">" + realName +
|
||||
"</A>)");
|
||||
} else {
|
||||
out1.write("<A HREF=\"" + timezoneList.get(timezoneKey) +
|
||||
"\" TARGET=\"rightFrame\">" + timezoneKey +
|
||||
"</A>");
|
||||
}
|
||||
out1.write("<BR> \n");
|
||||
}
|
||||
out1.write("</FONT></TD>\n</TR>\n</TABLE>\n" + body2 + footer);
|
||||
|
||||
out1.close();
|
||||
fw1.close();
|
||||
|
||||
/* Creates allTimeZone-frame3.html (Sorted by city names) */
|
||||
fw1 = new FileWriter(outputDir + "allTimeZone-frame3.html", false);
|
||||
out1 = new BufferedWriter(fw1);
|
||||
|
||||
out1.write(header1 + new Date() + header2 + Main.getVersionName() +
|
||||
header4 + body1 +
|
||||
"<FONT size=\"+1\"><B>Sorted by city names</B></FONT>\n" +
|
||||
"<BR>\n\n" + "<TABLE BORDER=\"0\" WIDTH=\"100%\">\n" +
|
||||
"<TR>\n<TD NOWRAP>\n");
|
||||
|
||||
Set<String> aliasSet = a.keySet();
|
||||
len = aliasSet.size();
|
||||
String aliasNames[] = aliasSet.toArray(new String[0]);
|
||||
for (int i = 0; i < len; i++) {
|
||||
displayNameList.put(transform(aliasNames[i]),
|
||||
aliasNames[i]);
|
||||
}
|
||||
|
||||
o = displayNameList.keySet().toArray();
|
||||
len = displayNameList.size();
|
||||
for (int i = 0; i < len; i++) {
|
||||
Object displayName = o[i];
|
||||
Object timezoneKey = displayNameList.get(o[i]);
|
||||
if (a.containsKey(timezoneKey)) {
|
||||
Object realName = a.get(timezoneKey);
|
||||
while (a.containsKey(realName)) {
|
||||
realName = a.get(realName);
|
||||
}
|
||||
out1.write(displayName +
|
||||
" (alias for " +
|
||||
"<A HREF=\"" + timezoneList.get(realName) +
|
||||
"\" TARGET=\"rightFrame\">" + realName +
|
||||
"</A>)");
|
||||
} else {
|
||||
out1.write("<A HREF=\"" + timezoneList.get(timezoneKey) +
|
||||
"\" TARGET=\"rightFrame\">" + displayName +
|
||||
"</A>");
|
||||
}
|
||||
out1.write("<BR> \n");
|
||||
}
|
||||
|
||||
out1.write("</FONT></TD>\n</TR>\n</TABLE>\n" + body2 + footer);
|
||||
|
||||
out1.close();
|
||||
fw1.close();
|
||||
|
||||
/* Creates overview-summary.html */
|
||||
fw1 = new FileWriter(outputDir + "overview-summary.html", false);
|
||||
out1 = new BufferedWriter(fw1);
|
||||
|
||||
out1.write(header1 + new Date() + header2 + Main.getVersionName() +
|
||||
header4 + body1 +
|
||||
"<p>This is the list of time zones generated from <B>" +
|
||||
Main.getVersionName() + "</B> for Java Platform, " +
|
||||
"Standard Edition. The source code can be obtained " +
|
||||
"from ftp site <a href=\"ftp://elsie.nci.nih.gov/pub/\">" +
|
||||
"ftp://elsie.nci.nih.gov/pub/</a>. A total of <B>" +
|
||||
len +
|
||||
"</B> time zones and aliases are supported " +
|
||||
"in this edition. For the " +
|
||||
"format of rules and zones, refer to the zic " +
|
||||
"(zoneinfo compiler) man page on " +
|
||||
"Solaris or Linux.</p>\n" +
|
||||
"<p>Note that the time zone data is not " +
|
||||
"a public interface of the Java Platform. No " +
|
||||
"applications should rely on the time zone data of " +
|
||||
"this document. Time zone names and data " +
|
||||
"may change without any prior notice.</p>\n" +
|
||||
body2 + footer);
|
||||
|
||||
out1.close();
|
||||
fw1.close();
|
||||
} catch(IOException e) {
|
||||
Main.panic("IO error: "+e.getMessage());
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
String transform(String s) {
|
||||
int index = s.lastIndexOf("/");
|
||||
|
||||
/* If the string doesn't include any delimiter, return */
|
||||
if (index == -1) {
|
||||
return s;
|
||||
}
|
||||
|
||||
int lastIndex = index;
|
||||
String str = s.substring(index+1);
|
||||
do {
|
||||
index = s.substring(0, lastIndex).lastIndexOf('/');
|
||||
str += ", " + s.substring(index+1, lastIndex);
|
||||
lastIndex = index;
|
||||
} while (index > -1);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
static class LatitudeAndLongitude {
|
||||
|
||||
private int latDeg, latMin, latSec, longDeg, longMin, longSec;
|
||||
|
||||
LatitudeAndLongitude(String s) {
|
||||
try {
|
||||
// First of all, check the string has the correct format:
|
||||
// either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS
|
||||
|
||||
if (!s.startsWith("+") && !s.startsWith("-")) {
|
||||
Main.warning("Wrong latitude&longitude data: " + s);
|
||||
return;
|
||||
}
|
||||
int index;
|
||||
if (((index = s.lastIndexOf("+")) <= 0) &&
|
||||
((index = s.lastIndexOf("-")) <= 0)) {
|
||||
Main.warning("Wrong latitude&longitude data: " + s);
|
||||
return;
|
||||
}
|
||||
|
||||
if (index == 5) {
|
||||
latDeg = Integer.parseInt(s.substring(1, 3));
|
||||
latMin = Integer.parseInt(s.substring(3, 5));
|
||||
latSec = 0;
|
||||
} else if (index == 7) {
|
||||
latDeg = Integer.parseInt(s.substring(1, 3));
|
||||
latMin = Integer.parseInt(s.substring(3, 5));
|
||||
latSec = Integer.parseInt(s.substring(5, 7));
|
||||
} else {
|
||||
Main.warning("Wrong latitude&longitude data: " + s);
|
||||
return;
|
||||
}
|
||||
if (s.startsWith("-")){
|
||||
latDeg = -latDeg;
|
||||
latMin = -latMin;
|
||||
latSec = -latSec;
|
||||
}
|
||||
|
||||
int len = s.length();
|
||||
if (index == 5 && len == 11) {
|
||||
longDeg = Integer.parseInt(s.substring(index+1, index+4));
|
||||
longMin = Integer.parseInt(s.substring(index+4, index+6));
|
||||
longSec = 0;
|
||||
} else if (index == 7 && len == 15) {
|
||||
longDeg = Integer.parseInt(s.substring(index+1, index+4));
|
||||
longMin = Integer.parseInt(s.substring(index+4, index+6));
|
||||
longSec = Integer.parseInt(s.substring(index+6, index+8));
|
||||
} else {
|
||||
Main.warning("Wrong latitude&longitude data: " + s);
|
||||
return;
|
||||
}
|
||||
if (s.charAt(index) == '-'){
|
||||
longDeg = -longDeg;
|
||||
longMin = -longMin;
|
||||
longSec = -longSec;
|
||||
}
|
||||
} catch(Exception e) {
|
||||
Main.warning("LatitudeAndLongitude() Parse error: " + s);
|
||||
}
|
||||
}
|
||||
|
||||
int getLatDeg() {
|
||||
return latDeg;
|
||||
}
|
||||
|
||||
int getLatMin() {
|
||||
return latMin;
|
||||
}
|
||||
|
||||
int getLatSec() {
|
||||
return latSec;
|
||||
}
|
||||
|
||||
int getLongDeg() {
|
||||
return longDeg;
|
||||
}
|
||||
|
||||
int getLongMin() {
|
||||
return longMin;
|
||||
}
|
||||
|
||||
int getLongSec() {
|
||||
return longSec;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,232 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Main class for the javazic time zone data compiler.
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
public class Main {
|
||||
|
||||
private static boolean verbose = false;
|
||||
static boolean outputDoc = false;
|
||||
|
||||
private List<String> ziFiles = new ArrayList<String>();
|
||||
private static String zoneNamesFile = null;
|
||||
private static String versionName = "unknown";
|
||||
private static String outputDir = "zoneinfo";
|
||||
private static String mapFile = null;
|
||||
|
||||
/**
|
||||
* Parses the specified arguments and sets up the variables.
|
||||
* @param argv the arguments
|
||||
*/
|
||||
void processArgs(String[] argv) {
|
||||
for (int i = 0; i < argv.length; i++) {
|
||||
String arg = argv[i];
|
||||
if (arg.startsWith("-h")) {
|
||||
usage();
|
||||
System.exit(0);
|
||||
} else if (arg.equals("-d")) {
|
||||
outputDir = argv[++i];
|
||||
} else if (arg.equals("-v")) {
|
||||
verbose = true;
|
||||
} else if (arg.equals("-V")) {
|
||||
versionName = argv[++i];
|
||||
} else if (arg.equals("-doc")) {
|
||||
outputDoc = true;
|
||||
} else if (arg.equals("-map")) {
|
||||
outputDoc = true;
|
||||
mapFile = argv[++i];
|
||||
} else if (arg.equals("-f")) {
|
||||
zoneNamesFile = argv[++i];
|
||||
} else if (arg.equals("-S")) {
|
||||
try {
|
||||
Zoneinfo.setYear(Integer.parseInt(argv[++i]));
|
||||
} catch (Exception e) {
|
||||
error("invalid year: " + argv[i]);
|
||||
usage();
|
||||
System.exit(1);
|
||||
}
|
||||
} else {
|
||||
boolean isStartYear = arg.equals("-s");
|
||||
if (isStartYear || arg.equals("-e")) {
|
||||
try {
|
||||
int year = Integer.parseInt(argv[++i]);
|
||||
if (isStartYear) {
|
||||
Zoneinfo.setStartYear(year);
|
||||
} else {
|
||||
Zoneinfo.setEndYear(year);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
error("invalid year: " + argv[i]);
|
||||
usage();
|
||||
System.exit(1);
|
||||
}
|
||||
} else {
|
||||
// the rest of args are zoneinfo source files
|
||||
while (i < argv.length) {
|
||||
ziFiles.add(argv[i++]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses zoneinfo source files
|
||||
*/
|
||||
int compile() {
|
||||
int nFiles = ziFiles.size();
|
||||
int status = 0;
|
||||
Mappings maps = new Mappings();
|
||||
BackEnd backend = BackEnd.getBackEnd();
|
||||
|
||||
for (int i = 0; i < nFiles; i++) {
|
||||
Zoneinfo frontend = Zoneinfo.parse(ziFiles.get(i));
|
||||
|
||||
for (String key : frontend.getZones().keySet()) {
|
||||
info(key);
|
||||
|
||||
Timezone tz = frontend.phase2(key);
|
||||
status |= backend.processZoneinfo(tz);
|
||||
}
|
||||
|
||||
maps.add(frontend);
|
||||
}
|
||||
|
||||
// special code for dealing with the conflicting name "MET"
|
||||
Zone.addMET();
|
||||
|
||||
maps.resolve();
|
||||
|
||||
status |= backend.generateSrc(maps);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
public static void main(String[] argv) {
|
||||
Main zic = new Main();
|
||||
|
||||
/*
|
||||
* Parse args
|
||||
*/
|
||||
zic.processArgs(argv);
|
||||
|
||||
/*
|
||||
* Read target zone names
|
||||
*/
|
||||
if (zoneNamesFile != null) {
|
||||
Zone.readZoneNames(zoneNamesFile);
|
||||
}
|
||||
|
||||
zic.compile();
|
||||
}
|
||||
|
||||
void usage() {
|
||||
System.err.println("Usage: javazic [options] file...\n"+
|
||||
" -f namefile file containing zone names\n"+
|
||||
" to be generated (ie, generating subset)\n"+
|
||||
" -d dir output directory\n"+
|
||||
" -v verbose\n"+
|
||||
" -V datavers specifies the tzdata version string\n"+
|
||||
" (eg, \"tzdata2000g\")"+
|
||||
" -S year output only SimleTimeZone data of that year\n"+
|
||||
" -s year start year (default: 1900)\n"+
|
||||
" -e year end year (default: 2037)\n"+
|
||||
" -doc generates HTML documents\n"+
|
||||
" -map mapfile generates HTML documents with map information\n"+
|
||||
" file... zoneinfo source file(s)");
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the output directory path name
|
||||
*/
|
||||
static String getOutputDir() {
|
||||
return outputDir;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the map file's path and name
|
||||
*/
|
||||
static String getMapFile() {
|
||||
return mapFile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the time zone data version string specified by the -V
|
||||
* option. If it is not specified, "unknown" is returned.
|
||||
* @return the time zone data version string
|
||||
*/
|
||||
static String getVersionName() {
|
||||
return versionName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints out the specified fatal error message and calls {@link
|
||||
* java.lang.System#exit System.exit(1)}.
|
||||
* @param msg the fatal error message
|
||||
*/
|
||||
static void panic(String msg) {
|
||||
printMessage("fatal error", msg);
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints out the specified error message.
|
||||
* @param msg the error message
|
||||
*/
|
||||
static void error(String msg) {
|
||||
printMessage("error", msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints out the specified warning message.
|
||||
* @param msg the warning message
|
||||
*/
|
||||
static void warning(String msg) {
|
||||
printMessage("warning", msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints out the informative message.
|
||||
* @param msg the informative message
|
||||
*/
|
||||
static void info(String msg) {
|
||||
if (verbose) {
|
||||
printMessage(null, msg);
|
||||
}
|
||||
}
|
||||
|
||||
private static void printMessage(String type, String msg) {
|
||||
if (type != null) {
|
||||
type += ": ";
|
||||
} else {
|
||||
type = "";
|
||||
}
|
||||
System.err.println("javazic: " + type + msg);
|
||||
}
|
||||
}
|
@ -1,193 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
import java.util.TreeSet;
|
||||
|
||||
/**
|
||||
* <code>Mappings</code> generates two Maps and a List which are used by
|
||||
* javazic BackEnd.
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
class Mappings {
|
||||
// All aliases specified by Link statements. It's alias name to
|
||||
// real name mappings.
|
||||
private Map<String,String> aliases;
|
||||
|
||||
private List<Integer> rawOffsetsIndex;
|
||||
|
||||
private List<Set<String>> rawOffsetsIndexTable;
|
||||
|
||||
// Zone names to be excluded from rawOffset table. Those have GMT
|
||||
// offsets to change some future time.
|
||||
private List<String> excludeList;
|
||||
|
||||
/**
|
||||
* Constructor creates some necessary instances.
|
||||
*/
|
||||
Mappings() {
|
||||
aliases = new TreeMap<String,String>();
|
||||
rawOffsetsIndex = new LinkedList<Integer>();
|
||||
rawOffsetsIndexTable = new LinkedList<Set<String>>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates aliases and rawOffsets tables.
|
||||
* @param zi a Zoneinfo containing Zones
|
||||
*/
|
||||
void add(Zoneinfo zi) {
|
||||
Map<String,Zone> zones = zi.getZones();
|
||||
|
||||
for (String zoneName : zones.keySet()) {
|
||||
Zone zone = zones.get(zoneName);
|
||||
String zonename = zone.getName();
|
||||
int rawOffset = zone.get(zone.size()-1).getGmtOffset();
|
||||
|
||||
// If the GMT offset of this Zone will change in some
|
||||
// future time, this Zone is added to the exclude list.
|
||||
boolean isExcluded = false;
|
||||
for (int i = 0; i < zone.size(); i++) {
|
||||
ZoneRec zrec = zone.get(i);
|
||||
if ((zrec.getGmtOffset() != rawOffset)
|
||||
&& (zrec.getUntilTime(0) > Time.getCurrentTime())) {
|
||||
if (excludeList == null) {
|
||||
excludeList = new ArrayList<String>();
|
||||
}
|
||||
excludeList.add(zone.getName());
|
||||
isExcluded = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!rawOffsetsIndex.contains(new Integer(rawOffset))) {
|
||||
// Find the index to insert this raw offset zones
|
||||
int n = rawOffsetsIndex.size();
|
||||
int i;
|
||||
for (i = 0; i < n; i++) {
|
||||
if (rawOffsetsIndex.get(i) > rawOffset) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
rawOffsetsIndex.add(i, rawOffset);
|
||||
|
||||
Set<String> perRawOffset = new TreeSet<String>();
|
||||
if (!isExcluded) {
|
||||
perRawOffset.add(zonename);
|
||||
}
|
||||
rawOffsetsIndexTable.add(i, perRawOffset);
|
||||
} else if (!isExcluded) {
|
||||
int i = rawOffsetsIndex.indexOf(new Integer(rawOffset));
|
||||
Set<String> perRawOffset = rawOffsetsIndexTable.get(i);
|
||||
perRawOffset.add(zonename);
|
||||
}
|
||||
}
|
||||
|
||||
Map<String,String> a = zi.getAliases();
|
||||
// If there are time zone names which refer to any of the
|
||||
// excluded zones, add those names to the excluded list.
|
||||
if (excludeList != null) {
|
||||
for (String zoneName : a.keySet()) {
|
||||
String realname = a.get(zoneName);
|
||||
if (excludeList.contains(realname)) {
|
||||
excludeList.add(zoneName);
|
||||
}
|
||||
}
|
||||
}
|
||||
aliases.putAll(a);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds valid aliases to one of per-RawOffset table and removes
|
||||
* invalid aliases from aliases List. Aliases referring to
|
||||
* excluded zones are not added to a per-RawOffset table.
|
||||
*/
|
||||
void resolve() {
|
||||
int index = rawOffsetsIndexTable.size();
|
||||
List<String> toBeRemoved = new ArrayList<String>();
|
||||
for (String key : aliases.keySet()) {
|
||||
boolean validname = false;
|
||||
for (int j = 0; j < index; j++) {
|
||||
Set<String> perRO = rawOffsetsIndexTable.get(j);
|
||||
boolean isExcluded = (excludeList == null) ?
|
||||
false : excludeList.contains(key);
|
||||
|
||||
if ((perRO.contains(aliases.get(key)) || isExcluded)
|
||||
&& Zone.isTargetZone(key)) {
|
||||
validname = true;
|
||||
if (!isExcluded) {
|
||||
perRO.add(key);
|
||||
Main.info("Alias <"+key+"> added to the list.");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!validname) {
|
||||
Main.info("Alias <"+key+"> removed from the list.");
|
||||
toBeRemoved.add(key);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove zones, if any, from the list.
|
||||
for (String key : toBeRemoved) {
|
||||
aliases.remove(key);
|
||||
}
|
||||
// Eliminate any alias-to-alias mappings. For example, if
|
||||
// there are A->B and B->C, A->B is changed to A->C.
|
||||
Map<String, String> newMap = new HashMap<String, String>();
|
||||
for (String key : aliases.keySet()) {
|
||||
String realid = aliases.get(key);
|
||||
String leaf = realid;
|
||||
while (aliases.get(leaf) != null) {
|
||||
leaf = aliases.get(leaf);
|
||||
}
|
||||
if (!realid.equals(leaf)) {
|
||||
newMap.put(key, leaf);
|
||||
}
|
||||
}
|
||||
aliases.putAll(newMap);
|
||||
}
|
||||
|
||||
Map<String,String> getAliases() {
|
||||
return(aliases);
|
||||
}
|
||||
|
||||
List<Integer> getRawOffsetsIndex() {
|
||||
return(rawOffsetsIndex);
|
||||
}
|
||||
|
||||
List<Set<String>> getRawOffsetsIndexTable() {
|
||||
return(rawOffsetsIndexTable);
|
||||
}
|
||||
|
||||
List<String> getExcludeList() {
|
||||
return excludeList;
|
||||
}
|
||||
}
|
@ -1,87 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Month enum handles month related manipulation.
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
enum Month {
|
||||
JANUARY("Jan"),
|
||||
FEBRUARY("Feb"),
|
||||
MARCH("Mar"),
|
||||
APRIL("Apr"),
|
||||
MAY("May"),
|
||||
JUNE("Jun"),
|
||||
JULY("Jul"),
|
||||
AUGUST("Aug"),
|
||||
SEPTEMBER("Sep"),
|
||||
OCTOBER("Oct"),
|
||||
NOVEMBER("Nov"),
|
||||
DECEMBER("Dec");
|
||||
|
||||
private final String abbr;
|
||||
|
||||
private Month(String abbr) {
|
||||
this.abbr = abbr;
|
||||
}
|
||||
|
||||
int value() {
|
||||
return ordinal() + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the specified string as a month abbreviation.
|
||||
* @param name the month abbreviation
|
||||
* @return the Month value
|
||||
*/
|
||||
static Month parse(String name) {
|
||||
int len = name.length();
|
||||
|
||||
if (name.regionMatches(true, 0, "January", 0, len)) return Month.JANUARY;
|
||||
if (name.regionMatches(true, 0, "February", 0, len)) return Month.FEBRUARY;
|
||||
if (name.regionMatches(true, 0, "March", 0, len)) return Month.MARCH;
|
||||
if (name.regionMatches(true, 0, "April", 0, len)) return Month.APRIL;
|
||||
if (name.regionMatches(true, 0, "May", 0, len)) return Month.MAY;
|
||||
if (name.regionMatches(true, 0, "June", 0, len)) return Month.JUNE;
|
||||
if (name.regionMatches(true, 0, "July", 0, len)) return Month.JULY;
|
||||
if (name.regionMatches(true, 0, "August", 0, len)) return Month.AUGUST;
|
||||
if (name.regionMatches(true, 0, "September", 0, len)) return Month.SEPTEMBER;
|
||||
if (name.regionMatches(true, 0, "October", 0, len)) return Month.OCTOBER;
|
||||
if (name.regionMatches(true, 0, "November", 0, len)) return Month.NOVEMBER;
|
||||
if (name.regionMatches(true, 0, "December", 0, len)) return Month.DECEMBER;
|
||||
|
||||
throw new IllegalArgumentException("Unknown month: " + name);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param month the nunmth number (1-based)
|
||||
* @return the month name in uppercase of the specified month
|
||||
*/
|
||||
static String toString(int month) {
|
||||
if (month >= JANUARY.value() && month <= DECEMBER.value()) {
|
||||
return "Calendar." + Month.values()[month - 1];
|
||||
}
|
||||
throw new IllegalArgumentException("wrong month number: " + month);
|
||||
}
|
||||
}
|
@ -1,189 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
* Rule manipulates Rule records.
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
class Rule {
|
||||
|
||||
private List<RuleRec> list;
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* Constructs a Rule which consists of a Rule record list. The
|
||||
* specified name is given to this Rule.
|
||||
* @param name the Rule name
|
||||
*/
|
||||
Rule(String name) {
|
||||
this.name = name;
|
||||
list = new ArrayList<RuleRec>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Added a RuleRec to the Rule record list.
|
||||
*/
|
||||
void add(RuleRec rec) {
|
||||
list.add(rec);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the Rule name
|
||||
*/
|
||||
String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all rule records that cover the given year.
|
||||
*
|
||||
* @param year the year number for which the rule is applicable.
|
||||
* @return rules in List that are collated in time. If no rule is found, an empty
|
||||
* List is returned.
|
||||
*/
|
||||
List<RuleRec> getRules(int year) {
|
||||
List<RuleRec> rules = new ArrayList<RuleRec>(3);
|
||||
for (RuleRec rec : list) {
|
||||
if (year >= rec.getFromYear() && year <= rec.getToYear()) {
|
||||
if ((rec.isOdd() && year % 2 == 0) || (rec.isEven() && year % 2 == 1))
|
||||
continue;
|
||||
rules.add(rec);
|
||||
}
|
||||
}
|
||||
int n = rules.size();
|
||||
if (n <= 1) {
|
||||
return rules;
|
||||
}
|
||||
if (n == 2) {
|
||||
RuleRec rec1 = rules.get(0);
|
||||
RuleRec rec2 = rules.get(1);
|
||||
if (rec1.getMonthNum() > rec2.getMonthNum()) {
|
||||
rules.set(0, rec2);
|
||||
rules.set(1, rec1);
|
||||
} else if (rec1.getMonthNum() == rec2.getMonthNum()) {
|
||||
// TODO: it's not accurate to ignore time types (STD, WALL, UTC)
|
||||
long t1 = Time.getLocalTime(year, rec1.getMonth(),
|
||||
rec1.getDay(), rec1.getTime().getTime());
|
||||
long t2 = Time.getLocalTime(year, rec2.getMonth(),
|
||||
rec2.getDay(), rec2.getTime().getTime());
|
||||
if (t1 > t2) {
|
||||
rules.set(0, rec2);
|
||||
rules.set(1, rec1);
|
||||
}
|
||||
}
|
||||
return rules;
|
||||
}
|
||||
|
||||
final int y = year;
|
||||
RuleRec[] recs = new RuleRec[rules.size()];
|
||||
rules.toArray(recs);
|
||||
|
||||
Arrays.sort(recs, new Comparator<RuleRec>() {
|
||||
public int compare(RuleRec r1, RuleRec r2) {
|
||||
int n = r1.getMonthNum() - r2.getMonthNum();
|
||||
if (n != 0) {
|
||||
return n;
|
||||
}
|
||||
// TODO: it's not accurate to ignore time types (STD, WALL, UTC)
|
||||
long t1 = Time.getLocalTime(y, r1.getMonth(),
|
||||
r1.getDay(), r1.getTime().getTime());
|
||||
long t2 = Time.getLocalTime(y, r2.getMonth(),
|
||||
r2.getDay(), r2.getTime().getTime());
|
||||
return Long.compare(t1, t2);
|
||||
}
|
||||
public boolean equals(Object o) {
|
||||
return this == o;
|
||||
}
|
||||
});
|
||||
rules.clear();
|
||||
for (int i = 0; i < n; i++) {
|
||||
if (i != 0 && recs[i -1].getSave() == recs[i].getSave()) {
|
||||
// we have two recs back to back with same saving for the same year.
|
||||
if (recs[i].isLastRule()) {
|
||||
continue;
|
||||
} else if (recs[i - 1].isLastRule()) {
|
||||
rules.remove(rules.size() - 1);
|
||||
}
|
||||
}
|
||||
rules.add(recs[i]);
|
||||
}
|
||||
return rules;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets rule records that have either "max" or cover the endYear
|
||||
* value in its DST schedule.
|
||||
*
|
||||
* @return rules that contain last DST schedule. An empty
|
||||
* ArrayList is returned if no last rules are found.
|
||||
*/
|
||||
List<RuleRec> getLastRules() {
|
||||
RuleRec start = null;
|
||||
RuleRec end = null;
|
||||
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
RuleRec rec = list.get(i);
|
||||
if (rec.isLastRule()) {
|
||||
if (rec.getSave() > 0) {
|
||||
start = rec;
|
||||
} else {
|
||||
end = rec;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (start == null || end == null) {
|
||||
int endYear = Zoneinfo.getEndYear();
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
RuleRec rec = list.get(i);
|
||||
if (endYear >= rec.getFromYear() && endYear <= rec.getToYear()) {
|
||||
if (start == null && rec.getSave() > 0) {
|
||||
start = rec;
|
||||
} else {
|
||||
if (end == null && rec.getSave() == 0) {
|
||||
end = rec;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<RuleRec> r = new ArrayList<RuleRec>(2);
|
||||
if (start == null || end == null) {
|
||||
if (start != null || end != null) {
|
||||
Main.warning("found last rules for "+name+" inconsistent.");
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
r.add(start);
|
||||
r.add(end);
|
||||
return r;
|
||||
}
|
||||
}
|
@ -1,184 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* RuleDay class represents the value of the "ON" field. The day of
|
||||
* week values start from 1 following the {@link java.util.Calendar}
|
||||
* convention.
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
class RuleDay {
|
||||
private String dayName = null;
|
||||
private DayOfWeek dow;
|
||||
private boolean lastOne = false;
|
||||
private int soonerOrLater = 0;
|
||||
private int thanDayOfMonth; // day of month (e.g., 8 for "Sun>=8")
|
||||
|
||||
RuleDay() {
|
||||
}
|
||||
|
||||
RuleDay(int day) {
|
||||
thanDayOfMonth = day;
|
||||
}
|
||||
|
||||
int getDay() {
|
||||
return thanDayOfMonth;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the day of week value (1-based)
|
||||
*/
|
||||
int getDayOfWeekNum() {
|
||||
return dow.value();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if this rule day represents the last day of
|
||||
* week. (e.g., lastSun).
|
||||
*/
|
||||
boolean isLast() {
|
||||
return lastOne;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if this rule day represents the day of week on or
|
||||
* later than (after) the {@link #getDay}. (e.g., Sun>=1)
|
||||
*/
|
||||
boolean isLater() {
|
||||
return soonerOrLater > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if this rule day represents the day of week on or
|
||||
* earlier than (before) the {@link #getDay}. (e.g., Sun<=15)
|
||||
*/
|
||||
boolean isEarlier() {
|
||||
return soonerOrLater < 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if this rule day represents an exact day.
|
||||
*/
|
||||
boolean isExact() {
|
||||
return soonerOrLater == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the "ON" field and constructs a RuleDay.
|
||||
* @param day an "ON" field string (e.g., "Sun>=1")
|
||||
* @return a RuleDay representing the given "ON" field
|
||||
*/
|
||||
static RuleDay parse(String day) {
|
||||
RuleDay d = new RuleDay();
|
||||
if (day.startsWith("last")) {
|
||||
d.lastOne = true;
|
||||
d.dayName = day.substring(4);
|
||||
d.dow = getDOW(d.dayName);
|
||||
} else {
|
||||
int index;
|
||||
if ((index = day.indexOf(">=")) != -1) {
|
||||
d.dayName = day.substring(0, index);
|
||||
d.dow = getDOW(d.dayName);
|
||||
d.soonerOrLater = 1; // greater or equal
|
||||
d.thanDayOfMonth = Integer.parseInt(day.substring(index+2));
|
||||
} else if ((index = day.indexOf("<=")) != -1) {
|
||||
d.dayName = day.substring(0, index);
|
||||
d.dow = getDOW(d.dayName);
|
||||
d.soonerOrLater = -1; // less or equal
|
||||
d.thanDayOfMonth = Integer.parseInt(day.substring(index+2));
|
||||
} else {
|
||||
// it should be an integer value.
|
||||
d.thanDayOfMonth = Integer.parseInt(day);
|
||||
}
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts this RuleDay to the SimpleTimeZone day rule.
|
||||
* @return the converted SimpleTimeZone day rule
|
||||
*/
|
||||
int getDayForSimpleTimeZone() {
|
||||
if (isLast()) {
|
||||
return -1;
|
||||
}
|
||||
return isEarlier() ? -getDay() : getDay();
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts this RuleDay to the SimpleTimeZone day-of-week rule.
|
||||
* @return the SimpleTimeZone day-of-week rule value
|
||||
*/
|
||||
int getDayOfWeekForSimpleTimeZoneInt() {
|
||||
if (isEarlier() || isLater()) {
|
||||
return -getDayOfWeekNum();
|
||||
}
|
||||
return isLast() ? getDayOfWeekNum() : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the string representation of the {@link
|
||||
* #getDayOfWeekForSimpleTimeZoneInt} value
|
||||
*/
|
||||
String getDayOfWeekForSimpleTimeZone() {
|
||||
int d = getDayOfWeekForSimpleTimeZoneInt();
|
||||
if (d == 0) {
|
||||
return "0";
|
||||
}
|
||||
String sign = "";
|
||||
if (d < 0) {
|
||||
sign = "-";
|
||||
d = -d;
|
||||
}
|
||||
return sign + toString(d);
|
||||
}
|
||||
|
||||
private static DayOfWeek getDOW(String name) {
|
||||
int len = name.length();
|
||||
|
||||
if (name.regionMatches(true, 0, "Monday", 0, len)) return DayOfWeek.MONDAY;
|
||||
if (name.regionMatches(true, 0, "Tuesday", 0, len)) return DayOfWeek.TUESDAY;
|
||||
if (name.regionMatches(true, 0, "Wednesday", 0, len)) return DayOfWeek.WEDNESDAY;
|
||||
if (name.regionMatches(true, 0, "Thursday", 0, len)) return DayOfWeek.THURSDAY;
|
||||
if (name.regionMatches(true, 0, "Friday", 0, len)) return DayOfWeek.FRIDAY;
|
||||
if (name.regionMatches(true, 0, "Saturday", 0, len)) return DayOfWeek.SATURDAY;
|
||||
if (name.regionMatches(true, 0, "Sunday", 0, len)) return DayOfWeek.SUNDAY;
|
||||
|
||||
throw new IllegalArgumentException("Unknown day-of-week: " + name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the specified day of week value to the day-of-week
|
||||
* name defined in {@link java.util.Calendar}.
|
||||
* @param dow 1-based day of week value
|
||||
* @return the Calendar day of week name with "Calendar." prefix.
|
||||
* @throws IllegalArgumentException if the specified dow value is out of range.
|
||||
*/
|
||||
static String toString(int dow) {
|
||||
if (dow >= DayOfWeek.SUNDAY.value() && dow <= DayOfWeek.SATURDAY.value()) {
|
||||
return "Calendar." + DayOfWeek.values()[dow - 1];
|
||||
}
|
||||
throw new IllegalArgumentException("wrong Day_of_Week number: " + dow);
|
||||
}
|
||||
}
|
@ -1,229 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
* RuleRec class represents one record of the Rule set.
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
class RuleRec {
|
||||
private int fromYear;
|
||||
private int toYear;
|
||||
private String type;
|
||||
private Month inMonth;
|
||||
private RuleDay onDay;
|
||||
private Time atTime;
|
||||
private int save;
|
||||
private String letters;
|
||||
private String line;
|
||||
private boolean isLastRule;
|
||||
|
||||
int getFromYear() {
|
||||
return fromYear;
|
||||
}
|
||||
|
||||
int getToYear() {
|
||||
return toYear;
|
||||
}
|
||||
|
||||
Month getMonth() {
|
||||
return inMonth;
|
||||
}
|
||||
|
||||
int getMonthNum() {
|
||||
return inMonth.value();
|
||||
}
|
||||
|
||||
RuleDay getDay() {
|
||||
return onDay;
|
||||
}
|
||||
|
||||
Time getTime() {
|
||||
return atTime;
|
||||
}
|
||||
|
||||
int getSave() {
|
||||
return save;
|
||||
}
|
||||
|
||||
String getLine() {
|
||||
return line;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the line from the text file.
|
||||
* @param line the text of the line
|
||||
*/
|
||||
void setLine(String line) {
|
||||
this.line = line;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if the rule type is "odd".
|
||||
*/
|
||||
boolean isOdd() {
|
||||
return "odd".equals(type);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if the rule type is "even".
|
||||
*/
|
||||
boolean isEven() {
|
||||
return "even".equals(type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if this rule record is the last DST schedule rule.
|
||||
*
|
||||
* @return true if this rule record has "max" as TO (year).
|
||||
*/
|
||||
boolean isLastRule() {
|
||||
return isLastRule;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the unadjusted until time of the specified ZoneRec
|
||||
* is the same as the transition time of this rule in the same
|
||||
* year as the ZoneRec until year.
|
||||
*
|
||||
* @param zrec ZoneRec to compare to
|
||||
* @param save the amount of daylight saving in milliseconds
|
||||
* @param gmtOffset the GMT offset value in milliseconds
|
||||
* @return true if the unadjusted until time is the same as rule's
|
||||
* transition time.
|
||||
*/
|
||||
boolean isSameTransition(ZoneRec zrec, int save, int gmtOffset) {
|
||||
long until, transition;
|
||||
|
||||
if (zrec.getUntilTime().getType() != atTime.getType()) {
|
||||
until = zrec.getLocalUntilTime(save, gmtOffset);
|
||||
transition = Time.getLocalTime(zrec.getUntilYear(),
|
||||
getMonth(),
|
||||
getDay(),
|
||||
save,
|
||||
gmtOffset,
|
||||
atTime);
|
||||
} else {
|
||||
until = zrec.getLocalUntilTime();
|
||||
transition = Time.getLocalTime(zrec.getUntilYear(),
|
||||
getMonth(),
|
||||
getDay(),
|
||||
atTime.getTime());
|
||||
}
|
||||
|
||||
return until == transition;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a Rule line and returns a RuleRec object.
|
||||
*
|
||||
* @param tokens a StringTokenizer object that should contain a
|
||||
* token for the "FROM" field and the rest.
|
||||
* @return a RuleRec object.
|
||||
*/
|
||||
static RuleRec parse(StringTokenizer tokens) {
|
||||
RuleRec rec = new RuleRec();
|
||||
try {
|
||||
// FROM
|
||||
String token = tokens.nextToken();
|
||||
try {
|
||||
rec.fromYear = Integer.parseInt(token);
|
||||
} catch (NumberFormatException e) {
|
||||
// it's not integer
|
||||
if ("min".equals(token) || "minimum".equals(token)) {
|
||||
rec.fromYear = Zoneinfo.getMinYear();
|
||||
} else if ("max".equals(token) || "maximum".equals(token)) {
|
||||
rec.fromYear = Zoneinfo.getMaxYear();
|
||||
} else {
|
||||
Main.panic("invalid year value: "+token);
|
||||
}
|
||||
}
|
||||
|
||||
// TO
|
||||
token = tokens.nextToken();
|
||||
rec.isLastRule = false;
|
||||
try {
|
||||
rec.toYear = Integer.parseInt(token);
|
||||
} catch (NumberFormatException e) {
|
||||
// it's not integer
|
||||
int len = token.length();
|
||||
if (token.regionMatches(true, 0, "minimum", 0, len)) {
|
||||
rec.fromYear = Zoneinfo.getMinYear();
|
||||
} else if (token.regionMatches(true, 0, "maximum", 0, len)) {
|
||||
rec.toYear = Integer.MAX_VALUE;
|
||||
rec.isLastRule = true;
|
||||
} else if (token.regionMatches(true, 0, "only", 0, len)) {
|
||||
rec.toYear = rec.fromYear;
|
||||
} else {
|
||||
Main.panic("invalid year value: "+token);
|
||||
}
|
||||
}
|
||||
|
||||
// TYPE
|
||||
rec.type = tokens.nextToken();
|
||||
|
||||
// IN
|
||||
rec.inMonth = Month.parse(tokens.nextToken());
|
||||
|
||||
// ON
|
||||
rec.onDay = RuleDay.parse(tokens.nextToken());
|
||||
|
||||
// AT
|
||||
rec.atTime = Time.parse(tokens.nextToken());
|
||||
|
||||
// SAVE
|
||||
rec.save = (int) Time.parse(tokens.nextToken()).getTime();
|
||||
|
||||
// LETTER/S
|
||||
rec.letters = tokens.nextToken();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return rec;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the transition time of the given year under this rule.
|
||||
* @param year the year value
|
||||
* @param gmtOffset the GMT offset value in milliseconds
|
||||
* @param save the amount of daylight save time
|
||||
* @return the transition time in milliseconds of the given year in UTC.
|
||||
*/
|
||||
long getTransitionTime(int year, int gmtOffset, int save) {
|
||||
long time = Time.getLocalTime(year, getMonth(),
|
||||
getDay(), atTime.getTime());
|
||||
if (atTime.isSTD()) {
|
||||
time -= gmtOffset;
|
||||
} else if (atTime.isWall()) {
|
||||
time -= gmtOffset + save;
|
||||
}
|
||||
return time;
|
||||
}
|
||||
|
||||
private static int getInt(StringTokenizer tokens) {
|
||||
String token = tokens.nextToken();
|
||||
return Integer.parseInt(token);
|
||||
}
|
||||
}
|
@ -1,184 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TreeMap;
|
||||
import java.util.TreeSet;
|
||||
|
||||
/**
|
||||
* <code>Simple</code> generates TimeZoneData, which had been used as internal
|
||||
* data of TimeZone before J2SDK1.3.
|
||||
* Since J2SDK1.4 doesn't need TimeZoneData, this class is for maintenance
|
||||
* of old JDK release.
|
||||
*/
|
||||
class Simple extends BackEnd {
|
||||
|
||||
/**
|
||||
* Zone records which are applied for given year.
|
||||
*/
|
||||
private static Map<String,ZoneRec> lastZoneRecs = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Rule records which are applied for given year.
|
||||
*/
|
||||
private static Map<String,List<RuleRec>> lastRules = new TreeMap<>();
|
||||
|
||||
/**
|
||||
* zone IDs sorted by their GMT offsets. If zone's GMT
|
||||
* offset will change in the future, its last known offset is
|
||||
* used.
|
||||
*/
|
||||
private SortedMap<Integer, Set<String>> zonesByOffset = new TreeMap<>();
|
||||
|
||||
/**
|
||||
* Sets last Rule records and Zone records for given timezone to
|
||||
* each Map.
|
||||
*
|
||||
* @param tz Timezone object for each zone
|
||||
* @return always 0
|
||||
*/
|
||||
int processZoneinfo(Timezone tz) {
|
||||
String zonename = tz.getName();
|
||||
|
||||
lastRules.put(zonename, tz.getLastRules());
|
||||
lastZoneRecs.put(zonename, tz.getLastZoneRec());
|
||||
|
||||
// Populate zonesByOffset. (Zones that will change their
|
||||
// GMT offsets are also added to zonesByOffset here.)
|
||||
int lastKnownOffset = tz.getRawOffset();
|
||||
Set<String> set = zonesByOffset.get(lastKnownOffset);
|
||||
if (set == null) {
|
||||
set = new TreeSet<>();
|
||||
zonesByOffset.put(lastKnownOffset, set);
|
||||
}
|
||||
set.add(zonename);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates TimeZoneData to output SimpleTimeZone data.
|
||||
* @param map Mappings object which is generated by {@link Main#compile}.
|
||||
* @return 0 if no error occurred, otherwise 1.
|
||||
*/
|
||||
int generateSrc(Mappings map) {
|
||||
try {
|
||||
File outD = new File(Main.getOutputDir());
|
||||
outD.mkdirs();
|
||||
|
||||
FileWriter fw =
|
||||
new FileWriter(new File(outD, "TimeZoneData.java"), false);
|
||||
BufferedWriter out = new BufferedWriter(fw);
|
||||
|
||||
out.write("import java.util.SimpleTimeZone;\n\n");
|
||||
out.write(" static SimpleTimeZone zones[] = {\n");
|
||||
|
||||
Map<String,String> a = map.getAliases();
|
||||
List<Integer> roi = map.getRawOffsetsIndex();
|
||||
List<Set<String>> roit = map.getRawOffsetsIndexTable();
|
||||
|
||||
int index = 0;
|
||||
for (int offset : zonesByOffset.keySet()) {
|
||||
int o = roi.get(index);
|
||||
Set<String> set = zonesByOffset.get(offset);
|
||||
if (offset == o) {
|
||||
// Merge aliases into zonesByOffset
|
||||
set.addAll(roit.get(index));
|
||||
}
|
||||
index++;
|
||||
|
||||
for (String key : set) {
|
||||
ZoneRec zrec;
|
||||
String realname;
|
||||
List<RuleRec> stz;
|
||||
if ((realname = a.get(key)) != null) {
|
||||
// if this alias is not targeted, ignore it.
|
||||
if (!Zone.isTargetZone(key)) {
|
||||
continue;
|
||||
}
|
||||
stz = lastRules.get(realname);
|
||||
zrec = lastZoneRecs.get(realname);
|
||||
} else {
|
||||
stz = lastRules.get(key);
|
||||
zrec = lastZoneRecs.get(key);
|
||||
}
|
||||
|
||||
out.write("\t//--------------------------------------------------------------------\n");
|
||||
String s = Time.toFormedString(offset);
|
||||
out.write("\tnew SimpleTimeZone(" +
|
||||
Time.toFormedString(offset) + ", \"" + key + "\"");
|
||||
if (realname != null) {
|
||||
out.write(" /* " + realname + " */");
|
||||
}
|
||||
|
||||
if (stz == null) {
|
||||
out.write("),\n");
|
||||
} else {
|
||||
RuleRec rr0 = stz.get(0);
|
||||
RuleRec rr1 = stz.get(1);
|
||||
|
||||
out.write(",\n\t " + Month.toString(rr0.getMonthNum()) +
|
||||
", " + rr0.getDay().getDayForSimpleTimeZone() + ", " +
|
||||
rr0.getDay().getDayOfWeekForSimpleTimeZone() + ", " +
|
||||
Time.toFormedString((int)rr0.getTime().getTime()) + ", " +
|
||||
rr0.getTime().getTypeForSimpleTimeZone() + ",\n" +
|
||||
|
||||
"\t " + Month.toString(rr1.getMonthNum()) + ", " +
|
||||
rr1.getDay().getDayForSimpleTimeZone() + ", " +
|
||||
rr1.getDay().getDayOfWeekForSimpleTimeZone() + ", " +
|
||||
Time.toFormedString((int)rr1.getTime().getTime())+ ", " +
|
||||
rr1.getTime().getTypeForSimpleTimeZone() + ",\n" +
|
||||
|
||||
"\t " + Time.toFormedString(rr0.getSave()) + "),\n");
|
||||
|
||||
out.write("\t// " + rr0.getLine() + "\n");
|
||||
out.write("\t// " + rr1.getLine() + "\n");
|
||||
}
|
||||
|
||||
String zline = zrec.getLine();
|
||||
if (zline.indexOf("Zone") == -1) {
|
||||
zline = "Zone " + key + "\t" + zline.trim();
|
||||
}
|
||||
out.write("\t// " + zline + "\n");
|
||||
}
|
||||
}
|
||||
out.write(" };\n");
|
||||
|
||||
out.close();
|
||||
fw.close();
|
||||
} catch(IOException e) {
|
||||
Main.panic("IO error: "+e.getMessage());
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
@ -1,283 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8007572 8008161 8157792 8212970 8224560 8324065
|
||||
* @summary Test whether the TimeZone generated from JSR310 tzdb is the same
|
||||
* as the one from the tz data from javazic
|
||||
* @modules java.base/sun.util.calendar:+open
|
||||
* @build BackEnd Checksum DayOfWeek Gen GenDoc Main Mappings Month
|
||||
* Rule RuleDay RuleRec Simple TestZoneInfo310 Time Timezone
|
||||
* TzIDOldMapping Zone ZoneInfoFile ZoneInfoOld ZoneRec Zoneinfo
|
||||
* @run main TestZoneInfo310
|
||||
*/
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.*;
|
||||
import java.nio.file.*;
|
||||
import java.util.*;
|
||||
import java.util.regex.*;
|
||||
import java.time.zone.*;
|
||||
import java.time.ZoneId;
|
||||
|
||||
public class TestZoneInfo310 {
|
||||
|
||||
public static void main(String[] args) throws Throwable {
|
||||
|
||||
String TESTDIR = System.getProperty("test.dir", ".");
|
||||
Path tzdir = Paths.get(System.getProperty("test.root"),
|
||||
"../../src/java.base/share/data/tzdata");
|
||||
String tzfiles = "africa antarctica asia australasia europe northamerica southamerica backward etcetera gmt";
|
||||
Path jdk_tzdir = Paths.get(System.getProperty("test.src"), "tzdata_jdk");
|
||||
String jdk_tzfiles = "jdk11_backward";
|
||||
String zidir = TESTDIR + File.separator + "zi";
|
||||
File fZidir = new File(zidir);
|
||||
if (!fZidir.exists()) {
|
||||
fZidir.mkdirs();
|
||||
}
|
||||
Matcher m = Pattern.compile("tzdata(?<ver>[0-9]{4}[A-z])")
|
||||
.matcher(new String(Files.readAllBytes(tzdir.resolve("VERSION")), "ascii"));
|
||||
String ver = m.find() ? m.group("ver") : "NULL";
|
||||
|
||||
ArrayList<String> alist = new ArrayList<>();
|
||||
alist.add("-V");
|
||||
alist.add(ver);
|
||||
alist.add("-d");
|
||||
alist.add(zidir);
|
||||
for (String f : tzfiles.split(" ")) {
|
||||
alist.add(tzdir.resolve(f).toString());
|
||||
}
|
||||
for (String f : jdk_tzfiles.split(" ")) {
|
||||
alist.add(jdk_tzdir.resolve(f).toString());
|
||||
}
|
||||
System.out.println("Compiling tz files!");
|
||||
Main.main(alist.toArray(new String[alist.size()]));
|
||||
|
||||
//////////////////////////////////
|
||||
System.out.println("testing!");
|
||||
ZoneInfoFile.ziDir = zidir;
|
||||
long t0, t1;
|
||||
|
||||
t0 = System.nanoTime();
|
||||
ZoneInfoOld.getTimeZone("America/Los_Angeles");
|
||||
t1 = System.nanoTime();
|
||||
System.out.printf("OLD.getZoneInfoOld()[1]=%d%n", (t1 - t0) / 1000);
|
||||
|
||||
t0 = System.nanoTime();
|
||||
ZoneInfoOld.getTimeZone("America/New_York");
|
||||
t1 = System.nanoTime();
|
||||
System.out.printf("OLD.getZoneInfoOld()[2]=%d%n", (t1 - t0) / 1000);
|
||||
|
||||
t0 = System.nanoTime();
|
||||
ZoneInfoOld.getTimeZone("America/Denver");
|
||||
t1 = System.nanoTime();
|
||||
System.out.printf("OLD.getZoneInfoOld()[3]=%d%n", (t1 - t0) / 1000);
|
||||
|
||||
t0 = System.nanoTime();
|
||||
String[] zids_old = ZoneInfoOld.getAvailableIDs();
|
||||
t1 = System.nanoTime();
|
||||
System.out.printf("OLD.getAvailableIDs()=%d, total=%d%n",
|
||||
(t1 - t0) / 1000, zids_old.length);
|
||||
Arrays.sort(zids_old);
|
||||
|
||||
t0 = System.nanoTime();
|
||||
String[] alias_old = ZoneInfoOld.getAliasTable()
|
||||
.keySet().toArray(new String[0]);
|
||||
t1 = System.nanoTime();
|
||||
System.out.printf("OLD.getAliasTable()=%d, total=%d%n",
|
||||
(t1 - t0) / 1000, alias_old.length);
|
||||
Arrays.sort(alias_old);
|
||||
|
||||
t0 = System.currentTimeMillis();
|
||||
for (String zid : zids_old) {
|
||||
ZoneInfoOld.getTimeZone(zid);
|
||||
}
|
||||
t1 = System.currentTimeMillis();
|
||||
System.out.printf("OLD.TotalTZ()=%d (ms)%n", t1 - t0);
|
||||
|
||||
/*
|
||||
t0 = System.nanoTime();
|
||||
ZoneId.of("America/Los_Angeles").getRules();
|
||||
t1 = System.nanoTime();
|
||||
System.out.printf("NEW.ZoneId.of()[1]=%d%n", (t1 - t0) / 1000);
|
||||
*/
|
||||
t0 = System.nanoTime();
|
||||
TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
|
||||
t1 = System.nanoTime();
|
||||
System.out.printf("NEW.getTimeZone()[1]=%d%n", (t1 - t0) / 1000);
|
||||
|
||||
t0 = System.nanoTime();
|
||||
tz = TimeZone.getTimeZone("America/New_York");
|
||||
t1 = System.nanoTime();
|
||||
System.out.printf("NEW.getTimeZone()[2]=%d%n", (t1 - t0) / 1000);
|
||||
|
||||
t0 = System.nanoTime();
|
||||
tz = TimeZone.getTimeZone("America/Denver");
|
||||
t1 = System.nanoTime();
|
||||
System.out.printf("NEW.getTimeZone()[3]=%d%n", (t1 - t0) / 1000);
|
||||
|
||||
t0 = System.nanoTime();
|
||||
String[] zids_new = TimeZone.getAvailableIDs();
|
||||
t1 = System.nanoTime();
|
||||
System.out.printf("NEW.getAvailableIDs()=%d, total=%d%n",
|
||||
(t1 - t0) / 1000, zids_new.length);
|
||||
Arrays.sort(zids_new);
|
||||
|
||||
t0 = System.nanoTime();
|
||||
String[] alias_new = sun.util.calendar.ZoneInfo.getAliasTable()
|
||||
.keySet().toArray(new String[0]);
|
||||
t1 = System.nanoTime();
|
||||
System.out.printf("NEW.getAliasTable()=%d, total=%d%n",
|
||||
(t1 - t0) / 1000, alias_new.length);
|
||||
Arrays.sort(alias_new);
|
||||
|
||||
t0 = System.currentTimeMillis();
|
||||
for (String zid : zids_new) {
|
||||
TimeZone.getTimeZone(zid);
|
||||
}
|
||||
t1 = System.currentTimeMillis();
|
||||
System.out.printf("NEW.TotalTZ()=%d (ms)%n", t1 - t0);
|
||||
|
||||
if (!Arrays.equals(zids_old, zids_new)) {
|
||||
throw new RuntimeException(" FAILED: availableIds don't match");
|
||||
}
|
||||
|
||||
if (!Arrays.equals(alias_old, alias_new)) {
|
||||
throw new RuntimeException(" FAILED: aliases don't match");
|
||||
}
|
||||
|
||||
for (String zid : zids_new) {
|
||||
ZoneInfoOld zi = toZoneInfoOld(TimeZone.getTimeZone(zid));
|
||||
ZoneInfoOld ziOLD = (ZoneInfoOld)ZoneInfoOld.getTimeZone(zid);
|
||||
/*
|
||||
* Ignoring the failing TimeZones which have negative DST
|
||||
* save time in IANA tzdata, as javazic/ZoneInfoOld cannot
|
||||
* handle the negative DST.
|
||||
*
|
||||
* These are the zones/rules that employ negative DST in vanguard
|
||||
* format (as of 2019a), Palestine added in 2022d:
|
||||
*
|
||||
* - Rule "Eire"
|
||||
* - Rule "Morocco"
|
||||
* - Rule "Namibia"
|
||||
* - Rule "Palestine"
|
||||
* - Zone "Europe/Prague"
|
||||
*/
|
||||
if (zid.equals("Africa/Casablanca") || // uses "Morocco" rule
|
||||
zid.equals("Africa/El_Aaiun") || // uses "Morocco" rule
|
||||
zid.equals("Africa/Windhoek") || // uses "Namibia" rule
|
||||
zid.equals("Eire") ||
|
||||
zid.equals("Europe/Bratislava") || // link to "Europe/Prague"
|
||||
zid.equals("Europe/Dublin") || // uses "Eire" rule
|
||||
zid.equals("Europe/Prague") ||
|
||||
zid.equals("Asia/Gaza") || // uses "Palestine" rule
|
||||
zid.equals("Asia/Hebron")) { // uses "Palestine" rule
|
||||
continue;
|
||||
}
|
||||
if (! zi.equalsTo(ziOLD)) {
|
||||
System.out.println(zi.diffsTo(ziOLD));
|
||||
throw new RuntimeException(" FAILED: " + zid);
|
||||
}
|
||||
}
|
||||
delete(fZidir);
|
||||
|
||||
// test tzdb version
|
||||
if (!ver.equals(sun.util.calendar.ZoneInfoFile.getVersion())) {
|
||||
System.out.printf(" FAILED: ver=%s, expected=%s%n",
|
||||
sun.util.calendar.ZoneInfoFile.getVersion(), ver);
|
||||
throw new RuntimeException("Version test failed");
|
||||
}
|
||||
|
||||
// test getAvailableIDs(raw);
|
||||
zids_new = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000);
|
||||
Arrays.sort(zids_new);
|
||||
zids_old = ZoneInfoOld.getAvailableIDs(-8 * 60 * 60 * 1000);
|
||||
Arrays.sort(zids_old);
|
||||
if (!Arrays.equals(zids_new, zids_old)) {
|
||||
System.out.println("------------------------");
|
||||
System.out.println("NEW.getAvailableIDs(-8:00)");
|
||||
for (String zid : zids_new) {
|
||||
System.out.println(zid);
|
||||
}
|
||||
System.out.println("------------------------");
|
||||
System.out.println("OLD.getAvailableIDs(-8:00)");
|
||||
for (String zid : zids_old) {
|
||||
System.out.println(zid);
|
||||
}
|
||||
throw new RuntimeException(" FAILED: availableIds(offset) don't match");
|
||||
}
|
||||
}
|
||||
|
||||
private static void delete(File f) {
|
||||
if (f.isDirectory()) {
|
||||
for (File f0 : f.listFiles()) {
|
||||
delete(f0);
|
||||
}
|
||||
}
|
||||
f.delete();
|
||||
}
|
||||
|
||||
// to access sun.util.calendar.ZoneInfo's private fields
|
||||
static Class<?> ziClz;
|
||||
static Field rawOffset;
|
||||
static Field checksum;
|
||||
static Field dstSavings;
|
||||
static Field transitions;
|
||||
static Field offsets;
|
||||
static Field simpleTimeZoneParams;
|
||||
static Field willGMTOffsetChange;
|
||||
static {
|
||||
try {
|
||||
ziClz = Class.forName("sun.util.calendar.ZoneInfo");
|
||||
rawOffset = ziClz.getDeclaredField("rawOffset");
|
||||
checksum = ziClz.getDeclaredField("checksum");
|
||||
dstSavings = ziClz.getDeclaredField("dstSavings");
|
||||
transitions = ziClz.getDeclaredField("transitions");
|
||||
offsets = ziClz.getDeclaredField("offsets");
|
||||
simpleTimeZoneParams = ziClz.getDeclaredField("simpleTimeZoneParams");
|
||||
willGMTOffsetChange = ziClz.getDeclaredField("willGMTOffsetChange");
|
||||
rawOffset.setAccessible(true);
|
||||
checksum.setAccessible(true);
|
||||
dstSavings.setAccessible(true);
|
||||
transitions.setAccessible(true);
|
||||
offsets.setAccessible(true);
|
||||
simpleTimeZoneParams.setAccessible(true);
|
||||
willGMTOffsetChange.setAccessible(true);
|
||||
} catch (Exception x) {
|
||||
throw new RuntimeException(x);
|
||||
}
|
||||
}
|
||||
|
||||
private static ZoneInfoOld toZoneInfoOld(TimeZone tz) throws Exception {
|
||||
return new ZoneInfoOld(tz.getID(),
|
||||
rawOffset.getInt(tz),
|
||||
dstSavings.getInt(tz),
|
||||
checksum.getInt(tz),
|
||||
(long[])transitions.get(tz),
|
||||
(int[])offsets.get(tz),
|
||||
(int[])simpleTimeZoneParams.get(tz),
|
||||
willGMTOffsetChange.getBoolean(tz));
|
||||
}
|
||||
|
||||
}
|
@ -1,339 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.util.Locale;
|
||||
import sun.util.calendar.CalendarDate;
|
||||
import sun.util.calendar.CalendarSystem;
|
||||
import sun.util.calendar.Gregorian;
|
||||
|
||||
/**
|
||||
* Time class represents the "AT" field and other time related information.
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
class Time {
|
||||
|
||||
static final Gregorian gcal = CalendarSystem.getGregorianCalendar();
|
||||
|
||||
// type is wall clock time
|
||||
private static final int WALL = 1;
|
||||
|
||||
// type is standard time
|
||||
private static final int STD = 2;
|
||||
|
||||
// type is UTC
|
||||
private static final int UTC = 3;
|
||||
|
||||
// type of representing time
|
||||
private int type;
|
||||
|
||||
/**
|
||||
* Time from the EPOCH in milliseconds
|
||||
*/
|
||||
private long time;
|
||||
|
||||
/**
|
||||
* Current time in milliseconds
|
||||
*/
|
||||
private static final long currentTime = System.currentTimeMillis();
|
||||
|
||||
Time() {
|
||||
time = 0L;
|
||||
}
|
||||
|
||||
Time(long time) {
|
||||
this.time = time;
|
||||
}
|
||||
|
||||
void setType(int type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
long getTime() {
|
||||
return time;
|
||||
}
|
||||
|
||||
int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
static long getCurrentTime() {
|
||||
return currentTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if the time is represented in wall-clock time.
|
||||
*/
|
||||
boolean isWall() {
|
||||
return type == WALL;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if the time is represented in standard time.
|
||||
*/
|
||||
boolean isSTD() {
|
||||
return type == STD;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if the time is represented in UTC time.
|
||||
*/
|
||||
boolean isUTC() {
|
||||
return type == UTC;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the type to a string that represents the type in the
|
||||
* SimpleTimeZone time mode. (e.g., "SimpleTimeZone.WALL_TIME").
|
||||
* @return the converted string or null if the type is undefined.
|
||||
*/
|
||||
String getTypeForSimpleTimeZone() {
|
||||
String stz = "SimpleTimeZone.";
|
||||
if (isWall()) {
|
||||
return stz+"WALL_TIME";
|
||||
}
|
||||
else if (isSTD()) {
|
||||
return stz+"STANDARD_TIME";
|
||||
}
|
||||
else if (isUTC()) {
|
||||
return stz+"UTC_TIME";
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the given Gregorian calendar field values to local time.
|
||||
* Local time is represented by the amount of milliseconds from
|
||||
* January 1, 1970 0:00 GMT.
|
||||
* @param year the year value
|
||||
* @param month the Month value
|
||||
* @param day the day represented by {@link RuleDay}
|
||||
* @param save the amount of daylight time in milliseconds
|
||||
* @param gmtOffset the GMT offset in milliseconds
|
||||
* @param time the time of the day represented by {@link Time}
|
||||
* @return local time
|
||||
*/
|
||||
static long getLocalTime(int year, Month month, RuleDay day, int save,
|
||||
int gmtOffset, Time time) {
|
||||
long t = time.getTime();
|
||||
|
||||
if (time.isSTD())
|
||||
t = time.getTime() + save;
|
||||
else if (time.isUTC())
|
||||
t = time.getTime() + save + gmtOffset;
|
||||
|
||||
return getLocalTime(year, month, day, t);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the given Gregorian calendar field values to local time.
|
||||
* Local time is represented by the amount of milliseconds from
|
||||
* January 1, 1970 0:00 GMT.
|
||||
* @param year the year value
|
||||
* @param month the Month value
|
||||
* @param day the day value
|
||||
* @param time the time of the day in milliseconds
|
||||
* @return local time
|
||||
*/
|
||||
static long getLocalTime(int year, Month month, int day, long time) {
|
||||
CalendarDate date = gcal.newCalendarDate(null);
|
||||
date.setDate(year, month.value(), day);
|
||||
long millis = gcal.getTime(date);
|
||||
return millis + time;
|
||||
}
|
||||
|
||||
/**
|
||||
* Equivalent to <code>getLocalTime(year, month, day, (long)time)</code>.
|
||||
* @param year the year value
|
||||
* @param month the Month value
|
||||
* @param day the day value
|
||||
* @param time the time of the day in milliseconds
|
||||
* @return local time
|
||||
*/
|
||||
static long getLocalTime(int year, Month month, int day, int time) {
|
||||
return getLocalTime(year, month, day, (long)time);
|
||||
}
|
||||
|
||||
/**
|
||||
* Equivalent to {@link #getLocalTime(int, Month, RuleDay, int)
|
||||
* getLocalTime(year, month, day, (int) time)}.
|
||||
* @param year the year value
|
||||
* @param month the Month value
|
||||
* @param day the day represented by {@link RuleDay}
|
||||
* @param time the time of the day represented by {@link Time}
|
||||
* @return local time
|
||||
*/
|
||||
static long getLocalTime(int year, Month month, RuleDay day, long time) {
|
||||
return getLocalTime(year, month, day, (int) time);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the given Gregorian calendar field values to local time.
|
||||
* Local time is represented by the amount of milliseconds from
|
||||
* January 1, 1970 0:00 GMT.
|
||||
* @param year the year value
|
||||
* @param month the Month value
|
||||
* @param day the day represented by {@link RuleDay}
|
||||
* @param time the time of the day represented by {@link Time}
|
||||
* @return local time
|
||||
*/
|
||||
static long getLocalTime(int year, Month month, RuleDay day, int time) {
|
||||
CalendarDate cdate = gcal.newCalendarDate(null);
|
||||
int monthValue = month.value();
|
||||
|
||||
if (day.isLast()) { // e.g., "lastSun"
|
||||
cdate.setDate(year, monthValue, 1);
|
||||
cdate.setDayOfMonth(gcal.getMonthLength(cdate));
|
||||
cdate = gcal.getNthDayOfWeek(-1, day.getDayOfWeekNum(), cdate);
|
||||
} else if (day.isLater()) { // e.g., "Sun>=1"
|
||||
cdate.setDate(year, monthValue, day.getDay());
|
||||
cdate = gcal.getNthDayOfWeek(1, day.getDayOfWeekNum(), cdate);
|
||||
} else if (day.isExact()) {
|
||||
cdate.setDate(year, monthValue, day.getDay());
|
||||
} else if (day.isEarlier()) { // e.g., "Sun<=15"
|
||||
cdate.setDate(year, monthValue, day.getDay());
|
||||
cdate = gcal.getNthDayOfWeek(-1, day.getDayOfWeekNum(), cdate);
|
||||
} else {
|
||||
Main.panic("invalid day type: " + day);
|
||||
}
|
||||
return gcal.getTime(cdate) + time;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the given "AT" field and constructs a Time object.
|
||||
* @param the "AT" field string
|
||||
* @return the Time object
|
||||
*/
|
||||
static Time parse(String time) {
|
||||
int sign;
|
||||
int index = 0;
|
||||
Time tm;
|
||||
|
||||
if (time.charAt(0) == '-') {
|
||||
sign = -1;
|
||||
index++;
|
||||
} else {
|
||||
sign = 1;
|
||||
}
|
||||
int val = 0;
|
||||
int num = 0;
|
||||
int countDelim = 0;
|
||||
while (index < time.length()) {
|
||||
char c = time.charAt(index++);
|
||||
if (c == ':') {
|
||||
val = val * 60 + num;
|
||||
countDelim++;
|
||||
num = 0;
|
||||
continue;
|
||||
}
|
||||
int d = Character.digit(c, 10);
|
||||
if (d == -1) {
|
||||
--index;
|
||||
break;
|
||||
}
|
||||
num = num * 10 + d;
|
||||
}
|
||||
val = val * 60 + num;
|
||||
// convert val to second
|
||||
for (; countDelim < 2; countDelim++) {
|
||||
val *= 60;
|
||||
}
|
||||
tm = new Time((long)val * 1000 * sign);
|
||||
if (index < time.length()) {
|
||||
char c = time.charAt(index++);
|
||||
if (c == 's') {
|
||||
tm.setType(Time.STD);
|
||||
} else if (c == 'u' || c == 'g' || c == 'z') {
|
||||
tm.setType(Time.UTC);
|
||||
} else if (c == 'w') {
|
||||
tm.setType(Time.WALL);
|
||||
} else {
|
||||
Main.panic("unknown time mode: "+c);
|
||||
}
|
||||
} else {
|
||||
tm.setType(Time.WALL);
|
||||
}
|
||||
return tm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the given milliseconds string to a "[+-]hh:mm" string.
|
||||
* @param ms the milliseconds string
|
||||
*/
|
||||
static String toGMTFormat(String ms) {
|
||||
long sec = Long.parseLong(ms) / 1000;
|
||||
char sign;
|
||||
if (sec < 0) {
|
||||
sign = '-';
|
||||
sec = -sec;
|
||||
} else {
|
||||
sign = '+';
|
||||
}
|
||||
return String.format((Locale)null, "%c%02d:%02d",
|
||||
sign, sec/3600, (sec%3600)/60);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the given millisecond value to a string for a
|
||||
* SimpleTimeZone parameter.
|
||||
* @param ms the millisecond value
|
||||
* @return the string in a human readable form
|
||||
*/
|
||||
static String toFormedString(int ms) {
|
||||
StringBuilder s = new StringBuilder();
|
||||
boolean minus = false;
|
||||
|
||||
if (ms < 0) {
|
||||
s.append("-");
|
||||
minus = true;
|
||||
ms = -ms;
|
||||
} else if (ms == 0) {
|
||||
return "0";
|
||||
}
|
||||
|
||||
int hour = ms / (60 * 60 * 1000);
|
||||
ms %= (60 * 60 * 1000);
|
||||
int minute = ms / (60 * 1000);
|
||||
|
||||
if (hour != 0) {
|
||||
if (minus && minute != 0) {
|
||||
s.append("(");
|
||||
}
|
||||
s.append(Integer.toString(hour) + "*ONE_HOUR");
|
||||
}
|
||||
|
||||
if (minute != 0) {
|
||||
if (hour != 0) {
|
||||
s.append("+");
|
||||
}
|
||||
s.append(Integer.toString(minute) + "*ONE_MINUTE");
|
||||
if (minus && hour != 0) {
|
||||
s.append(")");
|
||||
}
|
||||
}
|
||||
|
||||
return s.toString();
|
||||
}
|
||||
}
|
@ -1,450 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Timezone represents all information of a single point of time to
|
||||
* generate its time zone database.
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
class Timezone {
|
||||
/**
|
||||
* zone name of this time zone
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* transition time values in UTC (millisecond)
|
||||
*/
|
||||
private List<Long> transitions;
|
||||
|
||||
/**
|
||||
* All offset values in millisecond
|
||||
* @see sun.util.calendar.ZoneInfo
|
||||
*/
|
||||
private List<Integer> offsets;
|
||||
|
||||
/**
|
||||
* Indices of GMT offset values (both raw and raw+saving)
|
||||
* at transitions
|
||||
*/
|
||||
private List<Integer> gmtOffsets;
|
||||
|
||||
/**
|
||||
* Indices of regular or "direct" saving time values
|
||||
* at transitions
|
||||
*/
|
||||
private List<Integer> dstOffsets;
|
||||
|
||||
/**
|
||||
* Zone records of this time zone
|
||||
*/
|
||||
private List<ZoneRec> usedZoneRecs;
|
||||
|
||||
/**
|
||||
* Rule records referred to by this time zone
|
||||
*/
|
||||
private List<RuleRec> usedRuleRecs;
|
||||
|
||||
/**
|
||||
* Type of DST rules in this time zone
|
||||
*/
|
||||
private int dstType;
|
||||
static final int UNDEF_DST = 0; // DST type not set yet
|
||||
static final int NO_DST = 1; // never observed DST
|
||||
static final int LAST_DST = 2; // last rule ends in DST (all year round DST-only)
|
||||
static final int X_DST = 3; // used to observe DST
|
||||
static final int DST = 4; // observing DST regularly
|
||||
|
||||
/**
|
||||
* Raw GMT offset of this time zone in the last rule
|
||||
*/
|
||||
private int rawOffset;
|
||||
|
||||
/**
|
||||
* The CRC32 value of the transitions data
|
||||
*/
|
||||
private int crc32;
|
||||
|
||||
/**
|
||||
* The last ZoneRec
|
||||
*/
|
||||
private ZoneRec lastZoneRec;
|
||||
|
||||
/**
|
||||
* The last DST rules. lastRules[0] is the DST start
|
||||
* rule. lastRules[1] is the DST end rules.
|
||||
*/
|
||||
private List<RuleRec> lastRules;
|
||||
|
||||
/**
|
||||
* The amount of DST saving value (millisecond) in the last DST
|
||||
* rule.
|
||||
*/
|
||||
private int lastSaving;
|
||||
|
||||
/**
|
||||
* true if the raw offset will change in the future time.
|
||||
*/
|
||||
private boolean willRawOffsetChange = false;
|
||||
|
||||
|
||||
/**
|
||||
* Constracts a Timezone object with the given zone name.
|
||||
* @param name the zone name
|
||||
*/
|
||||
Timezone(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the number of transitions
|
||||
*/
|
||||
int getNTransitions() {
|
||||
if (transitions == null) {
|
||||
return 0;
|
||||
}
|
||||
return transitions.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the zone name
|
||||
*/
|
||||
String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of all rule records that have been referred to
|
||||
* by this time zone.
|
||||
* @return the rule records list
|
||||
*/
|
||||
List<RuleRec> getRules() {
|
||||
return usedRuleRecs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of all zone records that have been referred to
|
||||
* by this time zone.
|
||||
* @return the zone records list
|
||||
*/
|
||||
List<ZoneRec> getZones() {
|
||||
return usedZoneRecs;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the transition table (list)
|
||||
*/
|
||||
List<Long> getTransitions() {
|
||||
return transitions;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the offsets list
|
||||
*/
|
||||
List<Integer> getOffsets() {
|
||||
return offsets;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the DST saving offsets list
|
||||
*/
|
||||
List<Integer> getDstOffsets() {
|
||||
return dstOffsets;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the GMT offsets list
|
||||
*/
|
||||
List<Integer> getGmtOffsets() {
|
||||
return gmtOffsets;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the checksum (crc32) value of the trasition table
|
||||
*/
|
||||
int getCRC32() {
|
||||
return crc32;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if the GMT offset of this time zone would change
|
||||
* after the time zone database has been generated, false, otherwise.
|
||||
*/
|
||||
boolean willGMTOffsetChange() {
|
||||
return willRawOffsetChange;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the last known GMT offset value in milliseconds
|
||||
*/
|
||||
int getRawOffset() {
|
||||
return rawOffset;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets time zone's GMT offset to <code>offset</code>.
|
||||
* @param offset the GMT offset value in milliseconds
|
||||
*/
|
||||
void setRawOffset(int offset) {
|
||||
rawOffset = offset;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets time zone's GMT offset value to <code>offset</code>. If
|
||||
* <code>startTime</code> is future time, then the {@link
|
||||
* #willRawOffsetChange} value is set to true.
|
||||
* @param offset the GMT offset value in milliseconds
|
||||
* @param startTime the UTC time at which the GMT offset is in effective
|
||||
*/
|
||||
void setRawOffset(int offset, long startTime) {
|
||||
// if this rawOffset is for the future time, let the run-time
|
||||
// look for the current GMT offset.
|
||||
if (startTime > Time.getCurrentTime()) {
|
||||
willRawOffsetChange = true;
|
||||
}
|
||||
setRawOffset(offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the specified transition information to the end of the transition table.
|
||||
* @param time the UTC time at which this transition happens
|
||||
* @param offset the total amount of the offset from GMT in milliseconds
|
||||
* @param dstOffset the amount of time in milliseconds saved at this transition
|
||||
*/
|
||||
void addTransition(long time, int offset, int dstOffset) {
|
||||
if (transitions == null) {
|
||||
transitions = new ArrayList<Long>();
|
||||
offsets = new ArrayList<Integer>();
|
||||
dstOffsets = new ArrayList<Integer>();
|
||||
}
|
||||
transitions.add(time);
|
||||
offsets.add(offset);
|
||||
dstOffsets.add(dstOffset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the type of historical daylight saving time
|
||||
* observation. For example, China used to observed daylight
|
||||
* saving time, but it no longer does. Then, X_DST is set to the
|
||||
* China time zone.
|
||||
* @param type the type of daylight saving time
|
||||
*/
|
||||
void setDSTType(int type) {
|
||||
dstType = type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the type of historical daylight saving time
|
||||
* observation.
|
||||
*/
|
||||
int getDSTType() {
|
||||
return dstType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the specified zone record to the zone records list.
|
||||
* @param rec the zone record
|
||||
*/
|
||||
void addUsedRec(ZoneRec rec) {
|
||||
if (usedZoneRecs == null) {
|
||||
usedZoneRecs = new ArrayList<ZoneRec>();
|
||||
}
|
||||
usedZoneRecs.add(rec);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the specified rule record to the rule records list.
|
||||
* @param rec the rule record
|
||||
*/
|
||||
void addUsedRec(RuleRec rec) {
|
||||
if (usedRuleRecs == null) {
|
||||
usedRuleRecs = new ArrayList<RuleRec>();
|
||||
}
|
||||
// if the last used rec is the same as the given rec, avoid
|
||||
// putting the same rule.
|
||||
int n = usedRuleRecs.size();
|
||||
for (int i = 0; i < n; i++) {
|
||||
if (usedRuleRecs.get(i).equals(rec)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
usedRuleRecs.add(rec);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the last zone record for this time zone.
|
||||
* @param the last zone record
|
||||
*/
|
||||
void setLastZoneRec(ZoneRec zrec) {
|
||||
lastZoneRec = zrec;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the last zone record for this time zone.
|
||||
*/
|
||||
ZoneRec getLastZoneRec() {
|
||||
return lastZoneRec;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the last rule records for this time zone. Those are used
|
||||
* for generating SimpleTimeZone parameters.
|
||||
* @param rules the last rule records
|
||||
*/
|
||||
void setLastRules(List<RuleRec> rules) {
|
||||
int n = rules.size();
|
||||
if (n > 0) {
|
||||
lastRules = rules;
|
||||
RuleRec rec = rules.get(0);
|
||||
int offset = rec.getSave();
|
||||
if (offset > 0) {
|
||||
setLastDSTSaving(offset);
|
||||
} else {
|
||||
System.err.println("\t No DST starting rule in the last rules.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the last rule records for this time zone.
|
||||
*/
|
||||
List<RuleRec> getLastRules() {
|
||||
return lastRules;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the last daylight saving amount.
|
||||
* @param the daylight saving amount
|
||||
*/
|
||||
void setLastDSTSaving(int offset) {
|
||||
lastSaving = offset;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the last daylight saving amount.
|
||||
*/
|
||||
int getLastDSTSaving() {
|
||||
return lastSaving;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the CRC32 value from the transition table and sets
|
||||
* the value to <code>crc32</code>.
|
||||
*/
|
||||
void checksum() {
|
||||
if (transitions == null) {
|
||||
crc32 = 0;
|
||||
return;
|
||||
}
|
||||
Checksum sum = new Checksum();
|
||||
for (int i = 0; i < transitions.size(); i++) {
|
||||
int offset = offsets.get(i);
|
||||
// adjust back to make the transition in local time
|
||||
sum.update(transitions.get(i) + offset);
|
||||
sum.update(offset);
|
||||
sum.update(dstOffsets.get(i));
|
||||
}
|
||||
crc32 = (int)sum.getValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes unnecessary transitions for Java time zone support.
|
||||
*/
|
||||
void optimize() {
|
||||
// if there is only one offset, delete all transitions. This
|
||||
// could happen if only time zone abbreviations changed.
|
||||
if (gmtOffsets.size() == 1) {
|
||||
transitions = null;
|
||||
usedRuleRecs = null;
|
||||
setDSTType(NO_DST);
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < (transitions.size() - 2); i++) { // don't remove the last one
|
||||
if (transitions.get(i) == transitions.get(i+1)) {
|
||||
transitions.remove(i);
|
||||
offsets.remove(i);
|
||||
dstOffsets.remove(i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < (transitions.size() - 2); i++) { // don't remove the last one
|
||||
if (offsets.get(i) == offsets.get(i+1)
|
||||
&& dstOffsets.get(i) == dstOffsets.get(i+1)) {
|
||||
transitions.remove(i+1);
|
||||
offsets.remove(i+1);
|
||||
dstOffsets.remove(i+1);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stores the specified offset value from GMT in the GMT offsets
|
||||
* table and returns its index. The offset value includes the base
|
||||
* GMT offset and any additional daylight saving if applicable. If
|
||||
* the same value as the specified offset is already in the table,
|
||||
* its index is returned.
|
||||
* @param offset the offset value in milliseconds
|
||||
* @return the index to the offset value in the GMT offsets table.
|
||||
*/
|
||||
int getOffsetIndex(int offset) {
|
||||
return getOffsetIndex(offset, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Stores the specified daylight saving value in the GMT offsets
|
||||
* table and returns its index. If the same value as the specified
|
||||
* offset is already in the table, its index is returned. If 0 is
|
||||
* specified, it's not stored in the table and -1 is returned.
|
||||
* @param offset the offset value in milliseconds
|
||||
* @return the index to the specified offset value in the GMT
|
||||
* offsets table, or -1 if 0 is specified.
|
||||
*/
|
||||
int getDstOffsetIndex(int offset) {
|
||||
if (offset == 0) {
|
||||
return -1;
|
||||
}
|
||||
return getOffsetIndex(offset, 1);
|
||||
}
|
||||
|
||||
private int getOffsetIndex(int offset, int index) {
|
||||
if (gmtOffsets == null) {
|
||||
gmtOffsets = new ArrayList<Integer>();
|
||||
}
|
||||
for (int i = index; i < gmtOffsets.size(); i++) {
|
||||
if (offset == gmtOffsets.get(i)) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
if (gmtOffsets.size() < index) {
|
||||
gmtOffsets.add(0);
|
||||
}
|
||||
gmtOffsets.add(offset);
|
||||
return gmtOffsets.size() - 1;
|
||||
}
|
||||
}
|
@ -1,64 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
class TzIDOldMapping {
|
||||
static final Map<String, String> MAP = new HashMap<String, String>();
|
||||
static {
|
||||
String[][] oldmap = {
|
||||
{ "ACT", "Australia/Darwin" },
|
||||
{ "AET", "Australia/Sydney" },
|
||||
{ "AGT", "America/Argentina/Buenos_Aires" },
|
||||
{ "ART", "Africa/Cairo" },
|
||||
{ "AST", "America/Anchorage" },
|
||||
{ "BET", "America/Sao_Paulo" },
|
||||
{ "BST", "Asia/Dhaka" },
|
||||
{ "CAT", "Africa/Harare" },
|
||||
{ "CNT", "America/St_Johns" },
|
||||
{ "CST", "America/Chicago" },
|
||||
{ "CTT", "Asia/Shanghai" },
|
||||
{ "EAT", "Africa/Addis_Ababa" },
|
||||
{ "ECT", "Europe/Paris" },
|
||||
{ "EST", "America/New_York" },
|
||||
{ "HST", "Pacific/Honolulu" },
|
||||
{ "IET", "America/Indianapolis" },
|
||||
{ "IST", "Asia/Calcutta" },
|
||||
{ "JST", "Asia/Tokyo" },
|
||||
{ "MIT", "Pacific/Apia" },
|
||||
{ "MST", "America/Denver" },
|
||||
{ "NET", "Asia/Yerevan" },
|
||||
{ "NST", "Pacific/Auckland" },
|
||||
{ "PLT", "Asia/Karachi" },
|
||||
{ "PNT", "America/Phoenix" },
|
||||
{ "PRT", "America/Puerto_Rico" },
|
||||
{ "PST", "America/Los_Angeles" },
|
||||
{ "SST", "Pacific/Guadalcanal" },
|
||||
{ "VST", "Asia/Saigon" },
|
||||
};
|
||||
for (String[] pair : oldmap) {
|
||||
MAP.put(pair[0], pair[1]);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,164 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
* Zone holds information corresponding to a "Zone" part of a time
|
||||
* zone definition file.
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
class Zone {
|
||||
// zone name (e.g., "America/Los_Angeles")
|
||||
private String name;
|
||||
|
||||
// zone records
|
||||
private List<ZoneRec> list;
|
||||
|
||||
// target zone names for this compilation
|
||||
private static Set<String> targetZones;
|
||||
|
||||
/**
|
||||
* Constructs a Zone with the specified zone name.
|
||||
* @param name the zone name
|
||||
*/
|
||||
Zone(String name) {
|
||||
this.name = name;
|
||||
list = new ArrayList<ZoneRec>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads time zone names to be generated, called "target zone
|
||||
* name", from the specified text file and creats an internal hash
|
||||
* table to keep those names. It's assumed that one text line
|
||||
* contains a zone name or comments if it starts with
|
||||
* '#'. Comments can't follow a zone name in a single line.
|
||||
* @param fileName the text file name
|
||||
*/
|
||||
static void readZoneNames(String fileName) {
|
||||
if (fileName == null) {
|
||||
return;
|
||||
}
|
||||
BufferedReader in = null;
|
||||
try {
|
||||
FileReader fr = new FileReader(fileName);
|
||||
in = new BufferedReader(fr);
|
||||
} catch (FileNotFoundException e) {
|
||||
Main.panic("can't open file: " + fileName);
|
||||
}
|
||||
targetZones = new HashSet<String>();
|
||||
String line;
|
||||
|
||||
try {
|
||||
while ((line = in.readLine()) != null) {
|
||||
line = line.trim();
|
||||
if (line.length() == 0 || line.charAt(0) == '#') {
|
||||
continue;
|
||||
}
|
||||
if (!targetZones.add(line)) {
|
||||
Main.warning("duplicated target zone name: " + line);
|
||||
}
|
||||
}
|
||||
in.close();
|
||||
} catch (IOException e) {
|
||||
Main.panic("IO error: "+e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether the specified zone is one of the target zones.
|
||||
* If no target zones are specified, this method always returns
|
||||
* true for any zone name.
|
||||
* @param zoneName the zone name
|
||||
* @return true if the specified name is a target zone.
|
||||
*/
|
||||
static boolean isTargetZone(String zoneName) {
|
||||
if (targetZones == null) {
|
||||
return true;
|
||||
}
|
||||
return targetZones.contains(zoneName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Forces to add "MET" to the target zone table. This is because
|
||||
* there is a conflict between Java zone name "WET" and Olson zone
|
||||
* name.
|
||||
*/
|
||||
static void addMET() {
|
||||
if (targetZones != null) {
|
||||
targetZones.add("MET");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the zone name
|
||||
*/
|
||||
String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the specified zone record to the zone record list.
|
||||
*/
|
||||
void add(ZoneRec rec) {
|
||||
list.add(rec);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param index the index at which the zone record in the list is returned.
|
||||
* @return the zone record specified by the index.
|
||||
*/
|
||||
ZoneRec get(int index) {
|
||||
return list.get(index);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the size of the zone record list
|
||||
*/
|
||||
int size() {
|
||||
return list.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves the reference to a rule in each zone record.
|
||||
* @param zi the Zoneinfo object with which the rule reference is
|
||||
* resolved.
|
||||
*/
|
||||
void resolve(Zoneinfo zi) {
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
ZoneRec rec = list.get(i);
|
||||
rec.resolve(zi);
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,248 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
* ZoneRec hold information of time zone corresponding to each text
|
||||
* line of the "Zone" part.
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
class ZoneRec {
|
||||
private int gmtOffset;
|
||||
private String ruleName;
|
||||
private int directSave;
|
||||
private Rule ruleRef;
|
||||
private String format;
|
||||
private boolean hasUntil;
|
||||
private int untilYear;
|
||||
private Month untilMonth;
|
||||
private RuleDay untilDay;
|
||||
private Time untilTime;
|
||||
private long untilInMillis;
|
||||
private String line;
|
||||
|
||||
/**
|
||||
* @return the "UNTIL" value in milliseconds
|
||||
*/
|
||||
Time getUntilTime() {
|
||||
return untilTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the GMT offset value in milliseconds
|
||||
*/
|
||||
int getGmtOffset() {
|
||||
return gmtOffset;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the rule name to which this zone record refers
|
||||
*/
|
||||
String getRuleName() {
|
||||
return ruleName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the amount of saving time directly defined in the
|
||||
* "RULES/SAVE" field.
|
||||
*/
|
||||
int getDirectSave() {
|
||||
return directSave;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if this zone record has a reference to a rule
|
||||
*/
|
||||
boolean hasRuleReference() {
|
||||
return ruleRef != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the "FORMAT" field string of this zone record. This
|
||||
* @return the "FORMAT" field
|
||||
*/
|
||||
String getFormat() {
|
||||
return format;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the year in the "UNTIL" field
|
||||
*/
|
||||
int getUntilYear() {
|
||||
return untilYear;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the "UNTIL" field value in milliseconds from Janurary
|
||||
* 1, 1970 0:00 GMT.
|
||||
* @param currentSave the amount of daylight saving in
|
||||
* milliseconds that is used to adjust wall-clock time.
|
||||
* @return the milliseconds value of the "UNTIL" field
|
||||
*/
|
||||
long getUntilTime(int currentSave) {
|
||||
if (untilTime.isWall()) {
|
||||
return untilInMillis - currentSave;
|
||||
}
|
||||
return untilInMillis;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the "UNTIL" time in milliseconds without adjusting GMT
|
||||
* offsets or daylight saving.
|
||||
* @return local "UNTIL" time in milliseconds
|
||||
*/
|
||||
long getLocalUntilTime() {
|
||||
return Time.getLocalTime(untilYear,
|
||||
untilMonth,
|
||||
untilDay,
|
||||
untilTime.getTime());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the "UNTIL" time in milliseconds with adjusting GMT offsets and daylight saving.
|
||||
* @return the "UNTIL" time after the adjustment
|
||||
*/
|
||||
long getLocalUntilTime(int save, int gmtOffset) {
|
||||
return Time.getLocalTime(untilYear,
|
||||
untilMonth,
|
||||
untilDay,
|
||||
save,
|
||||
gmtOffset,
|
||||
untilTime);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the text line of this zone record
|
||||
*/
|
||||
String getLine() {
|
||||
return line;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the specified text line to this zone record
|
||||
*/
|
||||
void setLine(String line) {
|
||||
this.line = line;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if this zone record has the "UNTIL" field
|
||||
*/
|
||||
boolean hasUntil() {
|
||||
return this.hasUntil;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adjusts the "UNTIL" time to GMT offset if this zone record has
|
||||
* it. <code>untilTime</code> is not adjusted to daylight saving
|
||||
* in this method.
|
||||
*/
|
||||
void adjustTime() {
|
||||
if (!hasUntil()) {
|
||||
return;
|
||||
}
|
||||
if (untilTime.isSTD() || untilTime.isWall()) {
|
||||
// adjust to gmt offset only here. adjust to real
|
||||
// wall-clock time when tracking rules
|
||||
untilInMillis -= gmtOffset;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the reference to the Rule object
|
||||
*/
|
||||
Rule getRuleRef() {
|
||||
return ruleRef;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves the reference to a Rule and adjusts its "UNTIL" time
|
||||
* to GMT offset.
|
||||
*/
|
||||
void resolve(Zoneinfo zi) {
|
||||
if (ruleName != null && (!"-".equals(ruleName))) {
|
||||
ruleRef = zi.getRule(ruleName);
|
||||
}
|
||||
adjustTime();
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a Zone text line that is described by a StringTokenizer.
|
||||
* @param tokens represents tokens of a Zone text line
|
||||
* @return the zone record produced by parsing the text
|
||||
*/
|
||||
static ZoneRec parse(StringTokenizer tokens) {
|
||||
ZoneRec rec = new ZoneRec();
|
||||
try {
|
||||
rec.gmtOffset = (int) Time.parse(tokens.nextToken()).getTime();
|
||||
String token = tokens.nextToken();
|
||||
char c = token.charAt(0);
|
||||
if (c >= '0' && c <= '9') {
|
||||
rec.directSave = (int) Time.parse(token).getTime();
|
||||
} else {
|
||||
rec.ruleName = token;
|
||||
}
|
||||
rec.format = tokens.nextToken();
|
||||
if (tokens.hasMoreTokens()) {
|
||||
rec.hasUntil = true;
|
||||
rec.untilYear = Integer.parseInt(tokens.nextToken());
|
||||
if (tokens.hasMoreTokens()) {
|
||||
rec.untilMonth = Month.parse(tokens.nextToken());
|
||||
} else {
|
||||
rec.untilMonth = Month.JANUARY;
|
||||
}
|
||||
if (tokens.hasMoreTokens()) {
|
||||
rec.untilDay = RuleDay.parse(tokens.nextToken());
|
||||
} else {
|
||||
rec.untilDay = new RuleDay(1);
|
||||
}
|
||||
if (tokens.hasMoreTokens()) {
|
||||
rec.untilTime = Time.parse(tokens.nextToken());
|
||||
} else {
|
||||
rec.untilTime = Time.parse("0:00");
|
||||
}
|
||||
rec.untilInMillis = rec.getLocalUntilTime();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// TODO: error reporting
|
||||
e.printStackTrace();
|
||||
}
|
||||
return rec;
|
||||
}
|
||||
|
||||
private static void panic(String msg) {
|
||||
Main.panic(msg);
|
||||
}
|
||||
}
|
@ -1,579 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
* Zoneinfo provides javazic compiler front-end functionality.
|
||||
* @since 1.4
|
||||
*/
|
||||
class Zoneinfo {
|
||||
|
||||
private static final int minYear = 1900;
|
||||
private static final int maxYear = 2100;
|
||||
private static final long minTime = Time.getLocalTime(minYear, Month.JANUARY, 1, 0);
|
||||
private static int startYear = minYear;
|
||||
private static int endYear = maxYear;
|
||||
|
||||
/**
|
||||
* True if javazic should generate a list of SimpleTimeZone
|
||||
* instances for the SimpleTimeZone-based time zone support.
|
||||
*/
|
||||
static boolean isYearForTimeZoneDataSpecified = false;
|
||||
|
||||
/**
|
||||
* Zone name to Zone mappings
|
||||
*/
|
||||
private Map<String,Zone> zones;
|
||||
|
||||
/**
|
||||
* Rule name to Rule mappings
|
||||
*/
|
||||
private Map<String,Rule> rules;
|
||||
|
||||
/**
|
||||
* Alias name to real name mappings
|
||||
*/
|
||||
private Map<String,String> aliases;
|
||||
|
||||
/**
|
||||
* Constracts a Zoneinfo.
|
||||
*/
|
||||
Zoneinfo() {
|
||||
zones = new HashMap<String,Zone>();
|
||||
rules = new HashMap<String,Rule>();
|
||||
aliases = new HashMap<String,String>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the given zone to the list of Zones.
|
||||
* @param zone Zone to be added to the list.
|
||||
*/
|
||||
void add(Zone zone) {
|
||||
String name = zone.getName();
|
||||
zones.put(name, zone);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the given rule to the list of Rules.
|
||||
* @param rule Rule to be added to the list.
|
||||
*/
|
||||
void add(Rule rule) {
|
||||
String name = rule.getName();
|
||||
rules.put(name, rule);
|
||||
}
|
||||
|
||||
/**
|
||||
* Puts the specifid name pair to the alias table.
|
||||
* @param name1 an alias time zone name
|
||||
* @param name2 the real time zone of the alias name
|
||||
*/
|
||||
void putAlias(String name1, String name2) {
|
||||
aliases.put(name1, name2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the given year for SimpleTimeZone list output.
|
||||
* This method is called when the -S option is specified.
|
||||
* @param year the year for which SimpleTimeZone list should be generated
|
||||
*/
|
||||
static void setYear(int year) {
|
||||
setStartYear(year);
|
||||
setEndYear(year);
|
||||
isYearForTimeZoneDataSpecified = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the start year.
|
||||
* @param year the start year value
|
||||
* @throws IllegalArgumentException if the specified year value is
|
||||
* smaller than the minimum year or greater than the end year.
|
||||
*/
|
||||
static void setStartYear(int year) {
|
||||
if (year < minYear || year > endYear) {
|
||||
throw new IllegalArgumentException("invalid start year specified: " + year);
|
||||
}
|
||||
startYear = year;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the start year value
|
||||
*/
|
||||
static int getStartYear() {
|
||||
return startYear;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the end year.
|
||||
* @param year the end year value
|
||||
* @throws IllegalArgumentException if the specified year value is
|
||||
* smaller than the start year or greater than the maximum year.
|
||||
*/
|
||||
static void setEndYear(int year) {
|
||||
if (year < startYear || year > maxYear) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
endYear = year;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the end year value
|
||||
*/
|
||||
static int getEndYear() {
|
||||
return endYear;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the minimum year value
|
||||
*/
|
||||
static int getMinYear() {
|
||||
return minYear;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the maximum year value
|
||||
*/
|
||||
static int getMaxYear() {
|
||||
return maxYear;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the alias table
|
||||
*/
|
||||
Map<String,String> getAliases() {
|
||||
return aliases;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the Zone list
|
||||
*/
|
||||
Map<String,Zone> getZones() {
|
||||
return zones;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a Zone specified by name.
|
||||
* @param name a zone name
|
||||
*/
|
||||
Zone getZone(String name) {
|
||||
return zones.get(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a Rule specified by name.
|
||||
* @param name a rule name
|
||||
*/
|
||||
Rule getRule(String name) {
|
||||
return rules.get(name);
|
||||
}
|
||||
|
||||
private static String line;
|
||||
|
||||
private static int lineNum;
|
||||
|
||||
/**
|
||||
* Parses the specified time zone data file and creates a Zoneinfo
|
||||
* that has all Rules, Zones and Links (aliases) information.
|
||||
* @param fname the time zone data file name
|
||||
* @return a Zoneinfo object
|
||||
*/
|
||||
static Zoneinfo parse(String fname) {
|
||||
BufferedReader in = null;
|
||||
try {
|
||||
FileReader fr = new FileReader(fname);
|
||||
in = new BufferedReader(fr);
|
||||
} catch (FileNotFoundException e) {
|
||||
panic("can't open file: "+fname);
|
||||
}
|
||||
Zoneinfo zi = new Zoneinfo();
|
||||
boolean continued = false;
|
||||
Zone zone = null;
|
||||
String l;
|
||||
lineNum = 0;
|
||||
|
||||
try {
|
||||
while ((line = in.readLine()) != null) {
|
||||
lineNum++;
|
||||
// skip blank and comment lines
|
||||
if (line.length() == 0 || line.charAt(0) == '#') {
|
||||
continue;
|
||||
}
|
||||
|
||||
// trim trailing comments
|
||||
int rindex = line.lastIndexOf('#');
|
||||
if (rindex != -1) {
|
||||
// take the data part of the line
|
||||
l = line.substring(0, rindex);
|
||||
} else {
|
||||
l = line;
|
||||
}
|
||||
|
||||
StringTokenizer tokens = new StringTokenizer(l);
|
||||
if (!tokens.hasMoreTokens()) {
|
||||
continue;
|
||||
}
|
||||
String token = tokens.nextToken();
|
||||
int len = token.length();
|
||||
|
||||
if (continued || token.regionMatches(true, 0, "Zone", 0, len)){
|
||||
if (zone == null) {
|
||||
if (!tokens.hasMoreTokens()) {
|
||||
panic("syntax error: zone no more token");
|
||||
}
|
||||
token = tokens.nextToken();
|
||||
// if the zone name is in "GMT+hh" or "GMT-hh"
|
||||
// format, ignore it due to spec conflict.
|
||||
if (token.startsWith("GMT+") || token.startsWith("GMT-")) {
|
||||
continue;
|
||||
}
|
||||
zone = new Zone(token);
|
||||
} else {
|
||||
// no way to push the current token back...
|
||||
tokens = new StringTokenizer(l);
|
||||
}
|
||||
|
||||
ZoneRec zrec = ZoneRec.parse(tokens);
|
||||
zrec.setLine(line);
|
||||
zone.add(zrec);
|
||||
if ((continued = zrec.hasUntil()) == false) {
|
||||
if (Zone.isTargetZone(zone.getName())) {
|
||||
// zone.resolve(zi);
|
||||
zi.add(zone);
|
||||
}
|
||||
zone = null;
|
||||
}
|
||||
} else if (token.regionMatches(true, 0, "Rule", 0, len)) {
|
||||
if (!tokens.hasMoreTokens()) {
|
||||
panic("syntax error: rule no more token");
|
||||
}
|
||||
token = tokens.nextToken();
|
||||
Rule rule = zi.getRule(token);
|
||||
if (rule == null) {
|
||||
rule = new Rule(token);
|
||||
zi.add(rule);
|
||||
}
|
||||
RuleRec rrec = RuleRec.parse(tokens);
|
||||
rrec.setLine(line);
|
||||
rule.add(rrec);
|
||||
} else if (token.regionMatches(true, 0, "Link", 0, len)) {
|
||||
// Link <newname> <oldname>
|
||||
try {
|
||||
String name1 = tokens.nextToken();
|
||||
String name2 = tokens.nextToken();
|
||||
|
||||
// if the zone name is in "GMT+hh" or "GMT-hh"
|
||||
// format, ignore it due to spec conflict with
|
||||
// custom time zones. Also, ignore "ROC" for
|
||||
// PC-ness.
|
||||
if (name2.startsWith("GMT+") || name2.startsWith("GMT-")
|
||||
|| "ROC".equals(name2)) {
|
||||
continue;
|
||||
}
|
||||
zi.putAlias(name2, name1);
|
||||
} catch (Exception e) {
|
||||
panic("syntax error: no more token for Link");
|
||||
}
|
||||
}
|
||||
}
|
||||
in.close();
|
||||
} catch (IOException ex) {
|
||||
panic("IO error: " + ex.getMessage());
|
||||
}
|
||||
|
||||
return zi;
|
||||
}
|
||||
|
||||
/**
|
||||
* Interprets a zone and constructs a Timezone object that
|
||||
* contains enough information on GMT offsets and DST schedules to
|
||||
* generate a zone info database.
|
||||
*
|
||||
* @param zoneName the zone name for which a Timezone object is
|
||||
* constructed.
|
||||
*
|
||||
* @return a Timezone object that contains all GMT offsets and DST
|
||||
* rules information.
|
||||
*/
|
||||
Timezone phase2(String zoneName) {
|
||||
Timezone tz = new Timezone(zoneName);
|
||||
Zone zone = getZone(zoneName);
|
||||
zone.resolve(this);
|
||||
|
||||
// TODO: merge phase2's for the regular and SimpleTimeZone ones.
|
||||
if (isYearForTimeZoneDataSpecified) {
|
||||
ZoneRec zrec = zone.get(zone.size()-1);
|
||||
tz.setLastZoneRec(zrec);
|
||||
tz.setRawOffset(zrec.getGmtOffset());
|
||||
if (zrec.hasRuleReference()) {
|
||||
/*
|
||||
* This part assumes that the specified year is covered by
|
||||
* the rules referred to by the last zone record.
|
||||
*/
|
||||
List<RuleRec> rrecs = zrec.getRuleRef().getRules(startYear);
|
||||
|
||||
if (rrecs.size() == 2) {
|
||||
// make sure that one is a start rule and the other is
|
||||
// an end rule.
|
||||
RuleRec r0 = rrecs.get(0);
|
||||
RuleRec r1 = rrecs.get(1);
|
||||
if (r0.getSave() == 0 && r1.getSave() > 0) {
|
||||
rrecs.set(0, r1);
|
||||
rrecs.set(1, r0);
|
||||
} else if (!(r0.getSave() > 0 && r1.getSave() == 0)) {
|
||||
rrecs = null;
|
||||
Main.error(zoneName + ": rules for " + startYear + " not found.");
|
||||
}
|
||||
} else {
|
||||
rrecs = null;
|
||||
}
|
||||
if (rrecs != null) {
|
||||
tz.setLastRules(rrecs);
|
||||
}
|
||||
}
|
||||
return tz;
|
||||
}
|
||||
|
||||
int gmtOffset;
|
||||
int year = minYear;
|
||||
int fromYear = year;
|
||||
long fromTime = Time.getLocalTime(startYear,
|
||||
Month.JANUARY,
|
||||
1, 0);
|
||||
|
||||
// take the index 0 for the GMT offset of the last zone record
|
||||
ZoneRec zrec = zone.get(zone.size()-1);
|
||||
tz.getOffsetIndex(zrec.getGmtOffset());
|
||||
|
||||
int lastGmtOffsetValue = -1;
|
||||
ZoneRec prevzrec = null;
|
||||
int currentSave = 0;
|
||||
boolean usedZone;
|
||||
for (int zindex = 0; zindex < zone.size(); zindex++) {
|
||||
zrec = zone.get(zindex);
|
||||
usedZone = false;
|
||||
gmtOffset = zrec.getGmtOffset();
|
||||
int stdOffset = zrec.getDirectSave();
|
||||
|
||||
if (gmtOffset != lastGmtOffsetValue) {
|
||||
tz.setRawOffset(gmtOffset, fromTime);
|
||||
lastGmtOffsetValue = gmtOffset;
|
||||
}
|
||||
// If this is the last zone record, take the last rule info.
|
||||
if (!zrec.hasUntil()) {
|
||||
if (zrec.hasRuleReference()) {
|
||||
tz.setLastRules(zrec.getRuleRef().getLastRules());
|
||||
} else if (stdOffset != 0) {
|
||||
// in case the last rule is all year round DST-only
|
||||
// (Asia/Amman once announced this rule.)
|
||||
tz.setLastDSTSaving(stdOffset);
|
||||
}
|
||||
}
|
||||
if (!zrec.hasRuleReference()) {
|
||||
if (!zrec.hasUntil() || zrec.getUntilTime(stdOffset) >= fromTime) {
|
||||
tz.addTransition(fromTime,
|
||||
tz.getOffsetIndex(gmtOffset+stdOffset),
|
||||
tz.getDstOffsetIndex(stdOffset));
|
||||
usedZone = true;
|
||||
}
|
||||
currentSave = stdOffset;
|
||||
// optimization in case the last rule is fixed.
|
||||
if (!zrec.hasUntil()) {
|
||||
if (tz.getNTransitions() > 0) {
|
||||
if (stdOffset == 0) {
|
||||
tz.setDSTType(Timezone.X_DST);
|
||||
} else {
|
||||
tz.setDSTType(Timezone.LAST_DST);
|
||||
}
|
||||
long time = Time.getLocalTime(maxYear,
|
||||
Month.JANUARY, 1, 0);
|
||||
time -= zrec.getGmtOffset();
|
||||
tz.addTransition(time,
|
||||
tz.getOffsetIndex(gmtOffset+stdOffset),
|
||||
tz.getDstOffsetIndex(stdOffset));
|
||||
tz.addUsedRec(zrec);
|
||||
} else {
|
||||
tz.setDSTType(Timezone.NO_DST);
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
Rule rule = zrec.getRuleRef();
|
||||
boolean fromTimeUsed = false;
|
||||
currentSave = 0;
|
||||
year_loop:
|
||||
for (year = getMinYear(); year <= endYear; year++) {
|
||||
if (zrec.hasUntil() && year > zrec.getUntilYear()) {
|
||||
break;
|
||||
}
|
||||
List<RuleRec> rules = rule.getRules(year);
|
||||
if (rules.size() > 0) {
|
||||
for (int i = 0; i < rules.size(); i++) {
|
||||
RuleRec rrec = rules.get(i);
|
||||
long transition = rrec.getTransitionTime(year,
|
||||
gmtOffset,
|
||||
currentSave);
|
||||
if (zrec.hasUntil()) {
|
||||
if (transition >= zrec.getUntilTime(currentSave)) {
|
||||
// If the GMT offset changed from the previous one,
|
||||
// record fromTime as a transition.
|
||||
if (!fromTimeUsed && prevzrec != null
|
||||
&& gmtOffset != prevzrec.getGmtOffset()) {
|
||||
tz.addTransition(fromTime,
|
||||
tz.getOffsetIndex(gmtOffset+currentSave),
|
||||
tz.getDstOffsetIndex(currentSave));
|
||||
fromTimeUsed = true; // for consistency
|
||||
}
|
||||
break year_loop;
|
||||
}
|
||||
}
|
||||
|
||||
if (fromTimeUsed == false) {
|
||||
if (fromTime <= transition) {
|
||||
fromTimeUsed = true;
|
||||
|
||||
if (fromTime != minTime) {
|
||||
int prevsave;
|
||||
|
||||
// See if until time in the previous
|
||||
// ZoneRec is the same thing as the
|
||||
// local time in the next rule.
|
||||
// (examples are Asia/Ashkhabad in 1991,
|
||||
// Europe/Riga in 1989)
|
||||
|
||||
if (i > 0) {
|
||||
prevsave = rules.get(i-1).getSave();
|
||||
} else {
|
||||
List<RuleRec> prevrules = rule.getRules(year-1);
|
||||
|
||||
if (prevrules.size() > 0) {
|
||||
prevsave = prevrules.get(prevrules.size()-1).getSave();
|
||||
} else {
|
||||
prevsave = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (rrec.isSameTransition(prevzrec, prevsave, gmtOffset)) {
|
||||
currentSave = rrec.getSave();
|
||||
tz.addTransition(fromTime,
|
||||
tz.getOffsetIndex(gmtOffset+currentSave),
|
||||
tz.getDstOffsetIndex(currentSave));
|
||||
tz.addUsedRec(rrec);
|
||||
usedZone = true;
|
||||
continue;
|
||||
}
|
||||
if (!prevzrec.hasRuleReference()
|
||||
|| rule != prevzrec.getRuleRef()
|
||||
|| (rule == prevzrec.getRuleRef()
|
||||
&& gmtOffset != prevzrec.getGmtOffset())) {
|
||||
int save = (fromTime == transition) ? rrec.getSave() : currentSave;
|
||||
tz.addTransition(fromTime,
|
||||
tz.getOffsetIndex(gmtOffset+save),
|
||||
tz.getDstOffsetIndex(save));
|
||||
tz.addUsedRec(rrec);
|
||||
usedZone = true;
|
||||
}
|
||||
} else { // fromTime == minTime
|
||||
int save = rrec.getSave();
|
||||
tz.addTransition(minTime,
|
||||
tz.getOffsetIndex(gmtOffset),
|
||||
tz.getDstOffsetIndex(0));
|
||||
|
||||
tz.addTransition(transition,
|
||||
tz.getOffsetIndex(gmtOffset+save),
|
||||
tz.getDstOffsetIndex(save));
|
||||
|
||||
tz.addUsedRec(rrec);
|
||||
usedZone = true;
|
||||
}
|
||||
} else if (year == fromYear && i == rules.size()-1) {
|
||||
int save = rrec.getSave();
|
||||
tz.addTransition(fromTime,
|
||||
tz.getOffsetIndex(gmtOffset+save),
|
||||
tz.getDstOffsetIndex(save));
|
||||
}
|
||||
}
|
||||
|
||||
currentSave = rrec.getSave();
|
||||
if (fromTime < transition) {
|
||||
tz.addTransition(transition,
|
||||
tz.getOffsetIndex(gmtOffset+currentSave),
|
||||
tz.getDstOffsetIndex(currentSave));
|
||||
tz.addUsedRec(rrec);
|
||||
usedZone = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (year == fromYear) {
|
||||
tz.addTransition(fromTime,
|
||||
tz.getOffsetIndex(gmtOffset+currentSave),
|
||||
tz.getDstOffsetIndex(currentSave));
|
||||
fromTimeUsed = true;
|
||||
}
|
||||
if (year == endYear && !zrec.hasUntil()) {
|
||||
if (tz.getNTransitions() > 0) {
|
||||
// Assume that this Zone stopped DST
|
||||
tz.setDSTType(Timezone.X_DST);
|
||||
long time = Time.getLocalTime(maxYear, Month.JANUARY,
|
||||
1, 0);
|
||||
time -= zrec.getGmtOffset();
|
||||
tz.addTransition(time,
|
||||
tz.getOffsetIndex(gmtOffset),
|
||||
tz.getDstOffsetIndex(0));
|
||||
usedZone = true;
|
||||
} else {
|
||||
tz.setDSTType(Timezone.NO_DST);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (usedZone) {
|
||||
tz.addUsedRec(zrec);
|
||||
}
|
||||
if (zrec.hasUntil() && zrec.getUntilTime(currentSave) > fromTime) {
|
||||
fromTime = zrec.getUntilTime(currentSave);
|
||||
fromYear = zrec.getUntilYear();
|
||||
year = zrec.getUntilYear();
|
||||
}
|
||||
prevzrec = zrec;
|
||||
}
|
||||
|
||||
if (tz.getDSTType() == Timezone.UNDEF_DST) {
|
||||
tz.setDSTType(Timezone.DST);
|
||||
}
|
||||
tz.optimize();
|
||||
tz.checksum();
|
||||
return tz;
|
||||
}
|
||||
|
||||
private static void panic(String msg) {
|
||||
Main.panic(msg);
|
||||
}
|
||||
}
|
@ -1,78 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# JDK 1.1.x compatible time zone IDs
|
||||
#
|
||||
|
||||
Link Australia/Darwin ACT
|
||||
Link Australia/Sydney AET
|
||||
Link America/Argentina/Buenos_Aires AGT
|
||||
Link Africa/Cairo ART
|
||||
Link America/Anchorage AST
|
||||
Link America/Sao_Paulo BET
|
||||
Link Asia/Dhaka BST
|
||||
Link Africa/Harare CAT
|
||||
Link America/St_Johns CNT
|
||||
Link America/Chicago CST
|
||||
Link Asia/Shanghai CTT
|
||||
Link Africa/Addis_Ababa EAT
|
||||
Link Europe/Paris ECT
|
||||
Link America/New_York EST
|
||||
Link Pacific/Honolulu HST
|
||||
Link America/Indianapolis IET
|
||||
Link Asia/Calcutta IST
|
||||
Link Asia/Tokyo JST
|
||||
Link Pacific/Apia MIT
|
||||
Link America/Denver MST
|
||||
Link Asia/Yerevan NET
|
||||
Link Pacific/Auckland NST
|
||||
Link Asia/Karachi PLT
|
||||
Link America/Phoenix PNT
|
||||
Link America/Puerto_Rico PRT
|
||||
Link America/Los_Angeles PST
|
||||
Link Pacific/Guadalcanal SST
|
||||
Link Asia/Saigon VST
|
||||
|
||||
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
|
||||
Rule SystemV min 1973 - Apr lastSun 2:00 1:00 D
|
||||
Rule SystemV min 1973 - Oct lastSun 2:00 0 S
|
||||
Rule SystemV 1974 only - Jan 6 2:00 1:00 D
|
||||
Rule SystemV 1974 only - Nov lastSun 2:00 0 S
|
||||
Rule SystemV 1975 only - Feb 23 2:00 1:00 D
|
||||
Rule SystemV 1975 only - Oct lastSun 2:00 0 S
|
||||
Rule SystemV 1976 max - Apr lastSun 2:00 1:00 D
|
||||
Rule SystemV 1976 max - Oct lastSun 2:00 0 S
|
||||
|
||||
# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
|
||||
Zone SystemV/AST4ADT -4:00 SystemV A%sT
|
||||
Zone SystemV/EST5EDT -5:00 SystemV E%sT
|
||||
Zone SystemV/CST6CDT -6:00 SystemV C%sT
|
||||
Zone SystemV/MST7MDT -7:00 SystemV M%sT
|
||||
Zone SystemV/PST8PDT -8:00 SystemV P%sT
|
||||
Zone SystemV/YST9YDT -9:00 SystemV Y%sT
|
||||
Zone SystemV/AST4 -4:00 - AST
|
||||
Zone SystemV/EST5 -5:00 - EST
|
||||
Zone SystemV/CST6 -6:00 - CST
|
||||
Zone SystemV/MST7 -7:00 - MST
|
||||
Zone SystemV/PST8 -8:00 - PST
|
||||
Zone SystemV/YST9 -9:00 - YST
|
||||
Zone SystemV/HST10 -10:00 - HST
|
Loading…
x
Reference in New Issue
Block a user