/* * * * Copyright 1990-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program 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 program 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 at /legal/license.txt). * * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */ package com.sun.cldc.util.j2me; import java.util.*; /** * This class provides the time zone implementations * for J2ME CLDC/MIDP. By default, the only supported * time zone is UTC/GMT. Vendor-specific implementations * may provide additional time zones. * * @see java.util.TimeZone */ public class TimeZoneImpl extends TimeZone { static String HOME_ID = null; public TimeZoneImpl() {} /** * Constructs a TimeZone with the given base time zone offset from GMT * and time zone ID. Timezone IDs can be obtained from * TimeZone.getAvailableIDs. Normally you should use TimeZone.getDefault to * construct a TimeZone. * * @param rawOffset The given base time zone offset to GMT. * @param ID The time zone ID which is obtained from * TimeZone.getAvailableIDs. */ private TimeZoneImpl(int rawOffset, String ID) { this.rawOffset = rawOffset; this.ID = ID; dstSavings = millisPerHour; // In case user sets rules later } /** * Constructor. This constructor is identical to the 10-argument * constructor, but also takes a dstSavings parameter. * @param dstSavings The amount of time in ms saved during DST. * @exception IllegalArgumentException the month, day, dayOfWeek, or time * parameters are out of range for the start or end rule */ private TimeZoneImpl(int rawOffset, String ID, int startMonth, int startDay, int startDayOfWeek, int startTime, int endMonth, int endDay, int endDayOfWeek, int endTime, int dstSavings) { this.ID = ID; this.rawOffset = rawOffset; this.startMonth = startMonth; this.startDay = startDay; this.startDayOfWeek = startDayOfWeek; this.startTime = startTime; this.endMonth = endMonth; this.endDay = endDay; this.endDayOfWeek = endDayOfWeek; this.endTime = endTime; this.dstSavings = dstSavings; decodeRules(); if (dstSavings <= 0) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal DST savings" /* #endif */ ); } } /* 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; /** * Gets offset, for current date, modified in case of * daylight savings. This is the offset to add *to* GMT to get local time. * Gets the time zone offset, for current date, modified in case of daylight * savings. This is the offset to add *to* GMT to get local time. Assume * that the start and end month are distinct. This method may return incorrect * results for rules that start at the end of February (e.g., last Sunday in * February) or the beginning of March (e.g., March 1). * * @param era The era of the given date (0 = BC, 1 = AD). * @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 millis The milliseconds in day in <em>standard</em> local time. * @return The offset to add *to* GMT to get local time. * @exception IllegalArgumentException the era, month, day, * dayOfWeek, or millis parameters are out of range */ public int getOffset(int era, int year, int month, int day, int dayOfWeek, int millis) { if (month < Calendar.JANUARY || month > Calendar.DECEMBER) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal month " + month /* #endif */ ); } return getOffset(era, year, month, day, dayOfWeek, millis, staticMonthLength[month]); } /** * Gets offset, for current date, modified in case of * daylight savings. This is the offset to add <em>to</em> GMT to get local time. * Gets the time zone offset, for current date, modified in case of daylight * savings. This is the offset to add *to* GMT to get local time. Assume * that the start and end month are distinct. * @param era The era of the given date (0 = BC, 1 = AD). * @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 millis The milliseconds 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. * @exception IllegalArgumentException the era, month, day, * dayOfWeek, millis, or monthLength parameters are out of range */ int getOffset(int era, int year, int month, int day, int dayOfWeek, int millis, int monthLength) { if (true) { // Use this parameter checking code for normal operation. Only one // of these two blocks should actually get compiled into the class // file. if ((era != 0 && era != 1) || month < Calendar.JANUARY || month > Calendar.DECEMBER || day < 1 || day > monthLength || dayOfWeek < Calendar.SUNDAY || dayOfWeek > Calendar.SATURDAY || millis < 0 || millis >= millisPerDay || monthLength < 28 || monthLength > 31) { throw new IllegalArgumentException(); } } else { // This parameter checking code is better for debugging, but // overkill for normal operation. Only one of these two blocks // should actually get compiled into the class file. if (era != 0 && era != 1) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal era " + era /* #endif */ ); } if (month < Calendar.JANUARY || month > Calendar.DECEMBER) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal month " + month /* #endif */ ); } if (day < 1 || day > monthLength) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal day " + day /* #endif */ ); } if (dayOfWeek < Calendar.SUNDAY || dayOfWeek > Calendar.SATURDAY) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal day of week " + dayOfWeek /* #endif */ ); } if (millis < 0 || millis >= millisPerDay) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal millis " + millis /* #endif */ ); } if (monthLength < 28 || monthLength > 31) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal month length " + monthLength /* #endif */ ); } } int result = rawOffset; // Bail out if we are before the onset of daylight savings time if (!useDaylight || year < startYear || era != 1) return result; // Check for southern hemisphere. We assume that the start and end // month are different. boolean southern = (startMonth > endMonth); // Compare the date to the starting and ending rules.+1 = date>rule, -1 // = date<rule, 0 = date==rule. int startCompare = compareToRule(month, monthLength, day, dayOfWeek, millis, startMode, startMonth, startDayOfWeek, startDay, startTime); int endCompare = 0; // We don't always have to compute endCompare. For many instances, // startCompare is enough to determine if we are in DST or not. In the // northern hemisphere, if we are before the start rule, we can't have // DST. In the southern hemisphere, if we are after the start rule, we // must have DST. This is reflected in the way the next if statement // (not the one immediately following) short circuits. if (southern != (startCompare >= 0)) { // For the ending rule comparison, we add the dstSavings to the millis // passed in to convert them from standard to wall time. We then must // normalize the millis to the range 0..millisPerDay-1. millis += dstSavings; // Assume dstSavings > 0 while (millis >= millisPerDay) { millis -= millisPerDay; ++day; dayOfWeek = 1 + (dayOfWeek % 7); // Assume dayOfWeek is one-based if (day > monthLength) { day = 1; // When incrementing the month, it is desirable to overflow // from DECEMBER to DECEMBER+1, since we use the result to // compare against a real month. Wraparound of the value // leads to CR 4173604. ++month; } } endCompare = compareToRule(month, monthLength, day, dayOfWeek, millis, endMode, endMonth, endDayOfWeek, endDay, endTime); } // Check for both the northern and southern hemisphere cases. We // assume that in the northern hemisphere, the start rule is before the // end rule within the calendar year, and vice versa for the southern // hemisphere. if ((!southern && (startCompare >= 0 && endCompare < 0)) || (southern && (startCompare >= 0 || endCompare < 0))) { result += dstSavings; } return result; } /** * Compare a given date in the year to a rule. Return 1, 0, or -1, depending * on whether the date is after, equal to, or before the rule date. The * millis are compared directly against the ruleMillis, so any * standard-daylight adjustments must be handled by the caller. * * @return 1 if the date is after the rule date, -1 if the date is before * the rule date, or 0 if the date is equal to the rule date. */ private static int compareToRule(int month, int monthLen, int dayOfMonth, int dayOfWeek, int millis, int ruleMode, int ruleMonth, int ruleDayOfWeek, int ruleDay, int ruleMillis) { if (month < ruleMonth) return -1; else if (month > ruleMonth) return 1; int ruleDayOfMonth = 0; switch (ruleMode) { case DOM_MODE: ruleDayOfMonth = ruleDay; break; case DOW_IN_MONTH_MODE: // In this case ruleDay is the day-of-week-in-month if (ruleDay > 0) { ruleDayOfMonth = 1 + (ruleDay - 1) * 7 + (7 + ruleDayOfWeek - (dayOfWeek - dayOfMonth + 1)) % 7; } else { // Assume ruleDay < 0 here ruleDayOfMonth = monthLen + (ruleDay + 1) * 7 - (7 + (dayOfWeek + monthLen - dayOfMonth) - ruleDayOfWeek) % 7; } break; case DOW_GE_DOM_MODE: ruleDayOfMonth = ruleDay + (49 + ruleDayOfWeek - ruleDay - dayOfWeek + dayOfMonth) % 7; break; case DOW_LE_DOM_MODE: ruleDayOfMonth = ruleDay - (49 - ruleDayOfWeek + ruleDay + dayOfWeek - dayOfMonth) % 7; // Note at this point ruleDayOfMonth may be <1, although it will // be >=1 for well-formed rules. break; } if (dayOfMonth < ruleDayOfMonth) return -1; else if (dayOfMonth > ruleDayOfMonth) return 1; if (millis < ruleMillis) return -1; else if (millis > ruleMillis) return 1; else return 0; } /** * Gets the GMT offset for this time zone. */ public int getRawOffset() { // The given date will be taken into account while // we have the historical time zone data in place. return rawOffset; } /** * Queries if this time zone uses Daylight Savings Time. */ public boolean useDaylightTime() { return useDaylight; } /** * Gets the ID of this time zone. * @return the ID of this time zone. */ public String getID() { if (!isCustom) { return ID; } /* * mandated format is: (e.g.) * GMT+08:00 * 3 for GMT * + 1 for sign * + 2 for hours * + 1 for colon * + 2 for minutes * = 9 characters in StringBuffer */ StringBuffer result = new StringBuffer (9); int offset = getRawOffset(); int minutes = offset / (60 * 1000); int hours; minutes = (minutes < 0) ? -minutes : minutes; hours = minutes / 60; minutes = minutes % 60; result.append (GMT_ID); if (offset < 0) { result.append ('-'); } else { result.append ('+'); } appendTwoDigits (result, hours); result.append (":"); appendTwoDigits (result, minutes); return result.toString(); } /** * Gets the <code>TimeZone</code> for the given ID. * @param ID the ID for a <code>TimeZone</code>, either an abbreviation such as * "GMT", or a full name such as "America/Los_Angeles". * <p> The only time zone ID that is required to be supported is "GMT", * though typically, the timezones for the regions where the device is * sold should be supported. * @return the specified <code>TimeZone</code>, or null if the given ID * cannot be understood. */ public synchronized TimeZone getInstance(String ID) { if (ID == null) { if (HOME_ID == null) { HOME_ID = System.getProperty("com.sun.cldc.util.j2me.TimeZoneImpl.timezone"); if (HOME_ID == null) HOME_ID = "UTC"; } ID = HOME_ID; } // check the id string, not the computed string for (int i = 0; i < zones.length; i++) { TimeZoneImpl tzi = (TimeZoneImpl) zones[i]; if (tzi.ID.equals(ID)) return zones[i]; } return parseCustomTimeZone(ID); } static final String GMT_ID = "GMT"; private static final int GMT_ID_LENGTH = 3; /** * Parses a custom time zone identifier and returns a corresponding zone. * This method doesn't support the RFC 822 time zone format. (e.g., +hhmm) * * @param id a string of the <a href="#CustomID">custom ID form</a>. * @return a newly created TimeZone with the given offset and * no daylight saving time, or null if the id cannot be parsed. */ private static final TimeZone parseCustomTimeZone(String id) { int length; // Error if the length of id isn't long enough or id doesn't // start with "GMT". if ((length = id.length()) < (GMT_ID_LENGTH + 2) || id.indexOf(GMT_ID) != 0) { return null; } int index = GMT_ID_LENGTH; boolean negative = false; char c = id.charAt(index++); if (c == '-') { negative = true; } else if (c != '+') { return null; } int hours = 0; int num = 0; int countDelim = 0; int len = 0; while (index < length) { c = id.charAt(index++); if (c == ':') { if (countDelim > 0) { return null; } if (len > 2) { return null; } hours = num; countDelim++; num = 0; len = 0; continue; } if (c < '0' || c > '9') { return null; } num = num * 10 + (c - '0'); len++; } if (index != length) { return null; } if (countDelim == 0) { if (len <= 2) { hours = num; num = 0; } else { hours = num / 100; num %= 100; } } else { if (len != 2) { return null; } } if (len > 4) { return null; } if (hours > 23 || num > 59) { return null; } // compute in minutes int gmtOffset = hours * 60 + num; // now adjust to milliseconds gmtOffset *= 60 * 1000; TimeZoneImpl custom = new TimeZoneImpl(negative ? -gmtOffset : gmtOffset, id); custom.isCustom = true; return custom; } /** Gets all the available IDs supported. * @return an array of IDs. */ public synchronized String[] getIDs() { if (ids == null) { ids = new String[zones.length]; // use the actual String, rather than the // derived TimeZone ID for (int i = 0; i < zones.length; i++) { TimeZoneImpl tzi = (TimeZoneImpl) zones[i]; ids[i] = tzi.ID; } } return ids; } // =======================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 boolean isCustom; static String[] ids = null; /** * The month in which daylight savings time starts. This value must be * between <code>Calendar.JANUARY</code> and * <code>Calendar.DECEMBER</code> inclusive. This value must not equal * <code>endMonth</code>. * <p>If <code>useDaylight</code> is false, this value is ignored. * @serial */ private int startMonth; /** * This field has two possible interpretations: * <dl> * <dt><code>startMode == DOW_IN_MONTH</code></dt> * <dd> * <code>startDay</code> indicates the day of the month of * <code>startMonth</code> on which daylight * savings time starts, from 1 to 28, 30, or 31, depending on the * <code>startMonth</code>. * </dd> * <dt><code>startMode != DOW_IN_MONTH</code></dt> * <dd> * <code>startDay</code> indicates which <code>startDayOfWeek</code> in th * month <code>startMonth</code> daylight * savings time starts on. For example, a value of +1 and a * <code>startDayOfWeek</code> of <code>Calendar.SUNDAY</code> indicates the * first Sunday of <code>startMonth</code>. Likewise, +2 would indicate the * second Sunday, and -1 the last Sunday. A value of 0 is illegal. * </dd> * </ul> * <p>If <code>useDaylight</code> is false, this value is ignored. * @serial */ private int startDay; /** * The day of the week on which daylight savings time starts. This value * must be between <code>Calendar.SUNDAY</code> and * <code>Calendar.SATURDAY</code> inclusive. * <p>If <code>useDaylight</code> is false or * <code>startMode == DAY_OF_MONTH</code>, this value is ignored. * @serial */ private int startDayOfWeek; /** * The time in milliseconds after midnight at which daylight savings * time starts. This value is expressed as <em>wall time</em>, which means * it is compared to <em>standard</em> time for the daylight savings start. * <p>If <code>useDaylight</code> is false, this value is ignored. * @serial */ private int startTime; /** * The month in which daylight savings time ends. This value must be * between <code>Calendar.JANUARY</code> and * <code>Calendar.UNDECIMBER</code>. This value must not equal * <code>startMonth</code>. * <p>If <code>useDaylight</code> is false, this value is ignored. * @serial */ private int endMonth; /** * This field has two possible interpretations: * <dl> * <dt><code>endMode == DOW_IN_MONTH</code></dt> * <dd> * <code>endDay</code> indicates the day of the month of * <code>endMonth</code> on which daylight * savings time ends, from 1 to 28, 30, or 31, depending on the * <code>endMonth</code>. * </dd> * <dt><code>endMode != DOW_IN_MONTH</code></dt> * <dd> * <code>endDay</code> indicates which <code>endDayOfWeek</code> in th * month <code>endMonth</code> daylight * savings time ends on. For example, a value of +1 and a * <code>endDayOfWeek</code> of <code>Calendar.SUNDAY</code> indicates the * first Sunday of <code>endMonth</code>. Likewise, +2 would indicate the * second Sunday, and -1 the last Sunday. A value of 0 is illegal. * </dd> * </ul> * <p>If <code>useDaylight</code> is false, this value is ignored. * @serial */ private int endDay; /** * The day of the week on which daylight savings time ends. This value * must be between <code>Calendar.SUNDAY</code> and * <code>Calendar.SATURDAY</code> inclusive. * <p>If <code>useDaylight</code> is false or * <code>endMode == DAY_OF_MONTH</code>, this value is ignored. * @serial */ private int endDayOfWeek; /** * The time in milliseconds after midnight at which daylight savings * time ends. This value is expressed as <em>wall time</em>, which means * it is compared to <em>daylight</em> time for the daylight savings end. * <p>If <code>useDaylight</code> is false, this value is ignored. * @serial */ private int endTime; /** * The year in which daylight savings time is first observed. This is an AD * value. If this value is less than 1 then daylight savings is observed * for all AD years. * <p>If <code>useDaylight</code> is false, this value is ignored. * @serial */ private int startYear; /** * The offset in milliseconds between this zone and GMT. Negative offsets * are to the west of Greenwich. To obtain local <em>standard</em> time, * add the offset to GMT time. To obtain local wall time it may also be * necessary to add <code>dstSavings</code>. * @serial */ private int rawOffset; /** * A boolean value which is true if and only if this zone uses daylight * savings time. If this value is false, several other fields are ignored. * @serial */ private boolean useDaylight=false; // indicate if this time zone uses DST private static final int millisPerHour = 60*60*1000; private static final int millisPerDay = 24*millisPerHour; /** * This field was serialized in JDK 1.1, so we have to keep it that way * to maintain serialization compatibility. However, there's no need to * recreate the array each time we create a new time zone. * @serial An array of bytes containing the values {31, 28, 31, 30, 31, 30, * 31, 31, 30, 31, 30, 31}. This is ignored as of JDK 1.2, however, it must * be streamed out for compatibility with JDK 1.1. */ private final static byte staticMonthLength[] = {31,29,31,30,31,30,31,31,30,31,30,31}; //**NS** /** * Variables specifying the mode of the start rule. Takes the following * values: * <dl> * <dt><code>DOM_MODE</code></dt> * <dd> * Exact day of week; e.g., March 1. * </dd> * <dt><code>DOW_IN_MONTH_MODE</code></dt> * <dd> * Day of week in month; e.g., last Sunday in March. * </dd> * <dt><code>DOW_GE_DOM_MODE</code></dt> * <dd> * Day of week after day of month; e.g., Sunday on or after March 15. * </dd> * <dt><code>DOW_LE_DOM_MODE</code></dt> * <dd> * Day of week before day of month; e.g., Sunday on or before March 15. * </dd> * </dl> * The setting of this field affects the interpretation of the * <code>startDay</code> field. * <p>If <code>useDaylight</code> is false, this value is ignored. * @serial * @since JDK1.1.4 */ private int startMode; /** * Variables specifying the mode of the end rule. Takes the following * values: * <dl> * <dt><code>DOM_MODE</code></dt> * <dd> * Exact day of week; e.g., March 1. * </dd> * <dt><code>DOW_IN_MONTH_MODE</code></dt> * <dd> * Day of week in month; e.g., last Sunday in March. * </dd> * <dt><code>DOW_GE_DOM_MODE</code></dt> * <dd> * Day of week after day of month; e.g., Sunday on or after March 15. * </dd> * <dt><code>DOW_LE_DOM_MODE</code></dt> * <dd> * Day of week before day of month; e.g., Sunday on or before March 15. * </dd> * </dl> * The setting of this field affects the interpretation of the * <code>endDay</code> field. * <p>If <code>useDaylight</code> is false, this value is ignored. * @serial * @since JDK1.1.4 */ private int endMode; /** * A positive value indicating the amount of time saved during DST in * milliseconds. * Typically one hour (3600000); sometimes 30 minutes (1800000). * <p>If <code>useDaylight</code> is false, this value is ignored. * @serial * @since JDK1.1.4 */ private int dstSavings; /** * Constants specifying values of startMode and endMode. */ private static final int DOM_MODE = 1; // Exact day of month, "Mar 1" private static final int DOW_IN_MONTH_MODE = 2; // Day of week in month, "lastSun" private static final int DOW_GE_DOM_MODE = 3; // Day of week after day of month, "Sun>=15" private static final int DOW_LE_DOM_MODE = 4; // Day of week before day of month, "Sun<=21" //---------------------------------------------------------------------- // Rule representation // // We represent the following flavors of rules: // 5 the fifth of the month // lastSun the last Sunday in the month // lastMon the last Monday in the month // Sun>=8 first Sunday on or after the eighth // Sun<=25 last Sunday on or before the 25th // This is further complicated by the fact that we need to remain // backward compatible with the 1.1 FCS. Finally, we need to minimize // API changes. In order to satisfy these requirements, we support // three representation systems, and we translate between them. // // INTERNAL REPRESENTATION // This is the format TimeZone objects take after construction or // streaming in is complete. Rules are represented directly, using an // unencoded format. We will discuss the start rule only below; the end // rule is analogous. // startMode Takes on enumerated values DAY_OF_MONTH, // DOW_IN_MONTH, DOW_AFTER_DOM, or DOW_BEFORE_DOM. // startDay The day of the month, or for DOW_IN_MONTH mode, a // value indicating which DOW, such as +1 for first, // +2 for second, -1 for last, etc. // startDayOfWeek The day of the week. Ignored for DAY_OF_MONTH. // // ENCODED REPRESENTATION // This is the format accepted by the constructor and by setStartRule() // and setEndRule(). It uses various combinations of positive, negative, // and zero values to encode the different rules. This representation // allows us to specify all the different rule flavors without altering // the API. // MODE startMonth startDay startDayOfWeek // DOW_IN_MONTH_MODE >=0 !=0 >0 // DOM_MODE >=0 >0 ==0 // DOW_GE_DOM_MODE >=0 >0 <0 // DOW_LE_DOM_MODE >=0 <0 <0 // (no DST) don't care ==0 don't care // // STREAMED REPRESENTATION // We must retain binary compatibility with the 1.1 FCS. The 1.1 code only // handles DOW_IN_MONTH_MODE and non-DST mode, the latter indicated by the // flag useDaylight. When we stream an object out, we translate into an // approximate DOW_IN_MONTH_MODE representation so the object can be parsed // and used by 1.1 code. Following that, we write out the full // representation separately so that contemporary code can recognize and // parse it. The full representation is written in a "packed" format, // consisting of a version number, a length, and an array of bytes. Future // versions of this class may specify different versions. If they wish to // include additional data, they should do so by storing them after the // packed representation below. //---------------------------------------------------------------------- /** * Given a set of encoded rules in startDay and startDayOfMonth, decode * them and set the startMode appropriately. Do the same for endDay and * endDayOfMonth. Upon entry, the day of week variables may be zero or * negative, in order to indicate special modes. The day of month * variables may also be negative. Upon exit, the mode variables will be * set, and the day of week and day of month variables will be positive. * This method also recognizes a startDay or endDay of zero as indicating * no DST. */ private void decodeRules() { decodeStartRule(); decodeEndRule(); } /** * Decode the start rule and validate the parameters. The parameters are * expected to be in encoded form, which represents the various rule modes * by negating or zeroing certain values. Representation formats are: * <p> * <pre> * DOW_IN_MONTH DOM DOW>=DOM DOW<=DOM no DST * ------------ ----- -------- -------- ---------- * month 0..11 same same same don't care * day -5..5 1..31 1..31 -1..-31 0 * dayOfWeek 1..7 0 -1..-7 -1..-7 don't care * time 0..ONEDAY same same same don't care * </pre> * The range for month does not include UNDECIMBER since this class is * really specific to Calendar, which does not use that month. * The range for time includes ONEDAY (vs. ending at ONEDAY-1) because the * end rule is an exclusive limit point. That is, the range of times that * are in DST include those >= the start and < the end. For this reason, * it should be possible to specify an end of ONEDAY in order to include the * entire day. Although this is equivalent to time 0 of the following day, * it's not always possible to specify that, for example, on December 31. * While arguably the start range should still be 0..ONEDAY-1, we keep * the start and end ranges the same for consistency. */ private void decodeStartRule() { useDaylight = (startDay != 0) && (endDay != 0); if (startDay != 0) { if (startMonth < Calendar.JANUARY || startMonth > Calendar.DECEMBER) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal start month " + startMonth /* #endif */ ); } if (startTime < 0 || startTime > millisPerDay) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal start time " + startTime /* #endif */ ); } if (startDayOfWeek == 0) { startMode = DOM_MODE; } else { if (startDayOfWeek > 0) { startMode = DOW_IN_MONTH_MODE; } else { startDayOfWeek = -startDayOfWeek; if (startDay > 0) { startMode = DOW_GE_DOM_MODE; } else { startDay = -startDay; startMode = DOW_LE_DOM_MODE; } } if (startDayOfWeek > Calendar.SATURDAY) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal start day of week " + startDayOfWeek /* #endif */ ); } } if (startMode == DOW_IN_MONTH_MODE) { if (startDay < -5 || startDay > 5) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal start day of week in month " + startDay /* #endif */ ); } } else if (startDay > staticMonthLength[startMonth]) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal start day " + startDay /* #endif */ ); } } } /** * Decode the end rule and validate the parameters. This method is exactly * analogous to decodeStartRule(). * @see decodeStartRule */ private void decodeEndRule() { useDaylight = (startDay != 0) && (endDay != 0); if (endDay != 0) { if (endMonth < Calendar.JANUARY || endMonth > Calendar.DECEMBER) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal end month " + endMonth /* #endif */ ); } if (endTime < 0 || endTime > millisPerDay) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal end time " + endTime /* #endif */ ); } if (endDayOfWeek == 0) { endMode = DOM_MODE; } else { if (endDayOfWeek > 0) { endMode = DOW_IN_MONTH_MODE; } else { endDayOfWeek = -endDayOfWeek; if (endDay > 0) { endMode = DOW_GE_DOM_MODE; } else { endDay = -endDay; endMode = DOW_LE_DOM_MODE; } } if (endDayOfWeek > Calendar.SATURDAY) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal end day of week " + endDayOfWeek /* #endif */ ); } } if (endMode == DOW_IN_MONTH_MODE) { if (endDay < -5 || endDay > 5) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal end day of week in month " + endDay /* #endif */ ); } } else if (endDay > staticMonthLength[endMonth]) { throw new IllegalArgumentException( /* #ifdef VERBOSE_EXCEPTIONS */ /// skipped "Illegal end day " + endDay /* #endif */ ); } } } static TimeZone zones[] = { //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "GMT"), // GMT -(-) 0:00 - GMT new TimeZoneImpl(0*ONE_HOUR, "UTC"), /** * NOTE: as in this example, most implementations will only include * a handful of timezones * look for the closing comment which has a string of '*' asterisks ************* //////////////////////////////////////////////////////////// // America //---------------------------------------------------------- new TimeZoneImpl(-10*ONE_HOUR, "America/Adak", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-9*ONE_HOUR, "America/Anchorage", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-9*ONE_HOUR, "AST", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*ONE_HOUR, 1*ONE_HOUR), //---------------------------------------------------------- new TimeZoneImpl(-8*ONE_HOUR, "America/Vancouver", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-8*ONE_HOUR, "America/Tijuana", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-8*ONE_HOUR, "America/Los_Angeles", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-8*ONE_HOUR, "PST", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*ONE_HOUR, 1*ONE_HOUR), //---------------------------------------------------------- new TimeZoneImpl(-7*ONE_HOUR, "America/Dawson_Creek"), // America/Dawson_Creek British Columbia(CA) -7:00 - MST //---------------------------------------------------------- new TimeZoneImpl(-7*ONE_HOUR, "America/Phoenix"), // America/Phoenix ?(US) -7:00 - MST new TimeZoneImpl(-7*ONE_HOUR, "PNT"), //---------------------------------------------------------- new TimeZoneImpl(-7*ONE_HOUR, "America/Edmonton", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-7*ONE_HOUR, "America/Mazatlan", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-7*ONE_HOUR, "America/Denver", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-7*ONE_HOUR, "MST", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*ONE_HOUR, 1*ONE_HOUR), //---------------------------------------------------------- new TimeZoneImpl(-6*ONE_HOUR, "America/Belize"), // America/Belize Belize(BZ) -6:00 - C%sT //---------------------------------------------------------- new TimeZoneImpl(-6*ONE_HOUR, "America/Regina"), // America/Regina Saskatchewan(CA) -6:00 - CST //---------------------------------------------------------- new TimeZoneImpl(-6*ONE_HOUR, "America/Guatemala"), // America/Guatemala Guatemala(GT) -6:00 - C%sT //---------------------------------------------------------- new TimeZoneImpl(-6*ONE_HOUR, "America/Tegucigalpa"), // America/Tegucigalpa Honduras(HN) -6:00 - C%sT //---------------------------------------------------------- new TimeZoneImpl(-6*ONE_HOUR, "America/El_Salvador"), // America/El_Salvador El Salvador(SV) -6:00 - C%sT //---------------------------------------------------------- new TimeZoneImpl(-6*ONE_HOUR, "America/Costa_Rica"), // America/Costa_Rica Costa Rica(CR) -6:00 - C%sT //---------------------------------------------------------- new TimeZoneImpl(-6*ONE_HOUR, "America/Winnipeg", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-6*ONE_HOUR, "America/Mexico_City", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-6*ONE_HOUR, "America/Chicago", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-6*ONE_HOUR, "CST", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*ONE_HOUR, 1*ONE_HOUR), //---------------------------------------------------------- new TimeZoneImpl(-5*ONE_HOUR, "America/Porto_Acre"), // America/Porto_Acre Brazil(BR) -5:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-5*ONE_HOUR, "America/Bogota"), // America/Bogota Colombia(CO) -5:00 - CO%sT # Colombia Time //---------------------------------------------------------- new TimeZoneImpl(-5*ONE_HOUR, "America/Guayaquil"), // America/Guayaquil Ecuador(EC) -5:00 - ECT # Ecuador Time //---------------------------------------------------------- new TimeZoneImpl(-5*ONE_HOUR, "America/Jamaica"), // America/Jamaica Jamaica(JM) -5:00 - EST //---------------------------------------------------------- new TimeZoneImpl(-5*ONE_HOUR, "America/Cayman"), // America/Cayman Cayman Is(KY) -5:00 - EST //---------------------------------------------------------- new TimeZoneImpl(-5*ONE_HOUR, "America/Managua"), // America/Managua Nicaragua(NI) -5:00 - EST //---------------------------------------------------------- new TimeZoneImpl(-5*ONE_HOUR, "America/Panama"), // America/Panama Panama(PA) -5:00 - EST //---------------------------------------------------------- new TimeZoneImpl(-5*ONE_HOUR, "America/Lima"), // America/Lima Peru(PE) -5:00 - PE%sT # Peru Time //---------------------------------------------------------- new TimeZoneImpl(-5*ONE_HOUR, "America/Indianapolis"), // America/Indianapolis Indiana(US) -5:00 - EST new TimeZoneImpl(-5*ONE_HOUR, "IET"), //---------------------------------------------------------- new TimeZoneImpl(-5*ONE_HOUR, "America/Nassau", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-5*ONE_HOUR, "America/Montreal", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-5*ONE_HOUR, "America/Havana", Calendar.APRIL, 1, -Calendar.SUNDAY, 0*ONE_HOUR, Calendar.OCTOBER, 8, -Calendar.SUNDAY, 1*ONE_HOUR, 1*ONE_HOUR), // Rule Cuba 1990 max - Apr Sun>=1 0:00 1:00 D // Rule Cuba 1997 max - Oct Sun>=8 0:00s 0 S // America/Havana Cuba(CU) -5:00 Cuba C%sT //---------------------------------------------------------- new TimeZoneImpl(-5*ONE_HOUR, "America/Port-au-Prince", Calendar.APRIL, 1, -Calendar.SUNDAY, 1*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*ONE_HOUR, 1*ONE_HOUR), // Rule Haiti 1988 max - Apr Sun>=1 1:00s 1:00 D // Rule Haiti 1988 max - Oct lastSun 1:00s 0 S // America/Port-au-Prince Haiti(HT) -5:00 Haiti E%sT //---------------------------------------------------------- new TimeZoneImpl(-5*ONE_HOUR, "America/Grand_Turk", Calendar.APRIL, 1, -Calendar.SUNDAY, 0*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-5*ONE_HOUR, "America/New_York", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-5*ONE_HOUR, "EST", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*ONE_HOUR, 1*ONE_HOUR), //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Antigua"), // America/Antigua Antigua and Barbuda(AG) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Anguilla"), // America/Anguilla Anguilla(AI) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Curacao"), // America/Curacao Curacao(AN) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Aruba"), // America/Aruba Aruba(AW) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Barbados"), // America/Barbados Barbados(BB) -4:00 - A%sT //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/La_Paz"), // America/La_Paz Bolivia(BO) -4:00 - BOT # Bolivia Time //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Manaus"), // America/Manaus Brazil(BR) -4:00 - WST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Dominica"), // America/Dominica Dominica(DM) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Santo_Domingo"), // America/Santo_Domingo Dominican Republic(DO) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Grenada"), // America/Grenada Grenada(GD) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Guadeloupe"), // America/Guadeloupe Guadeloupe(GP) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Guyana"), // America/Guyana Guyana(GY) -4:00 - GYT //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/St_Kitts"), // America/St_Kitts St Kitts-Nevis(KN) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/St_Lucia"), // America/St_Lucia St Lucia(LC) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Martinique"), // America/Martinique Martinique(MQ) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Montserrat"), // America/Montserrat Montserrat(MS) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Puerto_Rico"), // America/Puerto_Rico Puerto Rico(PR) -4:00 - AST new TimeZoneImpl(-4*ONE_HOUR, "PRT"), //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Port_of_Spain"), // America/Port_of_Spain Trinidad and Tobago(TT) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/St_Vincent"), // America/St_Vincent St Vincent and the Grenadines(VC) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Tortola"), // America/Tortola British Virgin Is(VG) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/St_Thomas"), // America/St_Thomas Virgin Is(VI) -4:00 - AST //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Caracas"), // America/Caracas Venezuela(VE) -4:00 - VET //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Cuiaba", Calendar.OCTOBER, 1, -Calendar.SUNDAY, 0*ONE_HOUR, Calendar.FEBRUARY, 11, -Calendar.SUNDAY, 0*ONE_HOUR, 1*ONE_HOUR), // Rule Brazil 1998 max - Oct Sun>=1 0:00 1:00 D // Rule Brazil 1999 max - Feb Sun>=11 0:00 0 S // America/Cuiaba Brazil(BR) -4:00 Brazil W%sT //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Halifax", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-4*ONE_HOUR, "America/Thule", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-4*ONE_HOUR, "America/Asuncion", Calendar.OCTOBER, 1, 0, 0*ONE_HOUR, Calendar.MARCH, 1, 0, 0*ONE_HOUR, 1*ONE_HOUR), // Rule Para 1996 max - Mar 1 0:00 0 - // Rule Para 1997 max - Oct 1 0:00 1:00 S // America/Asuncion Paraguay(PY) -4:00 Para PY%sT //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "America/Santiago", Calendar.OCTOBER, 9, -Calendar.SUNDAY, 0*ONE_HOUR, Calendar.MARCH, 9, -Calendar.SUNDAY, 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 TimeZoneImpl((int)(-3.5*ONE_HOUR), "America/St_Johns", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl((int)(-3.5*ONE_HOUR), "CNT", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*ONE_HOUR, 1*ONE_HOUR), //---------------------------------------------------------- new TimeZoneImpl(-3*ONE_HOUR, "America/Fortaleza"), // America/Fortaleza Brazil(BR) -3:00 - EST //---------------------------------------------------------- new TimeZoneImpl(-3*ONE_HOUR, "America/Cayenne"), // America/Cayenne French Guiana(GF) -3:00 - GFT //---------------------------------------------------------- new TimeZoneImpl(-3*ONE_HOUR, "America/Paramaribo"), // America/Paramaribo Suriname(SR) -3:00 - SRT //---------------------------------------------------------- new TimeZoneImpl(-3*ONE_HOUR, "America/Montevideo"), // America/Montevideo Uruguay(UY) -3:00 - UY%sT //---------------------------------------------------------- new TimeZoneImpl(-3*ONE_HOUR, "America/Buenos_Aires"), // America/Buenos_Aires Argentina(AR) -3:00 - AR%sT new TimeZoneImpl(-3*ONE_HOUR, "AGT"), //---------------------------------------------------------- new TimeZoneImpl(-3*ONE_HOUR, "America/Godthab", Calendar.MARCH, -1, Calendar.SATURDAY, 22*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SATURDAY, 22*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 - // America/Godthab ?(GL) -3:00 EU WG%sT //---------------------------------------------------------- new TimeZoneImpl(-3*ONE_HOUR, "America/Miquelon", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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/Miquelon St Pierre and Miquelon(PM) -3:00 Mont PM%sT # Pierre & Miquelon Time //---------------------------------------------------------- new TimeZoneImpl(-3*ONE_HOUR, "America/Sao_Paulo", Calendar.OCTOBER, 1, -Calendar.SUNDAY, 0*ONE_HOUR, Calendar.FEBRUARY, 11, -Calendar.SUNDAY, 0*ONE_HOUR, 1*ONE_HOUR), // Rule Brazil 1998 max - Oct Sun>=1 0:00 1:00 D // Rule Brazil 1999 max - Feb Sun>=11 0:00 0 S // America/Sao_Paulo Brazil(BR) -3:00 Brazil E%sT new TimeZoneImpl(-3*ONE_HOUR, "BET", Calendar.OCTOBER, 1, -Calendar.SUNDAY, 0*ONE_HOUR, Calendar.FEBRUARY, 11, -Calendar.SUNDAY, 0*ONE_HOUR, 1*ONE_HOUR), //---------------------------------------------------------- new TimeZoneImpl(-2*ONE_HOUR, "America/Noronha"), // America/Noronha Brazil(BR) -2:00 - FST //---------------------------------------------------------- new TimeZoneImpl(-1*ONE_HOUR, "America/Scoresbysund", Calendar.MARCH, -1, Calendar.SUNDAY, 0*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 - // America/Scoresbysund ?(GL) -1:00 EU EG%sT //////////////////////////////////////////////////////////// // Antarctica //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "Antarctica/Palmer", Calendar.OCTOBER, 9, -Calendar.SUNDAY, 0*ONE_HOUR, Calendar.MARCH, 9, -Calendar.SUNDAY, 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 TimeZoneImpl(6*ONE_HOUR, "Antarctica/Mawson"), // Antarctica/Mawson Australia - territories(AQ) 6:00 - MAWT # Mawson Time //---------------------------------------------------------- new TimeZoneImpl(8*ONE_HOUR, "Antarctica/Casey"), // Antarctica/Casey Australia - territories(AQ) 8:00 - WST # Western (Aus) Standard Time //---------------------------------------------------------- new TimeZoneImpl(10*ONE_HOUR, "Antarctica/DumontDUrville"), // Antarctica/DumontDUrville France - year-round bases(AQ) 10:00 - DDUT # Dumont-d'Urville Time //---------------------------------------------------------- new TimeZoneImpl(12*ONE_HOUR, "Antarctica/McMurdo", Calendar.OCTOBER, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.MARCH, 15, -Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule NZAQ 1990 max - Oct Sun>=1 2:00s 1:00 D // Rule NZAQ 1990 max - Mar Sun>=15 2:00s 0 S // Antarctica/McMurdo USA - year-round bases(AQ) 12:00 NZAQ NZ%sT //////////////////////////////////////////////////////////// // Australia //---------------------------------------------------------- new TimeZoneImpl(8*ONE_HOUR, "Australia/Perth"), // Australia/Perth Australia(AU) 8:00 - WST //---------------------------------------------------------- new TimeZoneImpl((int)(9.5*ONE_HOUR), "Australia/Darwin"), // Australia/Darwin Australia(AU) 9:30 - CST new TimeZoneImpl((int)(9.5*ONE_HOUR), "ACT"), //---------------------------------------------------------- new TimeZoneImpl((int)(9.5*ONE_HOUR), "Australia/Adelaide", Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.MARCH, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule AS 1987 max - Oct lastSun 2:00s 1:00 - // Rule AS 1995 max - Mar lastSun 2:00s 0 - // Australia/Adelaide South Australia(AU) 9:30 AS CST //---------------------------------------------------------- new TimeZoneImpl(10*ONE_HOUR, "Australia/Brisbane"), // Australia/Brisbane Australia(AU) 10:00 - EST //---------------------------------------------------------- new TimeZoneImpl(10*ONE_HOUR, "Australia/Sydney", Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.MARCH, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule AN 1987 max - Oct lastSun 2:00s 1:00 - // Rule AN 1996 max - Mar lastSun 2:00s 0 - // Australia/Sydney New South Wales(AU) 10:00 AN EST new TimeZoneImpl(10*ONE_HOUR, "AET", Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.MARCH, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), //---------------------------------------------------------- new TimeZoneImpl((int)(10.5*ONE_HOUR), "Australia/Lord_Howe", Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.MARCH, -1, Calendar.SUNDAY, 3*ONE_HOUR, (int)(0.5*ONE_HOUR)), // Rule LH 1987 max - Oct lastSun 2:00s 0:30 - // Rule LH 1996 max - Mar lastSun 2:00s 0 - // Australia/Lord_Howe Lord Howe Island(AU) 10:30 LH LHST //////////////////////////////////////////////////////////// // Atlantic //---------------------------------------------------------- new TimeZoneImpl(-4*ONE_HOUR, "Atlantic/Bermuda", Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 TimeZoneImpl(-4*ONE_HOUR, "Atlantic/Stanley", Calendar.SEPTEMBER, 8, -Calendar.SUNDAY, 0*ONE_HOUR, Calendar.APRIL, 16, -Calendar.SUNDAY, 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 TimeZoneImpl(-2*ONE_HOUR, "Atlantic/South_Georgia"), // Atlantic/South_Georgia South Georgia(GS) -2:00 - GST # South Georgia Time //---------------------------------------------------------- new TimeZoneImpl(-1*ONE_HOUR, "Atlantic/Jan_Mayen"), // Atlantic/Jan_Mayen ?(NO) -1:00 - EGT //---------------------------------------------------------- new TimeZoneImpl(-1*ONE_HOUR, "Atlantic/Cape_Verde"), // Atlantic/Cape_Verde Cape Verde(CV) -1:00 - CVT //---------------------------------------------------------- new TimeZoneImpl(-1*ONE_HOUR, "Atlantic/Azores", Calendar.MARCH, -1, Calendar.SUNDAY, 0*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 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 - // Atlantic/Azores Portugal(PT) -1:00 EU AZO%sT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Atlantic/Reykjavik"), // Atlantic/Reykjavik Iceland(IS) 0:00 - GMT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Atlantic/Faeroe", Calendar.MARCH, -1, Calendar.SUNDAY, 1*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 1*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 - // Atlantic/Faeroe Denmark, Faeroe Islands, and Greenland(DK) 0:00 EU WE%sT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Atlantic/Canary", Calendar.MARCH, -1, Calendar.SUNDAY, 1*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 1*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 - // Atlantic/Canary Spain(ES) 0:00 EU WE%sT //////////////////////////////////////////////////////////// // Africa //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Africa/Ouagadougou"), // Africa/Ouagadougou Burkina Faso(BF) 0:00 - GMT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Africa/Abidjan"), // Africa/Abidjan Cote D'Ivoire(CI) 0:00 - GMT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Africa/Accra"), // Africa/Accra Ghana(GH) 0:00 - %s //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Africa/Banjul"), // Africa/Banjul Gambia(GM) 0:00 - GMT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Africa/Conakry"), // Africa/Conakry Guinea(GN) 0:00 - GMT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Africa/Bissau"), // Africa/Bissau Guinea-Bissau(GW) 0:00 - GMT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Africa/Monrovia"), // Africa/Monrovia Liberia(LR) 0:00 - GMT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Africa/Casablanca"), // Africa/Casablanca Morocco(MA) 0:00 - WET //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Africa/Timbuktu"), // Africa/Timbuktu Mali(ML) 0:00 - GMT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Africa/Nouakchott"), // Africa/Nouakchott Mauritania(MR) 0:00 - GMT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Atlantic/St_Helena"), // Atlantic/St_Helena St Helena(SH) 0:00 - GMT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Africa/Freetown"), // Africa/Freetown Sierra Leone(SL) 0:00 - %s //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Africa/Dakar"), // Africa/Dakar Senegal(SN) 0:00 - GMT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Africa/Sao_Tome"), // Africa/Sao_Tome Sao Tome and Principe(ST) 0:00 - GMT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Africa/Lome"), // Africa/Lome Togo(TG) 0:00 - GMT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Africa/Luanda"), // Africa/Luanda Angola(AO) 1:00 - WAT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Africa/Porto-Novo"), // Africa/Porto-Novo Benin(BJ) 1:00 - WAT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Africa/Bangui"), // Africa/Bangui Central African Republic(CF) 1:00 - WAT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Africa/Kinshasa"), // Africa/Kinshasa Democratic Republic of Congo(CG) 1:00 - WAT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Africa/Douala"), // Africa/Douala Cameroon(CM) 1:00 - WAT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Africa/Libreville"), // Africa/Libreville Gabon(GA) 1:00 - WAT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Africa/Malabo"), // Africa/Malabo Equatorial Guinea(GQ) 1:00 - WAT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Africa/Niamey"), // Africa/Niamey Niger(NE) 1:00 - WAT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Africa/Lagos"), // Africa/Lagos Nigeria(NG) 1:00 - WAT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Africa/Ndjamena"), // Africa/Ndjamena Chad(TD) 1:00 - WAT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Africa/Tunis"), // Africa/Tunis Tunisia(TN) 1:00 - CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Africa/Algiers"), // Africa/Algiers Algeria(DZ) 1:00 - CET //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Africa/Tripoli", Calendar.MARCH, -1, Calendar.THURSDAY, 2*ONE_HOUR, Calendar.OCTOBER, 1, -Calendar.THURSDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Libya 1997 max - Mar lastThu 2:00s 1:00 S // Rule Libya 1997 max - Oct Thu>=1 2:00s 0 - // Africa/Tripoli Libya(LY) 1:00 Libya CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Africa/Windhoek", Calendar.SEPTEMBER, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.APRIL, 1, -Calendar.SUNDAY, 2*ONE_HOUR, 1*ONE_HOUR), // Rule Namibia 1994 max - Sep Sun>=1 2:00 1:00 S // Rule Namibia 1995 max - Apr Sun>=1 2:00 0 - // Africa/Windhoek Namibia(NA) 1:00 Namibia WA%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Africa/Bujumbura"), // Africa/Bujumbura Burundi(BI) 2:00 - CAT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Africa/Gaborone"), // Africa/Gaborone Botswana(BW) 2:00 - CAT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Africa/Lubumbashi"), // Africa/Lubumbashi Democratic Republic of Congo(CG) 2:00 - CAT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Africa/Maseru"), // Africa/Maseru Lesotho(LS) 2:00 - SAST //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Africa/Blantyre"), // Africa/Blantyre Malawi(ML) 2:00 - CAT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Africa/Maputo"), // Africa/Maputo Mozambique(MZ) 2:00 - CAT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Africa/Kigali"), // Africa/Kigali Rwanda(RW) 2:00 - CAT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Africa/Khartoum"), // Africa/Khartoum Sudan(SD) 2:00 - CA%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Africa/Mbabane"), // Africa/Mbabane Swaziland(SZ) 2:00 - SAST //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Africa/Lusaka"), // Africa/Lusaka Zambia(ZM) 2:00 - CAT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Africa/Harare"), // Africa/Harare Zimbabwe(ZW) 2:00 - CAT new TimeZoneImpl(2*ONE_HOUR, "CAT"), //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Africa/Johannesburg"), // Africa/Johannesburg South Africa(ZA) 2:00 - SAST //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Africa/Cairo", Calendar.APRIL, -1, Calendar.FRIDAY, 1*ONE_HOUR, Calendar.SEPTEMBER, -1, Calendar.FRIDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Egypt 1995 max - Apr lastFri 1:00 1:00 S // Rule Egypt 1995 max - Sep lastFri 3:00 0 - // Africa/Cairo Egypt(EG) 2:00 Egypt EE%sT new TimeZoneImpl(2*ONE_HOUR, "ART", Calendar.APRIL, -1, Calendar.FRIDAY, 1*ONE_HOUR, Calendar.SEPTEMBER, -1, Calendar.FRIDAY, 3*ONE_HOUR, 1*ONE_HOUR), //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Africa/Djibouti"), // Africa/Djibouti Djibouti(DJ) 3:00 - EAT //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Africa/Asmera"), // Africa/Asmera Eritrea(ER) 3:00 - EAT //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Africa/Addis_Ababa"), // Africa/Addis_Ababa Ethiopia(ET) 3:00 - EAT new TimeZoneImpl(3*ONE_HOUR, "EAT"), //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Africa/Nairobi"), // Africa/Nairobi Kenya(KE) 3:00 - EAT //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Africa/Mogadishu"), // Africa/Mogadishu Somalia(SO) 3:00 - EAT //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Africa/Dar_es_Salaam"), // Africa/Dar_es_Salaam Tanzania(TZ) 3:00 - EAT //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Africa/Kampala"), // Africa/Kampala Uganda(UG) 3:00 - EAT //////////////////////////////////////////////////////////// // Europe //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Europe/Dublin", Calendar.MARCH, -1, Calendar.SUNDAY, 1*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 1*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 - // Europe/Dublin ---(IE) 0:00 EU GMT/IST //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Europe/Lisbon", Calendar.MARCH, -1, Calendar.SUNDAY, 1*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 1*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 - // Europe/Lisbon Portugal(PT) 0:00 EU WE%sT //---------------------------------------------------------- new TimeZoneImpl(0*ONE_HOUR, "Europe/London", Calendar.MARCH, -1, Calendar.SUNDAY, 1*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 1*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 - // Europe/London ---(GB) 0:00 EU GMT/BST //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Andorra", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Andorra Andorra(AD) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Tirane", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Tirane Albania(AL) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Vienna", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Vienna Austria(AT) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Brussels", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Brussels Belgium(BE) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Zurich", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Zurich Switzerland(CH) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Prague", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Prague Czech Republic(CZ) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Berlin", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Berlin Germany(DE) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Copenhagen", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Copenhagen Denmark, Faeroe Islands, and Greenland(DK) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Madrid", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Madrid Spain(ES) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Gibraltar", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Gibraltar Gibraltar(GI) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Budapest", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Budapest Hungary(HU) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Rome", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Rome Italy(IT) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Vaduz", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Vaduz Liechtenstein(LI) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Luxembourg", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Luxembourg Luxembourg(LU) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Monaco", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Monaco Monaco(MC) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Malta", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Malta Malta(MT) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Amsterdam", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Amsterdam Netherlands(NL) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Oslo", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Oslo Norway(NO) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Warsaw", Calendar.MARCH, -1, Calendar.SUNDAY, 1*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*ONE_HOUR, 1*ONE_HOUR), // Rule W-Eur 1981 max - Mar lastSun 1:00s 1:00 S // Rule W-Eur 1996 max - Oct lastSun 1:00s 0 - // Europe/Warsaw Poland(PL) 1:00 W-Eur CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Stockholm", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Stockholm Sweden(SE) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Belgrade", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Belgrade Yugoslavia(YU) 1:00 EU CE%sT //---------------------------------------------------------- new TimeZoneImpl(1*ONE_HOUR, "Europe/Paris", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*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 - // Europe/Paris France(FR) 1:00 EU CE%sT new TimeZoneImpl(1*ONE_HOUR, "ECT", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*ONE_HOUR, 1*ONE_HOUR), new TimeZoneImpl(2*ONE_HOUR, "Europe/Sofia", Calendar.MARCH, -1, Calendar.SUNDAY, 0*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 0*ONE_HOUR, 1*ONE_HOUR), // Rule E-Eur 1981 max - Mar lastSun 0:00 1:00 S // Rule E-Eur 1996 max - Oct lastSun 0:00 0 - // Europe/Sofia Bulgaria(BG) 2:00 E-Eur EE%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Europe/Minsk", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S // Rule Russia 1996 max - Oct lastSun 2:00s 0 - // Europe/Minsk Belarus(BY) 2:00 Russia EE%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Europe/Tallinn", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule C-Eur 1981 max - Mar lastSun 2:00s 1:00 S // Rule C-Eur 1996 max - Oct lastSun 2:00s 0 - // Europe/Tallinn Estonia(EE) 2:00 C-Eur EE%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Europe/Helsinki", Calendar.MARCH, -1, Calendar.SUNDAY, 3*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*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 - // Europe/Helsinki Finland(FI) 2:00 EU EE%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Europe/Athens", Calendar.MARCH, -1, Calendar.SUNDAY, 3*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*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 - // Europe/Athens Greece(GR) 2:00 EU EE%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Europe/Vilnius", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule C-Eur 1981 max - Mar lastSun 2:00s 1:00 S // Rule C-Eur 1996 max - Oct lastSun 2:00s 0 - // Europe/Vilnius Lithuania(LT) 2:00 C-Eur EE%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Europe/Riga", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.SEPTEMBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Latvia 1992 max - Mar lastSun 2:00s 1:00 S // Rule Latvia 1992 max - Sep lastSun 2:00s 0 - // Europe/Riga Latvia(LV) 2:00 Latvia EE%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Europe/Chisinau", Calendar.MARCH, -1, Calendar.SUNDAY, 0*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 0*ONE_HOUR, 1*ONE_HOUR), // Rule E-Eur 1981 max - Mar lastSun 0:00 1:00 S // Rule E-Eur 1996 max - Oct lastSun 0:00 0 - // Europe/Chisinau Moldova(MD) 2:00 E-Eur EE%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Europe/Bucharest", Calendar.MARCH, -1, Calendar.SUNDAY, 0*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 0*ONE_HOUR, 1*ONE_HOUR), // Rule E-Eur 1981 max - Mar lastSun 0:00 1:00 S // Rule E-Eur 1996 max - Oct lastSun 0:00 0 - // Europe/Bucharest Romania(RO) 2:00 E-Eur EE%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Europe/Kaliningrad", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S // Rule Russia 1996 max - Oct lastSun 2:00s 0 - // Europe/Kaliningrad Russia(RU) 2:00 Russia EE%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Europe/Kiev", Calendar.MARCH, -1, Calendar.SUNDAY, 3*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*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 - // Europe/Kiev Ukraine(UA) 2:00 EU EE%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Europe/Istanbul", Calendar.MARCH, -1, Calendar.SUNDAY, 3*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*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 - // Europe/Istanbul Turkey(TR) 2:00 EU EE%sT new TimeZoneImpl(2*ONE_HOUR, "EET", Calendar.MARCH, -1, Calendar.SUNDAY, 3*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Europe/Simferopol", Calendar.MARCH, -1, Calendar.SUNDAY, 3*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Crimea 1996 max - Mar lastSun 0:00u 1:00 - // Rule Crimea 1996 max - Oct lastSun 0:00u 0 - // Europe/Simferopol Ukraine(UA) 3:00 Crimea MSK/MSD //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Europe/Moscow", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S // Rule Russia 1996 max - Oct lastSun 2:00s 0 - // Europe/Moscow Russia(RU) 3:00 Russia MSK/MSD //---------------------------------------------------------- new TimeZoneImpl(4*ONE_HOUR, "Europe/Samara", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S // Rule Russia 1996 max - Oct lastSun 2:00s 0 - // Europe/Samara Russia(RU) 4:00 Russia SAM%sT //////////////////////////////////////////////////////////// // Asia //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Asia/Nicosia", Calendar.MARCH, -1, Calendar.SUNDAY, 0*ONE_HOUR, Calendar.SEPTEMBER, -1, Calendar.SUNDAY, 0*ONE_HOUR, 1*ONE_HOUR), // Rule Cyprus 1979 max - Sep lastSun 0:00 0 - // Rule Cyprus 1981 max - Mar lastSun 0:00 1:00 S // Asia/Nicosia Cyprus(CY) 2:00 Cyprus EE%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Asia/Jerusalem", Calendar.MARCH, 15, -Calendar.FRIDAY, 0*ONE_HOUR, Calendar.SEPTEMBER, 1, -Calendar.SUNDAY, 0*ONE_HOUR, 1*ONE_HOUR), // Rule Zion 1999 max - Mar Fri>=15 0:00 1:00 D // Rule Zion 1999 max - Sep Sun>=1 0:00 0 S // Asia/Jerusalem Israel(IL) 2:00 Zion I%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Asia/Amman", Calendar.APRIL, 1, -Calendar.FRIDAY, 0*ONE_HOUR, Calendar.SEPTEMBER, 15, -Calendar.FRIDAY, 1*ONE_HOUR, 1*ONE_HOUR), // Rule Jordan 1993 max - Apr Fri>=1 0:00 1:00 S // Rule Jordan 1995 max - Sep Fri>=15 0:00s 0 - // Asia/Amman Jordan(JO) 2:00 Jordan EE%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Asia/Beirut", Calendar.MARCH, -1, Calendar.SUNDAY, 0*ONE_HOUR, Calendar.SEPTEMBER, -1, Calendar.SUNDAY, 0*ONE_HOUR, 1*ONE_HOUR), // Rule Lebanon 1993 max - Mar lastSun 0:00 1:00 S // Rule Lebanon 1993 max - Sep lastSun 0:00 0 - // Asia/Beirut Lebanon(LB) 2:00 Lebanon EE%sT //---------------------------------------------------------- new TimeZoneImpl(2*ONE_HOUR, "Asia/Damascus", Calendar.APRIL, 1, 0, 0*ONE_HOUR, Calendar.OCTOBER, 1, 0, 0*ONE_HOUR, 1*ONE_HOUR), // Rule Syria 1994 max - Apr 1 0:00 1:00 S // Rule Syria 1994 max - Oct 1 0:00 0 - // Asia/Damascus Syria(SY) 2:00 Syria EE%sT //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Asia/Bahrain"), // Asia/Bahrain Bahrain(BH) 3:00 - AST //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Asia/Kuwait"), // Asia/Kuwait Kuwait(KW) 3:00 - AST //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Asia/Qatar"), // Asia/Qatar Qatar(QA) 3:00 - AST //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Asia/Aden"), // Asia/Aden Yemen(YE) 3:00 - AST //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Asia/Riyadh"), // Asia/Riyadh Saudi Arabia(SA) 3:00 - AST //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Asia/Baghdad", Calendar.APRIL, 1, 0, 3*ONE_HOUR, Calendar.OCTOBER, 1, 0, 4*ONE_HOUR, 1*ONE_HOUR), // Rule Iraq 1991 max - Apr 1 3:00s 1:00 D // Rule Iraq 1991 max - Oct 1 3:00s 0 D // Asia/Baghdad Iraq(IQ) 3:00 Iraq A%sT //---------------------------------------------------------- new TimeZoneImpl((int)(3.5*ONE_HOUR), "Asia/Tehran", Calendar.MARCH, 21, 0, 0*ONE_HOUR, Calendar.SEPTEMBER, 23, 0, 0*ONE_HOUR, 1*ONE_HOUR), // Rule Iran 1997 1999 - Mar 21 0:00 1:00 S // Rule Iran 1997 1999 - Sep 23 0:00 0 - // Asia/Tehran Iran(IR) 3:30 Iran IR%sT new TimeZoneImpl((int)(3.5*ONE_HOUR), "MET", Calendar.MARCH, 21, 0, 0*ONE_HOUR, Calendar.SEPTEMBER, 23, 0, 0*ONE_HOUR, 1*ONE_HOUR), //---------------------------------------------------------- new TimeZoneImpl(4*ONE_HOUR, "Asia/Dubai"), // Asia/Dubai United Arab Emirates(AE) 4:00 - GST //---------------------------------------------------------- new TimeZoneImpl(4*ONE_HOUR, "Asia/Muscat"), // Asia/Muscat Oman(OM) 4:00 - GST //---------------------------------------------------------- new TimeZoneImpl(4*ONE_HOUR, "Asia/Yerevan"), // Asia/Yerevan Armenia(AM) 4:00 - AM%sT new TimeZoneImpl(4*ONE_HOUR, "NET"), //---------------------------------------------------------- new TimeZoneImpl(4*ONE_HOUR, "Asia/Baku", Calendar.MARCH, -1, Calendar.SUNDAY, 5*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 5*ONE_HOUR, 1*ONE_HOUR), // Rule EUAsia 1981 max - Mar lastSun 1:00u 1:00 S // Rule EUAsia 1996 max - Oct lastSun 1:00u 0 - // Asia/Baku Azerbaijan(AZ) 4:00 EUAsia AZ%sT //---------------------------------------------------------- new TimeZoneImpl(4*ONE_HOUR, "Asia/Aqtau", Calendar.MARCH, -1, Calendar.SUNDAY, 0*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 0*ONE_HOUR, 1*ONE_HOUR), // Rule E-EurAsia 1981 max - Mar lastSun 0:00 1:00 S // Rule E-EurAsia 1996 max - Oct lastSun 0:00 0 - // Asia/Aqtau Kazakhstan(KZ) 4:00 E-EurAsia AQT%sT //---------------------------------------------------------- new TimeZoneImpl((int)(4.5*ONE_HOUR), "Asia/Kabul"), // Asia/Kabul Afghanistan(AF) 4:30 - AFT //---------------------------------------------------------- new TimeZoneImpl(5*ONE_HOUR, "Asia/Tbilisi"), // Asia/Tbilisi Georgia(GE) 5:00 - GET //---------------------------------------------------------- new TimeZoneImpl(5*ONE_HOUR, "Asia/Dushanbe"), // Asia/Dushanbe Tajikistan(TJ) 5:00 - TJT # Tajikistan Time //---------------------------------------------------------- new TimeZoneImpl(5*ONE_HOUR, "Asia/Ashkhabad"), // Asia/Ashkhabad Turkmenistan(TM) 5:00 - TMT # Turkmenistan Time //---------------------------------------------------------- new TimeZoneImpl(5*ONE_HOUR, "Asia/Tashkent"), // Asia/Tashkent Uzbekistan(UZ) 5:00 - UZT # Uzbekistan Time //---------------------------------------------------------- new TimeZoneImpl(5*ONE_HOUR, "Asia/Karachi"), // Asia/Karachi Pakistan(PK) 5:00 - PKT # Pakistan Time new TimeZoneImpl(5*ONE_HOUR, "PLT"), //---------------------------------------------------------- new TimeZoneImpl(5*ONE_HOUR, "Asia/Bishkek", Calendar.APRIL, 7, -Calendar.SUNDAY, 0*ONE_HOUR, Calendar.SEPTEMBER, -1, Calendar.SUNDAY, 0*ONE_HOUR, 1*ONE_HOUR), // Rule Kirgiz 1992 max - Apr Sun>=7 0:00 1:00 S // Rule Kirgiz 1991 max - Sep lastSun 0:00 0 - // Asia/Bishkek Kirgizstan(KG) 5:00 Kirgiz KG%sT # Kirgizstan Time //---------------------------------------------------------- new TimeZoneImpl(5*ONE_HOUR, "Asia/Aqtobe", Calendar.MARCH, -1, Calendar.SUNDAY, 0*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 0*ONE_HOUR, 1*ONE_HOUR), // Rule E-EurAsia 1981 max - Mar lastSun 0:00 1:00 S // Rule E-EurAsia 1996 max - Oct lastSun 0:00 0 - // Asia/Aqtobe Kazakhstan(KZ) 5:00 E-EurAsia AQT%sT //---------------------------------------------------------- new TimeZoneImpl(5*ONE_HOUR, "Asia/Yekaterinburg", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S // Rule Russia 1996 max - Oct lastSun 2:00s 0 - // Asia/Yekaterinburg Russia(RU) 5:00 Russia YEK%sT # Yekaterinburg Time //---------------------------------------------------------- new TimeZoneImpl((int)(5.5*ONE_HOUR), "Asia/Calcutta"), // Asia/Calcutta India(IN) 5:30 - IST new TimeZoneImpl((int)(5.5*ONE_HOUR), "IST"), //---------------------------------------------------------- new TimeZoneImpl((int)(5.75*ONE_HOUR), "Asia/Katmandu"), // Asia/Katmandu Nepal(NP) 5:45 - NPT # Nepal Time //---------------------------------------------------------- new TimeZoneImpl(6*ONE_HOUR, "Asia/Thimbu"), // Asia/Thimbu Bhutan(BT) 6:00 - BTT # Bhutan Time //---------------------------------------------------------- new TimeZoneImpl(6*ONE_HOUR, "Asia/Colombo"), // Asia/Colombo Sri Lanka(LK) 6:00 - LKT //---------------------------------------------------------- new TimeZoneImpl(6*ONE_HOUR, "Asia/Dacca"), // Asia/Dacca Bangladesh(BD) 6:00 - BDT # Bangladesh Time new TimeZoneImpl(6*ONE_HOUR, "BST"), //---------------------------------------------------------- new TimeZoneImpl(6*ONE_HOUR, "Asia/Alma-Ata", Calendar.MARCH, -1, Calendar.SUNDAY, 0*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 0*ONE_HOUR, 1*ONE_HOUR), // Rule E-EurAsia 1981 max - Mar lastSun 0:00 1:00 S // Rule E-EurAsia 1996 max - Oct lastSun 0:00 0 - // Asia/Alma-Ata Kazakhstan(KZ) 6:00 E-EurAsia ALM%sT //---------------------------------------------------------- new TimeZoneImpl(6*ONE_HOUR, "Asia/Novosibirsk", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S // Rule Russia 1996 max - Oct lastSun 2:00s 0 - // Asia/Novosibirsk Russia(RU) 6:00 Russia NOV%sT //---------------------------------------------------------- new TimeZoneImpl((int)(6.5*ONE_HOUR), "Asia/Rangoon"), // Asia/Rangoon Burma / Myanmar(MM) 6:30 - MMT # Myanmar Time //---------------------------------------------------------- new TimeZoneImpl(7*ONE_HOUR, "Asia/Jakarta"), // Asia/Jakarta Indonesia(ID) 7:00 - JAVT //---------------------------------------------------------- new TimeZoneImpl(7*ONE_HOUR, "Asia/Phnom_Penh"), // Asia/Phnom_Penh Cambodia(KH) 7:00 - ICT //---------------------------------------------------------- new TimeZoneImpl(7*ONE_HOUR, "Asia/Vientiane"), // Asia/Vientiane Laos(LA) 7:00 - ICT //---------------------------------------------------------- new TimeZoneImpl(7*ONE_HOUR, "Asia/Saigon"), // Asia/Saigon Vietnam(VN) 7:00 - ICT new TimeZoneImpl(7*ONE_HOUR, "VST"), //---------------------------------------------------------- new TimeZoneImpl(7*ONE_HOUR, "Asia/Bangkok"), // Asia/Bangkok Thailand(TH) 7:00 - ICT //---------------------------------------------------------- new TimeZoneImpl(7*ONE_HOUR, "Asia/Krasnoyarsk", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S // Rule Russia 1996 max - Oct lastSun 2:00s 0 - // Asia/Krasnoyarsk Russia(RU) 7:00 Russia KRA%sT //---------------------------------------------------------- new TimeZoneImpl(8*ONE_HOUR, "Asia/Brunei"), // Asia/Brunei Brunei(BN) 8:00 - BNT //---------------------------------------------------------- new TimeZoneImpl(8*ONE_HOUR, "Asia/Hong_Kong"), // Asia/Hong_Kong China(HK) 8:00 - C%sT //---------------------------------------------------------- new TimeZoneImpl(8*ONE_HOUR, "Asia/Ujung_Pandang"), // Asia/Ujung_Pandang Indonesia(ID) 8:00 - BORT //---------------------------------------------------------- new TimeZoneImpl(8*ONE_HOUR, "Asia/Ishigaki"), // Asia/Ishigaki Japan(JP) 8:00 - CST //---------------------------------------------------------- new TimeZoneImpl(8*ONE_HOUR, "Asia/Macao"), // Asia/Macao Macao(MO) 8:00 - C%sT //---------------------------------------------------------- new TimeZoneImpl(8*ONE_HOUR, "Asia/Kuala_Lumpur"), // Asia/Kuala_Lumpur Malaysia(MY) 8:00 - MYT # Malaysia Time //---------------------------------------------------------- new TimeZoneImpl(8*ONE_HOUR, "Asia/Manila"), // Asia/Manila Philippines(PH) 8:00 - PH%sT //---------------------------------------------------------- new TimeZoneImpl(8*ONE_HOUR, "Asia/Singapore"), // Asia/Singapore Singapore(SG) 8:00 - SGT //---------------------------------------------------------- new TimeZoneImpl(8*ONE_HOUR, "Asia/Taipei"), // Asia/Taipei Taiwan(TW) 8:00 - C%sT //---------------------------------------------------------- new TimeZoneImpl(8*ONE_HOUR, "Asia/Shanghai"), // Asia/Shanghai China(CN) 8:00 - C%sT new TimeZoneImpl(8*ONE_HOUR, "CTT"), //---------------------------------------------------------- new TimeZoneImpl(8*ONE_HOUR, "Asia/Ulan_Bator", Calendar.MARCH, -1, Calendar.SUNDAY, 0*ONE_HOUR, Calendar.SEPTEMBER, -1, Calendar.SUNDAY, 0*ONE_HOUR, 1*ONE_HOUR), // Rule Mongol 1991 max - Mar lastSun 0:00 1:00 S // Rule Mongol 1997 max - Sep lastSun 0:00 0 - // Asia/Ulan_Bator Mongolia(MN) 8:00 Mongol ULA%sT //---------------------------------------------------------- new TimeZoneImpl(8*ONE_HOUR, "Asia/Irkutsk", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S // Rule Russia 1996 max - Oct lastSun 2:00s 0 - // Asia/Irkutsk Russia(RU) 8:00 Russia IRK%sT //---------------------------------------------------------- new TimeZoneImpl(9*ONE_HOUR, "Asia/Jayapura"), // Asia/Jayapura Indonesia(ID) 9:00 - JAYT //---------------------------------------------------------- new TimeZoneImpl(9*ONE_HOUR, "Asia/Pyongyang"), // Asia/Pyongyang ?(KP) 9:00 - KST //---------------------------------------------------------- new TimeZoneImpl(9*ONE_HOUR, "Asia/Seoul"), // Asia/Seoul ?(KR) 9:00 - K%sT //---------------------------------------------------------- new TimeZoneImpl(9*ONE_HOUR, "Asia/Tokyo"), // Asia/Tokyo Japan(JP) 9:00 - JST new TimeZoneImpl(9*ONE_HOUR, "JST"), //---------------------------------------------------------- new TimeZoneImpl(9*ONE_HOUR, "Asia/Yakutsk", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S // Rule Russia 1996 max - Oct lastSun 2:00s 0 - // Asia/Yakutsk Russia(RU) 9:00 Russia YAK%sT //---------------------------------------------------------- new TimeZoneImpl(10*ONE_HOUR, "Asia/Vladivostok", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S // Rule Russia 1996 max - Oct lastSun 2:00s 0 - // Asia/Vladivostok Russia(RU) 10:00 Russia VLA%sT //---------------------------------------------------------- new TimeZoneImpl(11*ONE_HOUR, "Asia/Magadan", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S // Rule Russia 1996 max - Oct lastSun 2:00s 0 - // Asia/Magadan Russia(RU) 11:00 Russia MAG%sT //---------------------------------------------------------- new TimeZoneImpl(12*ONE_HOUR, "Asia/Kamchatka", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S // Rule Russia 1996 max - Oct lastSun 2:00s 0 - // Asia/Kamchatka Russia(RU) 12:00 Russia PET%sT //---------------------------------------------------------- new TimeZoneImpl(13*ONE_HOUR, "Asia/Anadyr", Calendar.MARCH, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S // Rule Russia 1996 max - Oct lastSun 2:00s 0 - // Asia/Anadyr Russia(RU) 13:00 Russia ANA%sT //////////////////////////////////////////////////////////// // India //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Indian/Comoro"), // Indian/Comoro Comoros(KM) 3:00 - EAT //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Indian/Antananarivo"), // Indian/Antananarivo Madagascar(MK) 3:00 - EAT //---------------------------------------------------------- new TimeZoneImpl(3*ONE_HOUR, "Indian/Mayotte"), // Indian/Mayotte Mayotte(YT) 3:00 - EAT //---------------------------------------------------------- new TimeZoneImpl(4*ONE_HOUR, "Indian/Mauritius"), // Indian/Mauritius Mauritius(MU) 4:00 - MUT # Mauritius Time //---------------------------------------------------------- new TimeZoneImpl(4*ONE_HOUR, "Indian/Reunion"), // Indian/Reunion Reunion(RE) 4:00 - RET # Reunion Time //---------------------------------------------------------- new TimeZoneImpl(4*ONE_HOUR, "Indian/Mahe"), // Indian/Mahe Seychelles(SC) 4:00 - SCT # Seychelles Time //---------------------------------------------------------- new TimeZoneImpl(5*ONE_HOUR, "Indian/Kerguelen"), // Indian/Kerguelen France - year-round bases(FR) 5:00 - TFT # ISO code TF Time //---------------------------------------------------------- new TimeZoneImpl(5*ONE_HOUR, "Indian/Chagos"), // Indian/Chagos British Indian Ocean Territory(IO) 5:00 - IOT # BIOT Time //---------------------------------------------------------- new TimeZoneImpl(5*ONE_HOUR, "Indian/Maldives"), // Indian/Maldives Maldives(MV) 5:00 - MVT # Maldives Time //---------------------------------------------------------- new TimeZoneImpl((int)(6.5*ONE_HOUR), "Indian/Cocos"), // Indian/Cocos Cocos(CC) 6:30 - CCT # Cocos Islands Time //---------------------------------------------------------- new TimeZoneImpl(7*ONE_HOUR, "Indian/Christmas"), // Indian/Christmas Australian miscellany(AU) 7:00 - CXT # Christmas Island Time //////////////////////////////////////////////////////////// // Pacific //---------------------------------------------------------- new TimeZoneImpl(9*ONE_HOUR, "Pacific/Palau"), // Pacific/Palau Palau(PW) 9:00 - PWT # Palau Time //---------------------------------------------------------- new TimeZoneImpl(10*ONE_HOUR, "Pacific/Truk"), // Pacific/Truk Micronesia(FM) 10:00 - TRUT # Truk Time //---------------------------------------------------------- new TimeZoneImpl(10*ONE_HOUR, "Pacific/Guam"), // Pacific/Guam Guam(GU) 10:00 - GST //---------------------------------------------------------- new TimeZoneImpl(10*ONE_HOUR, "Pacific/Saipan"), // Pacific/Saipan N Mariana Is(MP) 10:00 - MPT //---------------------------------------------------------- new TimeZoneImpl(10*ONE_HOUR, "Pacific/Port_Moresby"), // Pacific/Port_Moresby Papua New Guinea(PG) 10:00 - PGT # Papua New Guinea Time //---------------------------------------------------------- new TimeZoneImpl(11*ONE_HOUR, "Pacific/Ponape"), // Pacific/Ponape Micronesia(FM) 11:00 - PONT # Ponape Time //---------------------------------------------------------- new TimeZoneImpl(11*ONE_HOUR, "Pacific/Efate"), // Pacific/Efate Vanuatu(VU) 11:00 - VU%sT # Vanuatu Time //---------------------------------------------------------- new TimeZoneImpl(11*ONE_HOUR, "Pacific/Guadalcanal"), // Pacific/Guadalcanal Solomon Is(SB) 11:00 - SBT # Solomon Is Time new TimeZoneImpl(11*ONE_HOUR, "SST"), //---------------------------------------------------------- new TimeZoneImpl(11*ONE_HOUR, "Pacific/Noumea", Calendar.NOVEMBER, -1, Calendar.SUNDAY, 2*ONE_HOUR, Calendar.MARCH, 1, -Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule NC 1997 max - Mar Sun>=1 2:00s 0 - // Rule NC 1997 max - Nov lastSun 2:00s 1:00 S // Pacific/Noumea New Caledonia(NC) 11:00 NC NC%sT //---------------------------------------------------------- new TimeZoneImpl(-11*ONE_HOUR, "Pacific/Niue"), // Pacific/Niue Niue(NU) -11:00 - NUT //---------------------------------------------------------- new TimeZoneImpl(-11*ONE_HOUR, "Pacific/Apia"), // Pacific/Apia W Samoa(WS) -11:00 - WST # W Samoa Time new TimeZoneImpl(-11*ONE_HOUR, "MIT"), //---------------------------------------------------------- new TimeZoneImpl(-11*ONE_HOUR, "Pacific/Pago_Pago"), // Pacific/Pago_Pago American Samoa(US) -11:00 - SST # S=Samoa //---------------------------------------------------------- new TimeZoneImpl(-10*ONE_HOUR, "Pacific/Tahiti"), // Pacific/Tahiti French Polynesia(PF) -10:00 - TAHT # Tahiti Time //---------------------------------------------------------- new TimeZoneImpl(-10*ONE_HOUR, "Pacific/Fakaofo"), // Pacific/Fakaofo Tokelau Is(TK) -10:00 - TKT # Tokelau Time //---------------------------------------------------------- new TimeZoneImpl(-10*ONE_HOUR, "Pacific/Honolulu"), // Pacific/Honolulu Hawaii(US) -10:00 - HST new TimeZoneImpl(-10*ONE_HOUR, "HST"), //---------------------------------------------------------- new TimeZoneImpl(-10*ONE_HOUR, "Pacific/Rarotonga", Calendar.OCTOBER, -1, Calendar.SUNDAY, 0*ONE_HOUR, Calendar.MARCH, 1, -Calendar.SUNDAY, 0*ONE_HOUR, (int)(0.5*ONE_HOUR)), // Rule Cook 1979 max - Mar Sun>=1 0:00 0 - // Rule Cook 1979 max - Oct lastSun 0:00 0:30 HS // Pacific/Rarotonga Cook Is(CK) -10:00 Cook CK%sT //---------------------------------------------------------- new TimeZoneImpl((int)(-9.5*ONE_HOUR), "Pacific/Marquesas"), // Pacific/Marquesas French Polynesia(PF) -9:30 - MART # Marquesas Time //---------------------------------------------------------- new TimeZoneImpl(-9*ONE_HOUR, "Pacific/Gambier"), // Pacific/Gambier French Polynesia(PF) -9:00 - GAMT # Gambier Time //---------------------------------------------------------- new TimeZoneImpl((int)(-8.5*ONE_HOUR), "Pacific/Pitcairn"), // Pacific/Pitcairn Pitcairn(PN) -8:30 - PNT # Pitcairn Time //---------------------------------------------------------- new TimeZoneImpl(-6*ONE_HOUR, "Pacific/Galapagos"), // Pacific/Galapagos Ecuador(EC) -6:00 - GALT # Galapagos Time //---------------------------------------------------------- new TimeZoneImpl(-6*ONE_HOUR, "Pacific/Easter", Calendar.OCTOBER, 9, -Calendar.SUNDAY, 0*ONE_HOUR, Calendar.MARCH, 9, -Calendar.SUNDAY, 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 TimeZoneImpl((int)(11.5*ONE_HOUR), "Pacific/Norfolk"), // Pacific/Norfolk Norfolk(NF) 11:30 - NFT # Norfolk Time //---------------------------------------------------------- new TimeZoneImpl(12*ONE_HOUR, "Pacific/Kosrae"), // Pacific/Kosrae Micronesia(FM) 12:00 - KOST # Kosrae Time //---------------------------------------------------------- new TimeZoneImpl(12*ONE_HOUR, "Pacific/Tarawa"), // Pacific/Tarawa Kiribati(KI) 12:00 - GILT # Gilbert Is Time //---------------------------------------------------------- new TimeZoneImpl(12*ONE_HOUR, "Pacific/Majuro"), // Pacific/Majuro Marshall Is(MH) 12:00 - MHT //---------------------------------------------------------- new TimeZoneImpl(12*ONE_HOUR, "Pacific/Nauru"), // Pacific/Nauru Nauru(NR) 12:00 - NRT //---------------------------------------------------------- new TimeZoneImpl(12*ONE_HOUR, "Pacific/Funafuti"), // Pacific/Funafuti Tuvalu(TV) 12:00 - TVT # Tuvalu Time //---------------------------------------------------------- new TimeZoneImpl(12*ONE_HOUR, "Pacific/Wake"), // Pacific/Wake Wake(US) 12:00 - WAKT # Wake Time //---------------------------------------------------------- new TimeZoneImpl(12*ONE_HOUR, "Pacific/Wallis"), // Pacific/Wallis Wallis and Futuna(WF) 12:00 - WFT # Wallis & Futuna Time //---------------------------------------------------------- new TimeZoneImpl(12*ONE_HOUR, "Pacific/Fiji"), // Pacific/Fiji Fiji(FJ) 12:00 - FJT # Fiji Time //---------------------------------------------------------- new TimeZoneImpl(12*ONE_HOUR, "Pacific/Auckland", Calendar.OCTOBER, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.MARCH, 15, -Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), // Rule NZ 1990 max - Oct Sun>=1 2:00s 1:00 D // Rule NZ 1990 max - Mar Sun>=15 2:00s 0 S // Pacific/Auckland New Zealand(NZ) 12:00 NZ NZ%sT new TimeZoneImpl(12*ONE_HOUR, "NST", Calendar.OCTOBER, 1, -Calendar.SUNDAY, 2*ONE_HOUR, Calendar.MARCH, 15, -Calendar.SUNDAY, 3*ONE_HOUR, 1*ONE_HOUR), //---------------------------------------------------------- new TimeZoneImpl((int)(12.75*ONE_HOUR), "Pacific/Chatham", Calendar.OCTOBER, 1, -Calendar.SUNDAY, (int)(2.75*ONE_HOUR), Calendar.MARCH, 15, -Calendar.SUNDAY, (int)(3.75*ONE_HOUR), 1*ONE_HOUR), // Rule Chatham 1990 max - Oct Sun>=1 2:45s 1:00 D // Rule Chatham 1991 max - Mar Sun>=15 2:45s 0 S // Pacific/Chatham New Zealand(NZ) 12:45 Chatham CHA%sT //---------------------------------------------------------- new TimeZoneImpl(13*ONE_HOUR, "Pacific/Enderbury"), // Pacific/Enderbury Kiribati(KI) 13:00 - PHOT //---------------------------------------------------------- new TimeZoneImpl(13*ONE_HOUR, "Pacific/Tongatapu"), // Pacific/Tongatapu Tonga(TO) 13:00 - TOT //---------------------------------------------------------- new TimeZoneImpl(14*ONE_HOUR, "Pacific/Kiritimati"), // Pacific/Kiritimati Kiribati(KI) 14:00 - LINT ************/ }; private static final void appendTwoDigits(StringBuffer sb, int number) { if (number < 10) { sb.append('0'); } sb.append(number); } }