- /*
- * @(#)TimeZone.java 1.43 01/11/29
- *
- * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
- * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
- /*
- * @(#)TimeZone.java 1.40 01/01/11
- *
- * (C) Copyright Taligent, Inc. 1996 - All Rights Reserved
- * (C) Copyright IBM Corp. 1996 - All Rights Reserved
- *
- * Portions copyright (c) 1996-1998 Sun Microsystems, Inc. All Rights Reserved.
- *
- * The original version of this source code and documentation is copyrighted
- * and owned by Taligent, Inc., a wholly-owned subsidiary of IBM. These
- * materials are provided under terms of a License Agreement between Taligent
- * and Sun. This technology is protected by multiple US and International
- * patents. This notice and attribution to Taligent may not be removed.
- * Taligent is a registered trademark of Taligent, Inc.
- *
- * Permission to use, copy, modify, and distribute this software
- * and its documentation for NON-COMMERCIAL purposes and without
- * fee is hereby granted provided that this copyright notice
- * appears in all copies. Please refer to the file "copyright.html"
- * for further important copyright and licensing information.
- *
- * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
- * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
- * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
- *
- */
- package java.util;
- import java.io.Serializable;
- import java.lang.ref.SoftReference;
- import java.security.AccessController;
- import java.security.PrivilegedAction;
- import java.text.SimpleDateFormat;
- import java.text.NumberFormat;
- import java.text.ParsePosition;
- import sun.security.action.GetPropertyAction;
- /**
- * <code>TimeZone</code> represents a time zone offset, and also figures out daylight
- * savings.
- *
- * <p>
- * Typically, you get a <code>TimeZone</code> using <code>getDefault</code>
- * which creates a <code>TimeZone</code> based on the time zone where the program
- * is running. For example, for a program running in Japan, <code>getDefault</code>
- * creates a <code>TimeZone</code> object based on Japanese Standard Time.
- *
- * <p>
- * You can also get a <code>TimeZone</code> using <code>getTimeZone</code> along
- * with a time zone ID. For instance, the time zone ID for the Pacific
- * Standard Time zone is "PST". So, you can get a PST <code>TimeZone</code> object
- * with:
- * <blockquote>
- * <pre>
- * TimeZone tz = TimeZone.getTimeZone("PST");
- * </pre>
- * </blockquote>
- * You can use <code>getAvailableIDs</code> method to iterate through
- * all the supported time zone IDs. You can then choose a
- * supported ID to get a <code>TimeZone</code>.
- * If the time zone you want is not represented by one of the
- * supported IDs, then you can create a custom time zone ID with
- * the following syntax:
- *
- * <blockquote>
- * <pre>
- * GMT[+|-]hh[[:]mm]
- * </pre>
- * </blockquote>
- *
- * For example, you might specify GMT+14:00 as a custom
- * time zone ID. The <code>TimeZone</code> that is returned
- * when you specify a custom time zone ID does not include
- * daylight savings time.
- *
- *
- * @see Calendar
- * @see GregorianCalendar
- * @see SimpleTimeZone
- * @version 1.40 01/11/01
- * @author Mark Davis, David Goldsmith, Chen-Lieh Huang, Alan Liu
- */
- abstract public class TimeZone implements Serializable, Cloneable {
- /**
- * Sole constructor. (For invocation by subclass constructors, typically
- * implicit.)
- */
- public TimeZone() {
- }
- /**
- * A style specifier for <code>getDisplayName()</code> indicating
- * a short name, such as "PST."
- * @see #LONG
- */
- public static final int SHORT = 0;
- /**
- * A style specifier for <code>getDisplayName()</code> indicating
- * a long name, such as "Pacific Standard Time."
- * @see #SHORT
- */
- public static final int LONG = 1;
- // Constants used internally; unit is milliseconds
- private static final int ONE_MINUTE = 60*1000;
- private static final int ONE_HOUR = 60*ONE_MINUTE;
- private static final int ONE_DAY = 24*ONE_HOUR;
- /**
- * Cache to hold the SimpleDateFormat objects for a Locale.
- */
- private static Hashtable cachedLocaleData = new Hashtable(3);
- // Proclaim serialization compatibility with JDK 1.1
- static final long serialVersionUID = 3581463369166924961L;
- /**
- * Gets the time zone offset, for current date, modified in case of
- * daylight savings. This is the offset to add *to* UTC to get local time.
- * @param era the era of the given date.
- * @param year the year in the given date.
- * @param month the month in the given date.
- * Month is 0-based. e.g., 0 for January.
- * @param day the day-in-month of the given date.
- * @param dayOfWeek the day-of-week of the given date.
- * @param milliseconds the millis in day in <em>standard</em> local time.
- * @return the offset to add *to* GMT to get local time.
- */
- abstract public int getOffset(int era, int year, int month, int day,
- int dayOfWeek, int milliseconds);
- /**
- * Gets the time zone offset, for current date, modified in case of
- * daylight savings. This is the offset to add *to* UTC to get local time.
- * @param era the era of the given date.
- * @param year the year in the given date.
- * @param month the month in the given date.
- * Month is 0-based. e.g., 0 for January.
- * @param day the day-in-month of the given date.
- * @param dayOfWeek the day-of-week of the given date.
- * @param milliseconds the millis in day in <em>standard</em> local time.
- * @param monthLength the length of the given month in days.
- * @return the offset to add *to* GMT to get local time.
- */
- int getOffset(int era, int year, int month, int day,
- int dayOfWeek, int milliseconds, int monthLength) {
- // Default implementation which ignores the monthLength.
- // SimpleTimeZone overrides this and actually uses monthLength.
- return getOffset(era, year, month, day, dayOfWeek, milliseconds);
- }
- /**
- * Sets the base time zone offset to GMT.
- * This is the offset to add *to* UTC to get local time.
- * @param offsetMillis the given base time zone offset to GMT.
- */
- abstract public void setRawOffset(int offsetMillis);
- /**
- * Gets unmodified offset, NOT modified in case of daylight savings.
- * This is the offset to add *to* UTC to get local time.
- * @return the unmodified offset to add *to* UTC to get local time.
- */
- abstract public int getRawOffset();
- /**
- * Gets the ID of this time zone.
- * @return the ID of this time zone.
- */
- public String getID()
- {
- return ID;
- }
- /**
- * Sets the time zone ID. This does not change any other data in
- * the time zone object.
- * @param ID the new time zone ID.
- */
- public void setID(String ID)
- {
- this.ID = ID;
- }
- /**
- * Returns a name of this time zone suitable for presentation to the user
- * in the default locale.
- * This method returns the long name, not including daylight savings.
- * If the display name is not available for the locale,
- * then this method returns a string in the format
- * <code>GMT[+-]hh:mm</code>.
- * @return the human-readable name of this time zone in the default locale.
- */
- public final String getDisplayName() {
- return getDisplayName(false, LONG, Locale.getDefault());
- }
- /**
- * Returns a name of this time zone suitable for presentation to the user
- * in the specified locale.
- * This method returns the long name, not including daylight savings.
- * If the display name is not available for the locale,
- * then this method returns a string in the format
- * <code>GMT[+-]hh:mm</code>.
- * @param locale the locale in which to supply the display name.
- * @return the human-readable name of this time zone in the given locale
- * or in the default locale if the given locale is not recognized.
- */
- public final String getDisplayName(Locale locale) {
- return getDisplayName(false, LONG, locale);
- }
- /**
- * Returns a name of this time zone suitable for presentation to the user
- * in the default locale.
- * If the display name is not available for the locale,
- * then this method returns a string in the format
- * <code>GMT[+-]hh:mm</code>.
- * @param daylight if true, return the daylight savings name.
- * @param style either <code>LONG</code> or <code>SHORT</code>
- * @return the human-readable name of this time zone in the default locale.
- */
- public final String getDisplayName(boolean daylight, int style) {
- return getDisplayName(daylight, style, Locale.getDefault());
- }
- /**
- * Returns a name of this time zone suitable for presentation to the user
- * in the specified locale.
- * If the display name is not available for the locale,
- * then this method returns a string in the format
- * <code>GMT[+-]hh:mm</code>.
- * @param daylight if true, return the daylight savings name.
- * @param style either <code>LONG</code> or <code>SHORT</code>
- * @param locale the locale in which to supply the display name.
- * @return the human-readable name of this time zone in the given locale
- * or in the default locale if the given locale is not recognized.
- * @exception IllegalArgumentException style is invalid.
- */
- public String getDisplayName(boolean daylight, int style, Locale locale) {
- /* NOTES:
- * (1) We use SimpleDateFormat for simplicity; we could do this
- * more efficiently but it would duplicate the SimpleDateFormat code
- * here, which is undesirable.
- * (2) Attempts to move the code from SimpleDateFormat to here also run
- * aground because this requires SimpleDateFormat to keep a Locale
- * object around, which it currently doesn't; to synthesize such a
- * locale upon resurrection; and to somehow handle the special case of
- * construction from a DateFormatSymbols object.
- */
- if (style != SHORT && style != LONG) {
- throw new IllegalArgumentException("Illegal style: " + style);
- }
- // We keep a cache, indexed by locale. The cache contains a
- // SimpleDateFormat object, which we create on demand.
- SoftReference data = (SoftReference)cachedLocaleData.get(locale);
- SimpleDateFormat format;
- if (data == null ||
- (format = (SimpleDateFormat)data.get()) == null) {
- format = new SimpleDateFormat(null, locale);
- cachedLocaleData.put(locale, new SoftReference(format));
- }
- // Create a new SimpleTimeZone as a stand-in for this zone; the
- // stand-in will have no DST, or all DST, but the same ID and offset,
- // and hence the same display name.
- // We don't cache these because they're small and cheap to create.
- SimpleTimeZone tz = daylight ?
- new SimpleTimeZone(getRawOffset(), getID(),
- Calendar.JANUARY, 1, 0, 0,
- Calendar.DECEMBER, 31, 0, ONE_DAY) :
- new SimpleTimeZone(getRawOffset(), getID());
- format.applyPattern(style == LONG ? "zzzz" : "z");
- format.getCalendar().setTimeZone(tz);
- return format.format(new Date()); // Doesn't matter what date we use
- }
- /**
- * Queries if this time zone uses daylight savings time.
- * @return true if this time zone uses daylight savings time,
- * false, otherwise.
- */
- abstract public boolean useDaylightTime();
- /**
- * Queries if the given date is in daylight savings time in
- * this time zone.
- * @param date the given Date.
- * @return true if the given date is in daylight savings time,
- * false, otherwise.
- */
- abstract public boolean inDaylightTime(Date date);
- /**
- * Gets the <code>TimeZone</code> for the given ID.
- * @param ID the ID for a <code>TimeZone</code>, either an abbreviation such as
- * "PST", a full name such as "America/Los_Angeles", or a custom ID
- * such as "GMT-8:00".
- * @return the specified <code>TimeZone</code>, or the GMT zone if the given ID
- * cannot be understood.
- */
- public static synchronized TimeZone getTimeZone(String ID) {
- /* We first try to lookup the zone ID in our hashtable. If this fails,
- * we try to parse it as a custom string GMT[+-]hh:mm. This allows us
- * to recognize zones in user.timezone that otherwise cannot be
- * identified. We do the recognition here, rather than in getDefault(),
- * so that the default zone is always the result of calling
- * getTimeZone() with the property user.timezone.
- *
- * If all else fails, we return GMT, which is probably not what the user
- * wants, but at least is a functioning TimeZone object. */
- TimeZone zone = TimeZoneData.get(ID);
- if (zone == null) zone = parseCustomTimeZone(ID);
- if (zone == null) zone = (TimeZone)GMT.clone();
- return zone;
- }
- /**
- * Gets the available IDs according to the given time zone offset.
- * @param rawOffset the given time zone GMT offset.
- * @return an array of IDs, where the time zone for that ID has
- * the specified GMT offset. For example, "America/Phoenix" and "America/Denver"
- * both have GMT-07:00, but differ in daylight savings behavior.
- */
- // Updated to fix bug 4250355
- public static synchronized String[] getAvailableIDs(int rawOffset) {
- String[] result;
- Vector matched = new Vector();
- /* The array TimeZoneData.zones is no longer sorted by raw offset.
- * Now scanning through all zone data to match offset.
- */
- for (int i = 0; i < TimeZoneData.zones.length; ++i) {
- if (TimeZoneData.zones[i].getRawOffset() == rawOffset)
- matched.add(TimeZoneData.zones[i].getID());
- }
- result = new String[matched.size()];
- matched.toArray(result);
- return result;
- }
- /**
- * Gets all the available IDs supported.
- * @return an array of IDs.
- */
- public static synchronized String[] getAvailableIDs() {
- String[] resultArray = new String[TimeZoneData.zones.length];
- int count = 0;
- for (int i = 0; i < TimeZoneData.zones.length; ++i)
- resultArray[count++] = TimeZoneData.zones[i].getID();
- // copy into array of the right size and return
- String[] finalResult = new String[count];
- System.arraycopy(resultArray, 0, finalResult, 0, count);
- return finalResult;
- }
- /**
- * Gets the platform defined TimeZone ID.
- **/
- private static native String getSystemTimeZoneID(String javaHome,
- String region);
- /**
- * Gets the default <code>TimeZone</code> for this host.
- * The source of the default <code>TimeZone</code>
- * may vary with implementation.
- * @return a default <code>TimeZone</code>.
- */
- public static synchronized TimeZone getDefault() {
- if (defaultZone == null) {
- // get the time zone ID from the system properties
- String zoneID = (String) AccessController.doPrivileged(
- new GetPropertyAction("user.timezone"));
- // if the time zone ID is not set (yet), perform the
- // platform to Java time zone ID mapping.
- if (zoneID == null || zoneID.equals("")) {
- String region = (String) AccessController.doPrivileged(
- new GetPropertyAction("user.region"));
- String javaHome = (String) AccessController.doPrivileged(
- new GetPropertyAction("java.home"));
- zoneID = getSystemTimeZoneID(javaHome, region);
- if (zoneID == null) {
- zoneID = GMT_ID;
- }
- final String id = zoneID;
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- System.setProperty("user.timezone", id);
- return null;
- }
- });
- }
- defaultZone = getTimeZone(zoneID);
- }
- return (TimeZone)defaultZone.clone();
- }
- /**
- * Sets the <code>TimeZone</code> that is
- * returned by the <code>getDefault</code> method.
- * @param zone the new default time zone
- */
- public static synchronized void setDefault(TimeZone zone)
- {
- defaultZone = zone;
- }
- /**
- * Returns true if this zone has the same rule and offset as another zone.
- * That is, if this zone differs only in ID, if at all.
- * @param other the <code>TimeZone</code> object to be compared with
- * @return true if the given zone is the same as this one,
- * with the possible exception of the ID
- */
- public boolean hasSameRules(TimeZone other) {
- return getRawOffset() == other.getRawOffset() &&
- useDaylightTime() == other.useDaylightTime();
- }
- /**
- * Overrides Cloneable
- */
- public Object clone()
- {
- try {
- TimeZone other = (TimeZone) super.clone();
- other.ID = ID;
- return other;
- } catch (CloneNotSupportedException e) {
- throw new InternalError();
- }
- }
- // =======================privates===============================
- /**
- * The string identifier of this <code>TimeZone</code>. This is a
- * programmatic identifier used internally to look up <code>TimeZone</code>
- * objects from the system table and also to map them to their localized
- * display names. <code>ID</code> values are unique in the system
- * table but may not be for dynamically created zones.
- * @serial
- */
- private String ID;
- private static TimeZone defaultZone = null;
- static final String GMT_ID = "GMT";
- private static final int GMT_ID_LENGTH = 3;
- private static final String CUSTOM_ID = "Custom";
- private static NumberFormat numberFormat = null;
- private static final TimeZone GMT = new SimpleTimeZone(0, GMT_ID);
- /**
- * Parse a custom time zone identifier and return a corresponding zone.
- * @param id a string of the form GMT[+-]hh:mm, GMT[+-]hhmm, or
- * GMT[+-]hh.
- * @return a newly created SimpleTimeZone with the given offset and
- * no daylight savings time, or null if the id cannot be parsed.
- */
- private static final SimpleTimeZone parseCustomTimeZone(String id) {
- if (id.length() > GMT_ID_LENGTH &&
- id.regionMatches(true, 0, GMT_ID, 0, GMT_ID_LENGTH)) {
- ParsePosition pos = new ParsePosition(GMT_ID_LENGTH);
- boolean negative = false;
- int offset;
- if (id.charAt(pos.getIndex()) == '-')
- negative = true;
- else if (id.charAt(pos.getIndex()) != '+')
- return null;
- pos.setIndex(pos.getIndex() + 1);
- // Create NumberFormat if necessary
- synchronized (TimeZoneData.class) {
- if (numberFormat == null) {
- numberFormat = NumberFormat.getInstance();
- numberFormat.setParseIntegerOnly(true);
- }
- }
- synchronized (numberFormat) {
- // Look for either hh:mm, hhmm, or hh
- int start = pos.getIndex();
- Number n = numberFormat.parse(id, pos);
- if (n == null) return null;
- offset = n.intValue();
- if (pos.getIndex() < id.length() &&
- id.charAt(pos.getIndex()) == ':') {
- // hh:mm
- offset *= 60;
- pos.setIndex(pos.getIndex() + 1);
- n = numberFormat.parse(id, pos);
- if (n == null) return null;
- offset += n.intValue();
- }
- else {
- // hhmm or hh
- // Be strict about interpreting something as hh; it must be
- // an offset < 30, and it must be one or two digits. Thus
- // 0010 is interpreted as 00:10, but 10 is interpreted as
- // 10:00.
- if (offset < 30 && (pos.getIndex() - start) <= 2)
- offset *= 60; // hh, from 00 to 29; 30 is 00:30
- else
- offset = offset % 100 + offset / 100 * 60; // hhmm
- }
- if (negative) offset = -offset;
- return new SimpleTimeZone(offset * 60000, CUSTOM_ID);
- }
- }
- return null;
- }
- // Internal Implementation Notes [LIU]
- //
- // TimeZone data is stored in two parts. The first is an encoding of the
- // rules for each TimeZone. A TimeZone rule includes the offset of a zone
- // in milliseconds from GMT, the starting month and day for daylight savings
- // time, if there is any, and the ending month and day for daylight savings
- // time. The starting and ending days are specified in terms of the n-th
- // day of the week, for instance, the first Sunday or the last ("-1"-th)
- // Sunday of the month. The rules are stored as statically-constructed
- // SimpleTimeZone objects in the TimeZone class.
- //
- // Each rule has a unique internal identifier string which is used to
- // specify it. This identifier string is arbitrary, and is not to be shown
- // to the user -- it is for programmatic use only. In order to instantiate
- // a TimeZone object, you pass its identifier string to
- // TimeZone.getTimeZone(). (This identifier is also used to index the
- // localized string data.)
- //
- // The second part of the data consists of localized string names used by
- // DateFormat to describe various TimeZones. A TimeZone may have up to four
- // names: The abbreviated and long name for standard time in that zone, and
- // the abbreviated and long name for daylight savings time in that zone.
- // The data also includes a representative city. For example, [ "PST",
- // "Pacific Standard Time", "PDT", "Pacific Daylight Time", "Los Angeles" ]
- // might be one such set of string names in the en_US locale. These strings
- // are intended to be shown to the user. The string data is indexed in the
- // system by a pair (String id, Locale locale). The id is the unique string
- // identifier for the rule for the given TimeZone (as passed to
- // TimeZone.getTimeZone()). String names are stored as localized resource
- // data of the class java.text.resources.DateFormatZoneData??? where ??? is
- // the Locale specifier (e.g., DateFormatZoneData_en_US). This data is a
- // two-dimensional array of strings with N rows and 6 columns. The columns
- // are id, short standard name, long standard name, short daylight name,
- // long daylight name, representative city name.
- //
- // The mapping between rules (SimpleTimeZone objects) and localized string
- // names (DateFormatZoneData objects) is one-to-many. That is, there will
- // sometimes be more than one localized string name sets associated with
- // each rule.
- //
- // Each locale can potentially have localized name data for all time zones.
- // Since we support approximately 90 time zones and approximately 50
- // locales, there can be over 4500 sets of localized names. In practice,
- // only a fraction of these names are provided. If a time zone needs to be
- // displayed to the user in a given locale, and there is no string data in
- // that locale for that time zone, then the default representation will be
- // shown. This is a string of the form GMT+HHMM or GMT-HHMM, where HHMM
- // represents the offset in hours and minutes with respect to GMT. This
- // format is used because it is recognized in all locales. In order to make
- // this mechanism to work, the root resource data (in the class
- // DateFormatZoneData) is left empty.
- //
- // The current default TimeZone is determined via the system property
- // user.timezone. This is set by the platform-dependent native code to
- // a three-letter abbreviation. We interpret these into our own internal
- // IDs using a lookup table.
- }
- /**
- * Encapsulates data for international timezones. This package-private class is for
- * internal use only by TimeZone. It encapsulates the list of recognized international
- * timezones. By implementing this as a separate class, the loading and initialization
- * cost for this array is delayed until a TimeZone object is actually created from its ID.
- * This class contains only static variables and static methods; it cannot be instantiated.
- */
- class TimeZoneData
- {
- static final TimeZone get(String ID) {
- Object o = lookup.get(ID);
- return o == null ? null : (TimeZone)((TimeZone)o).clone(); // [sic]
- }
- // ---------------- BEGIN GENERATED DATA ----------------
- private static final int ONE_HOUR = 60*60*1000;
- static SimpleTimeZone zones[] = {
- // The following data is current as of 1998.
- // Total Unix zones: 343
- // Total Java zones: 289
- // Not all Unix zones become Java zones due to duplication and overlap.
- //----------------------------------------------------------
- new SimpleTimeZone(-11*ONE_HOUR, "Pacific/Niue" /*NUT*/),
- // Pacific/Niue Niue(NU) -11:00 - NUT
- //----------------------------------------------------------
- new SimpleTimeZone(-11*ONE_HOUR, "Pacific/Apia" /*WST*/),
- // Pacific/Apia W Samoa(WS) -11:00 - WST # W Samoa Time
- new SimpleTimeZone(-11*ONE_HOUR, "MIT" /*alias for Pacific/Apia*/),
- //----------------------------------------------------------
- new SimpleTimeZone(-11*ONE_HOUR, "Pacific/Pago_Pago" /*SST*/),
- // Pacific/Pago_Pago American Samoa(US) -11:00 - SST # S=Samoa
- //----------------------------------------------------------
- new SimpleTimeZone(-10*ONE_HOUR, "Pacific/Tahiti" /*TAHT*/),
- // Pacific/Tahiti French Polynesia(PF) -10:00 - TAHT # Tahiti Time
- //----------------------------------------------------------
- new SimpleTimeZone(-10*ONE_HOUR, "Pacific/Fakaofo" /*TKT*/),
- // Pacific/Fakaofo Tokelau Is(TK) -10:00 - TKT # Tokelau Time
- //----------------------------------------------------------
- new SimpleTimeZone(-10*ONE_HOUR, "Pacific/Honolulu" /*HST*/),
- // Pacific/Honolulu Hawaii(US) -10:00 - HST
- new SimpleTimeZone(-10*ONE_HOUR, "HST" /*alias for Pacific/Honolulu*/),
- //----------------------------------------------------------
- new SimpleTimeZone(-10*ONE_HOUR, "America/Adak" /*HA%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule US 1967 max - Oct lastSun 2:00 0 S
- // Rule US 1987 max - Apr Sun>=1 2:00 1:00 D
- // America/Adak Alaska(US) -10:00 US HA%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-10*ONE_HOUR, "Pacific/Rarotonga") /*CK%sT*/,
- // Zone Pacific/Rarotonga Cook Is(CK) -10:00 Cook CK%sT
- //----------------------------------------------------------
- new SimpleTimeZone((int)(-9.5*ONE_HOUR), "Pacific/Marquesas" /*MART*/),
- // Pacific/Marquesas French Polynesia(PF) -9:30 - MART # Marquesas Time
- //----------------------------------------------------------
- new SimpleTimeZone(-9*ONE_HOUR, "Pacific/Gambier" /*GAMT*/),
- // Pacific/Gambier French Polynesia(PF) -9:00 - GAMT # Gambier Time
- //----------------------------------------------------------
- new SimpleTimeZone(-9*ONE_HOUR, "America/Anchorage" /*AK%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule US 1967 max - Oct lastSun 2:00 0 S
- // Rule US 1987 max - Apr Sun>=1 2:00 1:00 D
- // America/Anchorage Alaska(US) -9:00 US AK%sT
- new SimpleTimeZone(-9*ONE_HOUR, "AST" /*alias for America/Anchorage*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- //----------------------------------------------------------
- new SimpleTimeZone((int)(-8.5*ONE_HOUR), "Pacific/Pitcairn" /*PNT*/),
- // Pacific/Pitcairn Pitcairn(PN) -8:30 - PNT # Pitcairn Time
- //----------------------------------------------------------
- new SimpleTimeZone(-8*ONE_HOUR, "America/Vancouver" /*P%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule Vanc 1962 max - Oct lastSun 2:00 0 S
- // Rule Vanc 1987 max - Apr Sun>=1 2:00 1:00 D
- // America/Vancouver British Columbia(CA) -8:00 Vanc P%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-8*ONE_HOUR, "America/Tijuana" /*P%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule Mexico 1996 max - Apr Sun>=1 2:00 1:00 D
- // Rule Mexico 1996 max - Oct lastSun 2:00 0 S
- // America/Tijuana Mexico(MX) -8:00 Mexico P%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-8*ONE_HOUR, "America/Los_Angeles" /*P%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule US 1967 max - Oct lastSun 2:00 0 S
- // Rule US 1987 max - Apr Sun>=1 2:00 1:00 D
- // America/Los_Angeles US Pacific time, represented by Los Angeles(US) -8:00 US P%sT
- new SimpleTimeZone(-8*ONE_HOUR, "PST" /*alias for America/Los_Angeles*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- //----------------------------------------------------------
- new SimpleTimeZone(-7*ONE_HOUR, "America/Dawson_Creek" /*MST*/),
- // America/Dawson_Creek British Columbia(CA) -7:00 - MST
- //----------------------------------------------------------
- new SimpleTimeZone(-7*ONE_HOUR, "America/Phoenix" /*MST*/),
- // America/Phoenix ?(US) -7:00 - MST
- new SimpleTimeZone(-7*ONE_HOUR, "PNT" /*alias for America/Phoenix*/),
- //----------------------------------------------------------
- new SimpleTimeZone(-7*ONE_HOUR, "America/Edmonton" /*M%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule Edm 1972 max - Oct lastSun 2:00 0 S
- // Rule Edm 1987 max - Apr Sun>=1 2:00 1:00 D
- // America/Edmonton Alberta(CA) -7:00 Edm M%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-7*ONE_HOUR, "America/Mazatlan" /*M%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule Mexico 1996 max - Apr Sun>=1 2:00 1:00 D
- // Rule Mexico 1996 max - Oct lastSun 2:00 0 S
- // America/Mazatlan Mexico(MX) -7:00 Mexico M%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-7*ONE_HOUR, "America/Denver" /*M%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule US 1967 max - Oct lastSun 2:00 0 S
- // Rule US 1987 max - Apr Sun>=1 2:00 1:00 D
- // America/Denver US Mountain time, represented by Denver(US) -7:00 US M%sT
- new SimpleTimeZone(-7*ONE_HOUR, "MST" /*alias for America/Denver*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- //----------------------------------------------------------
- new SimpleTimeZone(-6*ONE_HOUR, "America/Belize" /*C%sT*/),
- // America/Belize Belize(BZ) -6:00 - C%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-6*ONE_HOUR, "America/Regina" /*CST*/),
- // America/Regina Saskatchewan(CA) -6:00 - CST
- //----------------------------------------------------------
- new SimpleTimeZone(-6*ONE_HOUR, "Pacific/Galapagos" /*GALT*/),
- // Pacific/Galapagos Ecuador(EC) -6:00 - GALT # Galapagos Time
- //----------------------------------------------------------
- new SimpleTimeZone(-6*ONE_HOUR, "America/Guatemala" /*C%sT*/),
- // America/Guatemala Guatemala(GT) -6:00 - C%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-6*ONE_HOUR, "America/Tegucigalpa" /*C%sT*/),
- // America/Tegucigalpa Honduras(HN) -6:00 - C%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-6*ONE_HOUR, "America/El_Salvador" /*C%sT*/),
- // America/El_Salvador El Salvador(SV) -6:00 - C%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-6*ONE_HOUR, "America/Costa_Rica" /*C%sT*/),
- // America/Costa_Rica Costa Rica(CR) -6:00 - C%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-6*ONE_HOUR, "America/Winnipeg" /*C%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule Winn 1966 max - Oct lastSun 2:00 0 S
- // Rule Winn 1987 max - Apr Sun>=1 2:00 1:00 D
- // America/Winnipeg Manitoba(CA) -6:00 Winn C%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-6*ONE_HOUR, "Pacific/Easter" /*EAS%sT*/,
- Calendar.OCTOBER, 9, -Calendar.SUNDAY /*DOW>=DOM*/, 0*ONE_HOUR,
- Calendar.MARCH, 9, -Calendar.SUNDAY /*DOW>=DOM*/, 0*ONE_HOUR, 1*ONE_HOUR),
- // Rule Chile 1969 max - Oct Sun>=9 0:00 1:00 S
- // Rule Chile 1970 max - Mar Sun>=9 0:00 0 -
- // Pacific/Easter Chile(CL) -6:00 Chile EAS%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-6*ONE_HOUR, "America/Mexico_City" /*C%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule Mexico 1996 max - Apr Sun>=1 2:00 1:00 D
- // Rule Mexico 1996 max - Oct lastSun 2:00 0 S
- // America/Mexico_City Mexico(MX) -6:00 Mexico C%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-6*ONE_HOUR, "America/Chicago" /*C%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule US 1967 max - Oct lastSun 2:00 0 S
- // Rule US 1987 max - Apr Sun>=1 2:00 1:00 D
- // America/Chicago US Central time, represented by Chicago(US) -6:00 US C%sT
- new SimpleTimeZone(-6*ONE_HOUR, "CST" /*alias for America/Chicago*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/Porto_Acre" /*AST*/),
- // America/Porto_Acre Brazil(BR) -5:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/Bogota" /*CO%sT*/),
- // America/Bogota Colombia(CO) -5:00 - CO%sT # Colombia Time
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/Guayaquil" /*ECT*/),
- // America/Guayaquil Ecuador(EC) -5:00 - ECT # Ecuador Time
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/Jamaica" /*EST*/),
- // America/Jamaica Jamaica(JM) -5:00 - EST
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/Cayman" /*EST*/),
- // America/Cayman Cayman Is(KY) -5:00 - EST
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/Managua" /*EST*/),
- // America/Managua Nicaragua(NI) -5:00 - EST
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/Panama" /*EST*/),
- // America/Panama Panama(PA) -5:00 - EST
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/Lima" /*PE%sT*/),
- // America/Lima Peru(PE) -5:00 - PE%sT # Peru Time
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/Indianapolis" /*EST*/),
- // America/Indianapolis Indiana(US) -5:00 - EST
- new SimpleTimeZone(-5*ONE_HOUR, "IET" /*alias for America/Indianapolis*/),
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/Nassau" /*E%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule Bahamas 1964 max - Oct lastSun 2:00 0 S
- // Rule Bahamas 1987 max - Apr Sun>=1 2:00 1:00 D
- // America/Nassau Bahamas(BS) -5:00 Bahamas E%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/Montreal" /*E%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule Mont 1957 max - Oct lastSun 2:00 0 S
- // Rule Mont 1987 max - Apr Sun>=1 2:00 1:00 D
- // America/Montreal Ontario, Quebec(CA) -5:00 Mont E%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/Havana" /*C%sT*/,
- Calendar.MARCH, -1, Calendar.SUNDAY /*DOW_GE_DOM*/, 0,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_GE_DOM*/, 1*ONE_HOUR, 1*ONE_HOUR),
- // Rule Cuba 1998 max - Mar lastSun 0:00s 1:00 D
- // Rule Cuba 1998 max - Oct lastSun 0:00s 0 S
- // Zone America/Havana Cuba(CU) -5:00 Cuba C%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/Port-au-Prince"),
- // Zone America/Port-au-Prince Haiti(HT) -5:00 Haiti E%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/Grand_Turk" /*E%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 0*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 0*ONE_HOUR, 1*ONE_HOUR),
- // Rule TC 1979 max - Oct lastSun 0:00 0 S
- // Rule TC 1987 max - Apr Sun>=1 0:00 1:00 D
- // America/Grand_Turk Turks and Caicos(TC) -5:00 TC E%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-5*ONE_HOUR, "America/New_York" /*E%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule US 1967 max - Oct lastSun 2:00 0 S
- // Rule US 1987 max - Apr Sun>=1 2:00 1:00 D
- // America/New_York US Eastern time, represented by New York(US) -5:00 US E%sT
- new SimpleTimeZone(-5*ONE_HOUR, "EST" /*alias for America/New_York*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Antigua" /*AST*/),
- // America/Antigua Antigua and Barbuda(AG) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Anguilla" /*AST*/),
- // America/Anguilla Anguilla(AI) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Curacao" /*AST*/),
- // America/Curacao Curacao(AN) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Aruba" /*AST*/),
- // America/Aruba Aruba(AW) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Barbados" /*A%sT*/),
- // America/Barbados Barbados(BB) -4:00 - A%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/La_Paz" /*BOT*/),
- // America/La_Paz Bolivia(BO) -4:00 - BOT # Bolivia Time
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Manaus" /*WST*/),
- // America/Manaus Brazil(BR) -4:00 - WST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Dominica" /*AST*/),
- // America/Dominica Dominica(DM) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Santo_Domingo" /*AST*/),
- // America/Santo_Domingo Dominican Republic(DO) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Grenada" /*AST*/),
- // America/Grenada Grenada(GD) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Guadeloupe" /*AST*/),
- // America/Guadeloupe Guadeloupe(GP) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Guyana" /*GYT*/),
- // America/Guyana Guyana(GY) -4:00 - GYT
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/St_Kitts" /*AST*/),
- // America/St_Kitts St Kitts-Nevis(KN) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/St_Lucia" /*AST*/),
- // America/St_Lucia St Lucia(LC) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Martinique" /*AST*/),
- // America/Martinique Martinique(MQ) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Montserrat" /*AST*/),
- // America/Montserrat Montserrat(MS) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Puerto_Rico" /*AST*/),
- // America/Puerto_Rico Puerto Rico(PR) -4:00 - AST
- new SimpleTimeZone(-4*ONE_HOUR, "PRT" /*alias for America/Puerto_Rico*/),
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Port_of_Spain" /*AST*/),
- // America/Port_of_Spain Trinidad and Tobago(TT) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/St_Vincent" /*AST*/),
- // America/St_Vincent St Vincent and the Grenadines(VC) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Tortola" /*AST*/),
- // America/Tortola British Virgin Is(VG) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/St_Thomas" /*AST*/),
- // America/St_Thomas Virgin Is(VI) -4:00 - AST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Caracas" /*VET*/),
- // America/Caracas Venezuela(VE) -4:00 - VET
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "Antarctica/Palmer" /*CL%sT*/,
- Calendar.OCTOBER, 9, -Calendar.SUNDAY /*DOW>=DOM*/, 0*ONE_HOUR,
- Calendar.MARCH, 9, -Calendar.SUNDAY /*DOW>=DOM*/, 0*ONE_HOUR, 1*ONE_HOUR),
- // Rule ChileAQ 1969 max - Oct Sun>=9 0:00 1:00 S
- // Rule ChileAQ 1970 max - Mar Sun>=9 0:00 0 -
- // Antarctica/Palmer USA - year-round bases(AQ) -4:00 ChileAQ CL%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "Atlantic/Bermuda" /*A%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule Bahamas 1964 max - Oct lastSun 2:00 0 S
- // Rule Bahamas 1987 max - Apr Sun>=1 2:00 1:00 D
- // Atlantic/Bermuda Bermuda(BM) -4:00 Bahamas A%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Cuiaba"),
- // Zone America/Cuiaba Brazil(BR) -4:00 - WST
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Halifax" /*A%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule Halifax 1962 max - Oct lastSun 2:00 0 S
- // Rule Halifax 1987 max - Apr Sun>=1 2:00 1:00 D
- // America/Halifax ?(CA) -4:00 Halifax A%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "Atlantic/Stanley" /*FK%sT*/,
- Calendar.SEPTEMBER, 8, -Calendar.SUNDAY /*DOW>=DOM*/, 0*ONE_HOUR,
- Calendar.APRIL, 16, -Calendar.SUNDAY /*DOW>=DOM*/, 0*ONE_HOUR, 1*ONE_HOUR),
- // Rule Falk 1986 max - Apr Sun>=16 0:00 0 -
- // Rule Falk 1996 max - Sep Sun>=8 0:00 1:00 S
- // Atlantic/Stanley Falklands(FK) -4:00 Falk FK%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Thule" /*A%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule Thule 1993 max - Apr Sun>=1 2:00 1:00 D
- // Rule Thule 1993 max - Oct lastSun 2:00 0 S
- // America/Thule ?(GL) -4:00 Thule A%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Asuncion" /*PY%sT*/,
- Calendar.OCTOBER, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 0*ONE_HOUR,
- Calendar.FEBRUARY, -1, Calendar.SUNDAY /*DOW_IN_MON*/, 0*ONE_HOUR, 1*ONE_HOUR),
- // Rule Para 1996 max - Oct Sun>=1 0:00 1:00 S
- // Rule Para 1999 max - Feb lastSun 0:00 0 -
- // Zone America/Asuncion Paraguay(PY) -4:00 Para PY%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-4*ONE_HOUR, "America/Santiago" /*CL%sT*/,
- Calendar.OCTOBER, 9, -Calendar.SUNDAY /*DOW>=DOM*/, 0*ONE_HOUR,
- Calendar.MARCH, 9, -Calendar.SUNDAY /*DOW>=DOM*/, 0*ONE_HOUR, 1*ONE_HOUR),
- // Rule Chile 1969 max - Oct Sun>=9 0:00 1:00 S
- // Rule Chile 1970 max - Mar Sun>=9 0:00 0 -
- // America/Santiago Chile(CL) -4:00 Chile CL%sT
- //----------------------------------------------------------
- new SimpleTimeZone((int)(-3.5*ONE_HOUR), "America/St_Johns" /*N%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- // Rule StJohns 1960 max - Oct lastSun 2:00 0 S
- // Rule StJohns 1989 max - Apr Sun>=1 2:00 1:00 D
- // America/St_Johns Canada(CA) -3:30 StJohns N%sT
- new SimpleTimeZone((int)(-3.5*ONE_HOUR), "CNT" /*alias for America/St_Johns*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_DOM*/, 2*ONE_HOUR, 1*ONE_HOUR),
- //----------------------------------------------------------
- new SimpleTimeZone(-3*ONE_HOUR, "America/Fortaleza" /*EST*/),
- // America/Fortaleza Brazil(BR) -3:00 - EST
- //----------------------------------------------------------
- new SimpleTimeZone(-3*ONE_HOUR, "America/Cayenne" /*GFT*/),
- // America/Cayenne French Guiana(GF) -3:00 - GFT
- //----------------------------------------------------------
- new SimpleTimeZone(-3*ONE_HOUR, "America/Paramaribo" /*SRT*/),
- // America/Paramaribo Suriname(SR) -3:00 - SRT
- //----------------------------------------------------------
- new SimpleTimeZone(-3*ONE_HOUR, "America/Montevideo" /*UY%sT*/),
- // America/Montevideo Uruguay(UY) -3:00 - UY%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-3*ONE_HOUR, "America/Buenos_Aires" /*AR%sT*/),
- // America/Buenos_Aires Argentina(AR) -3:00 - AR%sT
- new SimpleTimeZone(-3*ONE_HOUR, "AGT" /*alias for America/Buenos_Aires*/),
- //----------------------------------------------------------
- new SimpleTimeZone(-3*ONE_HOUR, "America/Godthab" /*WG%sT*/,
- Calendar.MARCH, -1, Calendar.SUNDAY /*DOW_IN_MON*/, 0*ONE_HOUR,
- Calendar.OCTOBER, -1, Calendar.SUNDAY /*DOW_IN_MON*/, 0*ONE_HOUR, 1*ONE_HOUR),
- // Rule EU 1981 max - Mar lastSun 1:00u 1:00 S
- // Rule EU 1996 max - Oct lastSun 1:00u 0 -
- // Zone America/Godthab ?(GL) -3:00 EU WG%sT
- //----------------------------------------------------------
- new SimpleTimeZone(-3*ONE_HOUR, "America/Miquelon" /*PM%sT*/,
- Calendar.APRIL, 1, -Calendar.SUNDAY /*DOW>=DOM*/, 2*ONE_H