/*
*******************************************************************************
- * Copyright (C) 2011-2012, International Business Machines Corporation and *
+ * Copyright (C) 2011-2013, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
import java.util.Collection;
import java.util.Date;
import java.util.EnumSet;
+import java.util.Iterator;
import java.util.List;
import java.util.MissingResourceException;
+import java.util.Set;
import com.ibm.icu.impl.ICUResourceBundle;
import com.ibm.icu.impl.SoftCache;
+import com.ibm.icu.impl.TextTrieMap;
import com.ibm.icu.impl.TimeZoneGenericNames;
import com.ibm.icu.impl.TimeZoneGenericNames.GenericMatchInfo;
import com.ibm.icu.impl.TimeZoneGenericNames.GenericNameType;
import com.ibm.icu.util.Freezable;
import com.ibm.icu.util.Output;
import com.ibm.icu.util.TimeZone;
+import com.ibm.icu.util.TimeZone.SystemTimeZoneType;
import com.ibm.icu.util.ULocale;
/**
private static final long serialVersionUID = 2281246852693575022L;
+ private static final int ISO_Z_STYLE_FLAG = 0x0080;
+ private static final int ISO_LOCAL_STYLE_FLAG = 0x0100;
+
/**
* Time zone display format style enum used by format/parse APIs in <code>TimeZoneFormat</code>.
*
*/
public enum Style {
/**
- * Generic location format, such as "United States Time (New York)", "Italy Time"
+ * Generic location format, such as "United States Time (New York)" and "Italy Time".
+ * This style is equivalent to the LDML date format pattern "VVVV".
* @draft ICU 49
* @provisional This API might change or be removed in a future release.
*/
GENERIC_LOCATION (0x0001),
/**
* Generic long non-location format, such as "Eastern Time".
+ * This style is equivalent to the LDML date format pattern "vvvv".
* @draft ICU 49
* @provisional This API might change or be removed in a future release.
*/
GENERIC_LONG (0x0002),
/**
* Generic short non-location format, such as "ET".
+ * This style is equivalent to the LDML date format pattern "v".
* @draft ICU 49
* @provisional This API might change or be removed in a future release.
*/
GENERIC_SHORT (0x0004),
/**
* Specific long format, such as "Eastern Standard Time".
+ * This style is equivalent to the LDML date format pattern "zzzz".
* @draft ICU 49
* @provisional This API might change or be removed in a future release.
*/
SPECIFIC_LONG (0x0008),
/**
* Specific short format, such as "EST", "PDT".
+ * This style is equivalent to the LDML date format pattern "z".
* @draft ICU 49
* @provisional This API might change or be removed in a future release.
*/
SPECIFIC_SHORT (0x0010),
/**
- * RFC822 format, such as "-0500"
+ * Localized GMT offset format, such as "GMT-05:00", "UTC+0100"
+ * This style is equivalent to the LDML date format pattern "OOOO" and "ZZZZ"
* @draft ICU 49
* @provisional This API might change or be removed in a future release.
*/
- RFC822 (0x0020),
+ LOCALIZED_GMT (0x0020),
/**
- * Localized GMT offset format, such as "GMT-05:00", "UTC+0100"
- * @draft ICU 49
+ * Short localized GMT offset format, such as "GMT-5", "UTC+1:30"
+ * This style is equivalent to the LDML date format pattern "O".
+ * @draft ICU 51
* @provisional This API might change or be removed in a future release.
*/
- LOCALIZED_GMT (0x0040),
+ LOCALIZED_GMT_SHORT (0x0040),
/**
- * ISO 8601 format (extended), such as "-05:00", "Z"(UTC)
- * @draft ICU 49
+ * Short ISO 8601 local time difference (basic format) or the UTC indicator.
+ * For example, "-05", "+0530", and "Z"(UTC).
+ * This style is equivalent to the LDML date format pattern "X".
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ ISO_BASIC_SHORT (ISO_Z_STYLE_FLAG),
+ /**
+ * Short ISO 8601 locale time difference (basic format).
+ * For example, "-05" and "+0530".
+ * This style is equivalent to the LDML date format pattern "x".
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ ISO_BASIC_LOCAL_SHORT (ISO_LOCAL_STYLE_FLAG),
+ /**
+ * Fixed width ISO 8601 local time difference (basic format) or the UTC indicator.
+ * For example, "-0500", "+0530", and "Z"(UTC).
+ * This style is equivalent to the LDML date format pattern "XX".
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ ISO_BASIC_FIXED (ISO_Z_STYLE_FLAG),
+ /**
+ * Fixed width ISO 8601 local time difference (basic format).
+ * For example, "-0500" and "+0530".
+ * This style is equivalent to the LDML date format pattern "xx".
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ ISO_BASIC_LOCAL_FIXED (ISO_LOCAL_STYLE_FLAG),
+ /**
+ * ISO 8601 local time difference (basic format) with optional seconds field, or the UTC indicator.
+ * For example, "-0500", "+052538", and "Z"(UTC).
+ * This style is equivalent to the LDML date format pattern "XXXX".
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ ISO_BASIC_FULL (ISO_Z_STYLE_FLAG),
+ /**
+ * ISO 8601 local time difference (basic format) with optional seconds field.
+ * For example, "-0500" and "+052538".
+ * This style is equivalent to the LDML date format pattern "xxxx".
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ ISO_BASIC_LOCAL_FULL (ISO_LOCAL_STYLE_FLAG),
+ /**
+ * Fixed width ISO 8601 local time difference (extended format) or the UTC indicator.
+ * For example, "-05:00", "+05:30", and "Z"(UTC).
+ * This style is equivalent to the LDML date format pattern "XXX".
+ * @draft ICU 51
* @provisional This API might change or be removed in a future release.
*/
- ISO8601 (0x0080);
+ ISO_EXTENDED_FIXED (ISO_Z_STYLE_FLAG),
+ /**
+ * Fixed width ISO 8601 local time difference (extended format).
+ * For example, "-05:00" and "+05:30".
+ * This style is equivalent to the LDML date format pattern "xxx" and "ZZZZZ".
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ ISO_EXTENDED_LOCAL_FIXED (ISO_LOCAL_STYLE_FLAG),
+ /**
+ * ISO 8601 local time difference (extended format) with optional seconds field, or the UTC indicator.
+ * For example, "-05:00", "+05:25:38", and "Z"(UTC).
+ * This style is equivalent to the LDML date format pattern "XXXXX".
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ ISO_EXTENDED_FULL (ISO_Z_STYLE_FLAG),
+ /**
+ * ISO 8601 local time difference (extended format) with optional seconds field.
+ * For example, "-05:00" and "+05:25:38".
+ * This style is equivalent to the LDML date format pattern "xxxxx".
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ ISO_EXTENDED_LOCAL_FULL (ISO_LOCAL_STYLE_FLAG),
+ /**
+ * Time Zone ID, such as "America/Los_Angeles".
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ ZONE_ID (0x0200),
+ /**
+ * Short Time Zone ID (BCP 47 Unicode location extension, time zone type value), such as "uslax".
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ ZONE_ID_SHORT (0x0400),
+ /**
+ * Exemplar location, such as "Los Angeles" and "Paris".
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ EXEMPLAR_LOCATION (0x0800);
final int flag;
*/
public enum GMTOffsetPatternType {
/**
- * Positive offset with hour and minute fields
+ * Positive offset with hours and minutes fields
* @draft ICU 49
* @provisional This API might change or be removed in a future release.
*/
- POSITIVE_HM ("+HH:mm", "Hm", true),
+ POSITIVE_HM ("+H:mm", "Hm", true),
/**
- * Positive offset with hour, minute and second fields
+ * Positive offset with hours, minutes and seconds fields
* @draft ICU 49
* @provisional This API might change or be removed in a future release.
*/
- POSITIVE_HMS ("+HH:mm:ss", "Hms", true),
+ POSITIVE_HMS ("+H:mm:ss", "Hms", true),
/**
- * Negative offset with hour and minute fields
+ * Negative offset with hours and minutes fields
* @draft ICU 49
* @provisional This API might change or be removed in a future release.
*/
- NEGATIVE_HM ("-HH:mm", "Hm", false),
+ NEGATIVE_HM ("-H:mm", "Hm", false),
/**
- * Negative offset with hour, minute and second fields
+ * Negative offset with hours, minutes and seconds fields
* @draft ICU 49
* @provisional This API might change or be removed in a future release.
*/
- NEGATIVE_HMS ("-HH:mm:ss", "Hms", false);
+ NEGATIVE_HMS ("-H:mm:ss", "Hms", false),
+ /**
+ * Positive offset with hours field
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ POSITIVE_H ("+H", "H", true),
+ /**
+ * Negative offset with hours field
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ NEGATIVE_H ("-H", "H", false);
private String _defaultPattern;
private String _required;
private transient String _gmtPatternPrefix;
private transient String _gmtPatternSuffix;
private transient Object[][] _gmtOffsetPatternItems;
+ // cache if offset hours and minutes are abutting
+ private transient boolean _abuttingOffsetHoursAndMinutes;
private transient String _region;
private static final String ASCII_DIGITS = "0123456789";
private static final String ISO8601_UTC = "Z";
+ private static final String UNKNOWN_ZONE_ID = "Etc/Unknown";
+ private static final String UNKNOWN_SHORT_ZONE_ID = "unk";
+ private static final String UNKNOWN_LOCATION = "Unknown";
+
// Order of GMT offset pattern parsing, *_HMS must be evaluated first
// because *_HM is most likely a substring of *_HMS
private static final GMTOffsetPatternType[] PARSE_GMT_OFFSET_TYPES = {
GMTOffsetPatternType.POSITIVE_HMS, GMTOffsetPatternType.NEGATIVE_HMS,
GMTOffsetPatternType.POSITIVE_HM, GMTOffsetPatternType.NEGATIVE_HM,
+ GMTOffsetPatternType.POSITIVE_H, GMTOffsetPatternType.NEGATIVE_H,
};
private static final int MILLIS_PER_HOUR = 60 * 60 * 1000;
private static TimeZoneFormatCache _tzfCache = new TimeZoneFormatCache();
- // The filter used for searching all specific names
- private static final EnumSet<NameType> ALL_SPECIFIC_NAME_TYPES = EnumSet.of(
+ // The filter used for searching all specific names and exemplar location names
+ private static final EnumSet<NameType> ALL_SIMPLE_NAME_TYPES = EnumSet.of(
NameType.LONG_STANDARD, NameType.LONG_DAYLIGHT,
- NameType.SHORT_STANDARD, NameType.SHORT_DAYLIGHT
+ NameType.SHORT_STANDARD, NameType.SHORT_DAYLIGHT,
+ NameType.EXEMPLAR_LOCATION
);
// The filter used for searching all generic names
GenericNameType.LOCATION, GenericNameType.LONG, GenericNameType.SHORT
);
+ private static volatile TextTrieMap<String> ZONE_ID_TRIE;
+ private static volatile TextTrieMap<String> SHORT_ZONE_ID_TRIE;
+
/**
* The protected constructor for subclassing.
* @param locale the locale
String[] gmtOffsetPatterns = new String[GMTOffsetPatternType.values().length];
if (hourFormats != null) {
String[] hourPatterns = hourFormats.split(";", 2);
+ gmtOffsetPatterns[GMTOffsetPatternType.POSITIVE_H.ordinal()] = truncateOffsetPattern(hourPatterns[0]);
gmtOffsetPatterns[GMTOffsetPatternType.POSITIVE_HM.ordinal()] = hourPatterns[0];
gmtOffsetPatterns[GMTOffsetPatternType.POSITIVE_HMS.ordinal()] = expandOffsetPattern(hourPatterns[0]);
+ gmtOffsetPatterns[GMTOffsetPatternType.NEGATIVE_H.ordinal()] = truncateOffsetPattern(hourPatterns[1]);
gmtOffsetPatterns[GMTOffsetPatternType.NEGATIVE_HM.ordinal()] = hourPatterns[1];
gmtOffsetPatterns[GMTOffsetPatternType.NEGATIVE_HMS.ordinal()] = expandOffsetPattern(hourPatterns[1]);
} else {
_gmtOffsetPatterns[type.ordinal()] = pattern;
_gmtOffsetPatternItems[type.ordinal()] = parsedItems;
+ checkAbuttingHoursAndMinutes();
return this;
}
}
/**
- * Returns the RFC822 style time zone string for the given offset.
- * For example, "-0800".
+ * Returns the ISO 8601 basic time zone string for the given offset.
+ * For example, "-08", "-0830" and "Z"
*
* @param offset the offset from GMT(UTC) in milliseconds.
- * @return the RFC822 style GMT(UTC) offset format.
- * @see #parseOffsetRFC822(String, ParsePosition)
+ * @param useUtcIndicator true if ISO 8601 UTC indicator "Z" is used when the offset is 0.
+ * @param isShort true if shortest form is used.
+ * @param ignoreSeconds true if non-zero offset seconds is appended.
+ * @return the ISO 8601 basic format.
* @throws IllegalArgumentException if the specified offset is out of supported range
* (-24 hours < offset < +24 hours).
- * @draft ICU 49
+ * @see #formatOffsetISO8601Extended(int, boolean, boolean, boolean)
+ * @see #parseOffsetISO8601(String, ParsePosition)
+ * @draft ICU 51
* @provisional This API might change or be removed in a future release.
*/
- public final String formatOffsetRFC822(int offset) {
- // Note: OffsetFields.HMS as maxFields is an ICU extension. RFC822 specification
- // defines exactly 4 digits for the offset field in HHss format.
- return formatOffsetWithAsciiDigits(offset, null, OffsetFields.HM, OffsetFields.HMS);
+ public final String formatOffsetISO8601Basic(int offset, boolean useUtcIndicator, boolean isShort, boolean ignoreSeconds) {
+ return formatOffsetISO8601(offset, true, useUtcIndicator, isShort, ignoreSeconds);
}
/**
- * Returns the ISO 8601 style (extended format) time zone string for the given offset.
- * For example, "-08:00" and "Z"
+ * Returns the ISO 8601 extended time zone string for the given offset.
+ * For example, "-08:00", "-08:30" and "Z"
*
* @param offset the offset from GMT(UTC) in milliseconds.
- * @return the ISO 8601 style GMT(UTC) offset format.
- * @see #parseOffsetISO8601(String, ParsePosition)
+ * @param useUtcIndicator true if ISO 8601 UTC indicator "Z" is used when the offset is 0.
+ * @param isShort true if shortest form is used.
+ * @param ignoreSeconds true if non-zero offset seconds is appended.
+ * @return the ISO 8601 extended format.
* @throws IllegalArgumentException if the specified offset is out of supported range
* (-24 hours < offset < +24 hours).
- * @draft ICU 49
+ * @see #formatOffsetISO8601Basic(int, boolean, boolean, boolean)
+ * @see #parseOffsetISO8601(String, ParsePosition)
+ * @draft ICU 51
* @provisional This API might change or be removed in a future release.
*/
- public final String formatOffsetISO8601(int offset) {
- if (offset == 0) {
- return ISO8601_UTC;
- }
- // Note: OffsetFields.HMS as maxFields is an ICU extension. ISO 8601 specification does
- // not support second field.
- return formatOffsetWithAsciiDigits(offset, ':', OffsetFields.HM, OffsetFields.HMS);
+ public final String formatOffsetISO8601Extended(int offset, boolean useUtcIndicator, boolean isShort, boolean ignoreSeconds) {
+ return formatOffsetISO8601(offset, false, useUtcIndicator, isShort, ignoreSeconds);
}
/**
* <li>Offset digits (e.g. "0123456789" - see {@link #getGMTOffsetDigits()})
* <li>GMT zero format (e.g. "GMT" - see {@link #getGMTZeroFormat()})
* </ul>
+ * This format always uses 2 digit hours and minutes. When the given offset has non-zero
+ * seconds, 2 digit seconds field will be appended. For example,
+ * GMT+05:00 and GMT+05:28:06.
* @param offset the offset from GMT(UTC) in milliseconds.
* @return the localized GMT format string
* @see #parseOffsetLocalizedGMT(String, ParsePosition)
* @provisional This API might change or be removed in a future release.
*/
public String formatOffsetLocalizedGMT(int offset) {
- if (offset == 0) {
- return _gmtZeroFormat;
- }
-
- StringBuilder buf = new StringBuilder();
- boolean positive = true;
- if (offset < 0) {
- offset = -offset;
- positive = false;
- }
-
- int offsetH = offset / MILLIS_PER_HOUR;
- offset = offset % MILLIS_PER_HOUR;
- int offsetM = offset / MILLIS_PER_MINUTE;
- offset = offset % MILLIS_PER_MINUTE;
- int offsetS = offset / MILLIS_PER_SECOND;
-
- if (offsetH > MAX_OFFSET_HOUR || offsetM > MAX_OFFSET_MINUTE || offsetS > MAX_OFFSET_SECOND) {
- throw new IllegalArgumentException("Offset out of range :" + offset);
- }
-
- Object[] offsetPatternItems;
- if (positive) {
- offsetPatternItems = (offsetS == 0) ?
- _gmtOffsetPatternItems[GMTOffsetPatternType.POSITIVE_HM.ordinal()] :
- _gmtOffsetPatternItems[GMTOffsetPatternType.POSITIVE_HMS.ordinal()];
- } else {
- offsetPatternItems = (offsetS == 0) ?
- _gmtOffsetPatternItems[GMTOffsetPatternType.NEGATIVE_HM.ordinal()] :
- _gmtOffsetPatternItems[GMTOffsetPatternType.NEGATIVE_HMS.ordinal()];
- }
-
- // Building the GMT format string
- buf.append(_gmtPatternPrefix);
+ return formatOffsetLocalizedGMT(offset, false);
+ }
- for (Object item : offsetPatternItems) {
- if (item instanceof String) {
- // pattern literal
- buf.append((String)item);
- } else if (item instanceof GMTOffsetField) {
- // Hour/minute/second field
- GMTOffsetField field = (GMTOffsetField)item;
- switch (field.getType()) {
- case 'H':
- appendOffsetDigits(buf, offsetH, field.getWidth());
- break;
- case 'm':
- appendOffsetDigits(buf, offsetM, field.getWidth());
- break;
- case 's':
- appendOffsetDigits(buf, offsetS, field.getWidth());
- break;
- }
- }
- }
- buf.append(_gmtPatternSuffix);
- return buf.toString();
+ /**
+ * Returns the short localized GMT(UTC) offset format for the given offset.
+ * The short localized GMT offset is defined by;
+ * <ul>
+ * <li>GMT format pattern (e.g. "GMT {0}" - see {@link #getGMTPattern()})
+ * <li>Offset time pattern (e.g. "+HH:mm" - see {@link #getGMTOffsetPattern(GMTOffsetPatternType)})
+ * <li>Offset digits (e.g. "0123456789" - see {@link #getGMTOffsetDigits()})
+ * <li>GMT zero format (e.g. "GMT" - see {@link #getGMTZeroFormat()})
+ * </ul>
+ * This format uses the shortest representation of offset. The hours field does not
+ * have leading zero and lower fields with zero will be truncated. For example,
+ * GMT+5 and GMT+530.
+ * @param offset the offset from GMT(UTC) in milliseconds.
+ * @return the short localized GMT format string
+ * @see #parseOffsetLocalizedGMT(String, ParsePosition)
+ * @throws IllegalArgumentException if the specified offset is out of supported range
+ * (-24 hours < offset < +24 hours).
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ public String formatOffsetShortLocalizedGMT(int offset) {
+ return formatOffsetLocalizedGMT(offset, true);
}
/**
case SPECIFIC_SHORT:
result = formatSpecific(tz, NameType.SHORT_STANDARD, NameType.SHORT_DAYLIGHT, date, timeType);
break;
- case RFC822:
- case ISO8601:
- case LOCALIZED_GMT:
+ default:
// will be handled below
break;
}
if (result == null) {
int[] offsets = {0, 0};
tz.getOffset(date, false, offsets);
+ int offset = offsets[0] + offsets[1];
+
switch (style) {
- case RFC822:
- result = formatOffsetRFC822(offsets[0] + offsets[1]);
+ case GENERIC_LOCATION:
+ case GENERIC_LONG:
+ case SPECIFIC_LONG:
+ case LOCALIZED_GMT:
+ result = formatOffsetLocalizedGMT(offset);
+ break;
+
+ case GENERIC_SHORT:
+ case SPECIFIC_SHORT:
+ case LOCALIZED_GMT_SHORT:
+ result = formatOffsetShortLocalizedGMT(offset);
+ break;
+
+ case ISO_BASIC_SHORT:
+ result = formatOffsetISO8601Basic(offset, true, true, true);
+ break;
+
+ case ISO_BASIC_LOCAL_SHORT:
+ result = formatOffsetISO8601Basic(offset, false, true, true);
+ break;
+
+ case ISO_BASIC_FIXED:
+ result = formatOffsetISO8601Basic(offset, true, false, true);
+ break;
+
+ case ISO_BASIC_LOCAL_FIXED:
+ result = formatOffsetISO8601Basic(offset, false, false, true);
+ break;
+
+ case ISO_BASIC_FULL:
+ result = formatOffsetISO8601Basic(offset, true, false, false);
+ break;
+
+ case ISO_BASIC_LOCAL_FULL:
+ result = formatOffsetISO8601Basic(offset, false, false, false);
+ break;
+
+ case ISO_EXTENDED_FIXED:
+ result = formatOffsetISO8601Extended(offset, true, false, true);
+ break;
+
+ case ISO_EXTENDED_LOCAL_FIXED:
+ result = formatOffsetISO8601Extended(offset, false, false, true);
+ break;
+
+ case ISO_EXTENDED_FULL:
+ result = formatOffsetISO8601Extended(offset, true, false, false);
+ break;
+
+ case ISO_EXTENDED_LOCAL_FULL:
+ result = formatOffsetISO8601Extended(offset, false, false, false);
+ break;
+
+ case ZONE_ID:
+ result = tz.getID();
break;
- case ISO8601:
- result = formatOffsetISO8601(offsets[0] + offsets[1]);
+
+ case ZONE_ID_SHORT:
+ result = ZoneMeta.getShortID(tz);
+ if (result == null) {
+ result = UNKNOWN_SHORT_ZONE_ID;
+ }
break;
- default: // Other than RFC822/ISO8601, including fallback from SPECIFIC_XXX/GENERIC_XXX
- result = formatOffsetLocalizedGMT(offsets[0] + offsets[1]);
+
+ case EXEMPLAR_LOCATION:
+ result = formatExemplarLocation(tz);
break;
}
// time type
}
/**
- * Returns offset from GMT(UTC) in milliseconds for the given RFC822
- * style time zone string. When the given string is not an RFC822 time zone
- * string, this method sets the current position as the error index
- * to <code>ParsePosition pos</code> and returns 0.
- *
- * @param text the text contains RFC822 style time zone string (e.g. "-0800")
- * at the position.
- * @param pos the position.
- * @return the offset from GMT(UTC) in milliseconds for the given RFC822 style
- * time zone string.
- * @see #formatOffsetRFC822(int)
- * @draft ICU 49
- * @provisional This API might change or be removed in a future release.
- */
- public final int parseOffsetRFC822(String text, ParsePosition pos) {
- int start = pos.getIndex();
- if (start >= text.length()) {
- pos.setErrorIndex(start);
- return 0;
- }
-
- int sign;
- char signChar = text.charAt(start);
- if (signChar == '+') {
- sign = 1;
- } else if (signChar == '-') {
- sign = -1;
- } else {
- // Not an RFC822 offset string
- pos.setErrorIndex(start);
- return 0;
- }
-
- // Parse digits
- pos.setIndex(start + 1);
- int offset = parseAbuttingAsciiOffsetFields(text, pos, OffsetFields.H, OffsetFields.HMS, false);
-
- if (pos.getErrorIndex() != -1) {
- pos.setIndex(start); // reset
- pos.setErrorIndex(start);
- return 0;
- }
-
- return sign * offset;
- }
-
- /**
- * Returns offset from GMT(UTC) in milliseconds for the given ISO 8601 style
- * (extended format) time zone string. When the given string is not an ISO 8601 time
+ * Returns offset from GMT(UTC) in milliseconds for the given ISO 8601
+ * basic or extended time zone string. When the given string is not an ISO 8601 time
* zone string, this method sets the current position as the error index
* to <code>ParsePosition pos</code> and returns 0.
*
- * @param text the text contains ISO 8601 style time zone string (e.g. "-08:00", "Z")
+ * @param text the text contains ISO 8601 style time zone string (e.g. "-08", "-0800", "-08:00", and "Z")
* at the position.
* @param pos the position.
* @return the offset from GMT(UTC) in milliseconds for the given ISO 8601 style
* time zone string.
- * @see #formatOffsetISO8601(int)
+ * @see #formatOffsetISO8601Basic(int, boolean, boolean, boolean)
+ * @see #formatOffsetISO8601Extended(int, boolean, boolean, boolean)
* @draft ICU 49
* @provisional This API might change or be removed in a future release.
*/
* @provisional This API might change or be removed in a future release.
*/
public int parseOffsetLocalizedGMT(String text, ParsePosition pos) {
- return parseOffsetLocalizedGMT(text, pos, null);
+ return parseOffsetLocalizedGMT(text, pos, false, null);
+ }
+
+ /**
+ * Returns offset from GMT(UTC) in milliseconds for the given short localized GMT
+ * offset format string. When the given string cannot be parsed, this method
+ * sets the current position as the error index to <code>ParsePosition pos</code>
+ * and returns 0.
+ *
+ * @param text the text contains a short localized GMT offset string at the position.
+ * @param pos the position.
+ * @return the offset from GMT(UTC) in milliseconds for the given short localized GMT
+ * offset format string.
+ * @see #formatOffsetShortLocalizedGMT(int)
+ * @draft ICU 51
+ * @provisional This API might change or be removed in a future release.
+ */
+ public int parseOffsetShortLocalizedGMT(String text, ParsePosition pos) {
+ return parseOffsetLocalizedGMT(text, pos, true, null);
}
/**
int maxPos = text.length();
int offset;
- boolean fallbackLocalizedGMT = false;
- if (style == Style.SPECIFIC_LONG || style == Style.SPECIFIC_SHORT
- || style == Style.GENERIC_LONG || style == Style.GENERIC_SHORT || style == Style.GENERIC_LOCATION) {
- // above styles may use localized gmt format as fallback
- fallbackLocalizedGMT = true;
- }
+ // Styles using localized GMT format as fallback
+ boolean fallbackLocalizedGMT =
+ (style == Style.SPECIFIC_LONG || style == Style.GENERIC_LONG || style == Style.GENERIC_LOCATION);
+ boolean fallbackShortLocalizedGMT =
+ (style == Style.SPECIFIC_SHORT || style == Style.GENERIC_SHORT);
int evaluated = 0; // bit flags representing already evaluated styles
ParsePosition tmpPos = new ParsePosition(startIdx);
int parsedPos = -1; // stores successfully parsed offset position for later use
// Try localized GMT format first if necessary
- if (fallbackLocalizedGMT) {
+ if (fallbackLocalizedGMT || fallbackShortLocalizedGMT) {
Output<Boolean> hasDigitOffset = new Output<Boolean>(false);
- offset = parseOffsetLocalizedGMT(text, tmpPos, hasDigitOffset);
+ offset = parseOffsetLocalizedGMT(text, tmpPos, fallbackShortLocalizedGMT, hasDigitOffset);
if (tmpPos.getErrorIndex() == -1) {
// Even when the input text was successfully parsed as a localized GMT format text,
// we may still need to evaluate the specified style if -
parsedOffset = offset;
parsedPos = tmpPos.getIndex();
}
- evaluated |= Style.LOCALIZED_GMT.flag;
-
- tmpPos.setIndex(startIdx);
- tmpPos.setErrorIndex(-1);
+ // Note: For now, no distinction between long/short localized GMT format in the parser.
+ // This might be changed in future.
+// evaluated |= (fallbackLocalizedGMT ? Style.LOCALIZED_GMT.flag : Style.LOCALIZED_GMT_SHORT.flag);
+ evaluated |= (Style.LOCALIZED_GMT.flag | Style.LOCALIZED_GMT_SHORT.flag);
}
// Try the specified style
switch (style) {
- case RFC822:
+ case LOCALIZED_GMT:
{
- offset = parseOffsetRFC822(text, tmpPos);
+ tmpPos.setIndex(startIdx);
+ tmpPos.setErrorIndex(-1);
+
+ offset = parseOffsetLocalizedGMT(text, tmpPos);
if (tmpPos.getErrorIndex() == -1) {
pos.setIndex(tmpPos.getIndex());
return getTimeZoneForOffset(offset);
}
+ // Note: For now, no distinction between long/short localized GMT format in the parser.
+ // This might be changed in future.
+ evaluated |= Style.LOCALIZED_GMT_SHORT.flag;
break;
}
- case LOCALIZED_GMT:
+ case LOCALIZED_GMT_SHORT:
{
- offset = parseOffsetLocalizedGMT(text, tmpPos);
+ tmpPos.setIndex(startIdx);
+ tmpPos.setErrorIndex(-1);
+
+ offset = parseOffsetShortLocalizedGMT(text, tmpPos);
if (tmpPos.getErrorIndex() == -1) {
pos.setIndex(tmpPos.getIndex());
return getTimeZoneForOffset(offset);
}
+ // Note: For now, no distinction between long/short localized GMT format in the parser.
+ // This might be changed in future.
+ evaluated |= Style.LOCALIZED_GMT.flag;
break;
}
- case ISO8601:
+
+ case ISO_BASIC_SHORT:
+ case ISO_BASIC_FIXED:
+ case ISO_BASIC_FULL:
+ case ISO_EXTENDED_FIXED:
+ case ISO_EXTENDED_FULL:
{
+ tmpPos.setIndex(startIdx);
+ tmpPos.setErrorIndex(-1);
+
offset = parseOffsetISO8601(text, tmpPos);
if (tmpPos.getErrorIndex() == -1) {
pos.setIndex(tmpPos.getIndex());
return getTimeZoneForOffset(offset);
}
- // Note: ISO 8601 parser also support basic format (without ':'),
- // which is same with RFC 822 format.
- evaluated |= Style.RFC822.flag;
break;
}
+
+ case ISO_BASIC_LOCAL_SHORT:
+ case ISO_BASIC_LOCAL_FIXED:
+ case ISO_BASIC_LOCAL_FULL:
+ case ISO_EXTENDED_LOCAL_FIXED:
+ case ISO_EXTENDED_LOCAL_FULL:
+ {
+ tmpPos.setIndex(startIdx);
+ tmpPos.setErrorIndex(-1);
+
+ // Exclude the case of UTC Indicator "Z" here
+ Output<Boolean> hasDigitOffset = new Output<Boolean>(false);
+ offset = parseOffsetISO8601(text, tmpPos, false, hasDigitOffset);
+ if (tmpPos.getErrorIndex() == -1 && hasDigitOffset.value) {
+ pos.setIndex(tmpPos.getIndex());
+ return getTimeZoneForOffset(offset);
+ }
+ break;
+ }
+
case SPECIFIC_LONG:
case SPECIFIC_SHORT:
{
// Specific styles
EnumSet<NameType> nameTypes = null;
if (style == Style.SPECIFIC_LONG) {
- nameTypes = EnumSet.of(NameType.LONG_STANDARD, NameType.LONG_DAYLIGHT);
+ nameTypes = EnumSet.of(NameType.LONG_STANDARD, NameType.LONG_DAYLIGHT);
} else {
assert style == Style.SPECIFIC_SHORT;
nameTypes = EnumSet.of(NameType.SHORT_STANDARD, NameType.SHORT_DAYLIGHT);
}
break;
}
+ case ZONE_ID:
+ {
+ tmpPos.setIndex(startIdx);
+ tmpPos.setErrorIndex(-1);
+
+ String id = parseZoneID(text, tmpPos);
+ if (tmpPos.getErrorIndex() == -1) {
+ pos.setIndex(tmpPos.getIndex());
+ return TimeZone.getTimeZone(id);
+ }
+ break;
+ }
+ case ZONE_ID_SHORT:
+ {
+ tmpPos.setIndex(startIdx);
+ tmpPos.setErrorIndex(-1);
+
+ String id = parseShortZoneID(text, tmpPos);
+ if (tmpPos.getErrorIndex() == -1) {
+ pos.setIndex(tmpPos.getIndex());
+ return TimeZone.getTimeZone(id);
+ }
+ break;
+ }
+ case EXEMPLAR_LOCATION:
+ {
+ tmpPos.setIndex(startIdx);
+ tmpPos.setErrorIndex(-1);
+
+ String id = parseExemplarLocation(text, tmpPos);
+ if (tmpPos.getErrorIndex() == -1) {
+ pos.setIndex(tmpPos.getIndex());
+ return TimeZone.getTimeZone(id);
+ }
+ break;
+ }
}
evaluated |= style.flag;
// Failed to parse the input text as the time zone format in the specified style.
// Check the longest match among other styles below.
+ String parsedID = null; // stores successfully parsed zone ID for later use
+ TimeType parsedTimeType = TimeType.UNKNOWN; // stores successfully parsed time type for later use
assert parsedPos < 0;
assert parsedOffset == UNKNOWN_OFFSET;
- tmpPos.setIndex(startIdx);
- tmpPos.setErrorIndex(-1);
// ISO 8601
- if ((evaluated & Style.ISO8601.flag) == 0) {
+ if (parsedPos < maxPos &&
+ ((evaluated & ISO_Z_STYLE_FLAG) == 0 || (evaluated & ISO_LOCAL_STYLE_FLAG) == 0)) {
+ tmpPos.setIndex(startIdx);
+ tmpPos.setErrorIndex(-1);
+
Output<Boolean> hasDigitOffset = new Output<Boolean>(false);
offset = parseOffsetISO8601(text, tmpPos, false, hasDigitOffset);
if (tmpPos.getErrorIndex() == -1) {
return getTimeZoneForOffset(offset);
}
// Note: When ISO 8601 format contains offset digits, it should not
- // collide with other formats (except RFC 822, which is compatible with
- // ISO 8601 basic format). However, ISO 8601 UTC format "Z" (single letter)
- // may collide with other names. In this case, we need to evaluate other
- // names.
- parsedOffset = offset;
- parsedPos = tmpPos.getIndex();
- assert parsedPos == startIdx + 1; // only when "Z" is used
+ // collide with other formats. However, ISO 8601 UTC format "Z" (single letter)
+ // may collide with other names. In this case, we need to evaluate other names.
+ if (parsedPos < tmpPos.getIndex()) {
+ parsedOffset = offset;
+ parsedID = null;
+ parsedTimeType = TimeType.UNKNOWN;
+ parsedPos = tmpPos.getIndex();
+ assert parsedPos == startIdx + 1; // only when "Z" is used
+ }
}
+ }
+
+
+ // Localized GMT format
+ if (parsedPos < maxPos &&
+ (evaluated & Style.LOCALIZED_GMT.flag) == 0) {
tmpPos.setIndex(startIdx);
tmpPos.setErrorIndex(-1);
+
+ Output<Boolean> hasDigitOffset = new Output<Boolean>(false);
+ offset = parseOffsetLocalizedGMT(text, tmpPos, false, hasDigitOffset);
+ if (tmpPos.getErrorIndex() == -1) {
+ if (tmpPos.getIndex() == maxPos || hasDigitOffset.value) {
+ pos.setIndex(tmpPos.getIndex());
+ return getTimeZoneForOffset(offset);
+ }
+ // Evaluate other names - see the comment earlier in this method.
+ if (parsedPos < tmpPos.getIndex()) {
+ parsedOffset = offset;
+ parsedID = null;
+ parsedTimeType = TimeType.UNKNOWN;
+ parsedPos = tmpPos.getIndex();
+ }
+ }
}
- // RFC 822
- // Note: ISO 8601 parser supports RFC 822 format. So we do not need to parse
- // it as RFC 822 here. This might be changed in future when we support
- // strict format option for ISO 8601 or RFC 822.
-// if ((evaluated & Style.RFC822.flag) == 0) {
-// offset = parseOffsetRFC822(text, tmpPos);
-// if (tmpPos.getErrorIndex() == -1) {
-// pos.setIndex(tmpPos.getIndex());
-// return getTimeZoneForOffset(offset);
-// }
-// tmpPos.setIndex(startIdx);
-// tmpPos.setErrorIndex(-1);
-// }
+ if (parsedPos < maxPos &&
+ (evaluated & Style.LOCALIZED_GMT_SHORT.flag) == 0) {
+ tmpPos.setIndex(startIdx);
+ tmpPos.setErrorIndex(-1);
- // Localized GMT format
- if ((evaluated & Style.LOCALIZED_GMT.flag) == 0) {
Output<Boolean> hasDigitOffset = new Output<Boolean>(false);
- offset = parseOffsetLocalizedGMT(text, tmpPos, hasDigitOffset);
+ offset = parseOffsetLocalizedGMT(text, tmpPos, true, hasDigitOffset);
if (tmpPos.getErrorIndex() == -1) {
if (tmpPos.getIndex() == maxPos || hasDigitOffset.value) {
pos.setIndex(tmpPos.getIndex());
return getTimeZoneForOffset(offset);
}
// Evaluate other names - see the comment earlier in this method.
- parsedOffset = offset;
- parsedPos = tmpPos.getIndex();
+ if (parsedPos < tmpPos.getIndex()) {
+ parsedOffset = offset;
+ parsedID = null;
+ parsedTimeType = TimeType.UNKNOWN;
+ parsedPos = tmpPos.getIndex();
+ }
}
}
- // When ParseOption.ALL_STYLES is available, we also try to look all possible display names.
+ // When ParseOption.ALL_STYLES is available, we also try to look all possible display names and IDs.
// For example, when style is GENERIC_LONG, "EST" (SPECIFIC_SHORT) is never
// used for America/New_York. With parseAllStyles true, this code parses "EST"
// as America/New_York.
: options.contains(ParseOption.ALL_STYLES);
if (parseAllStyles) {
- // Try all specific names first
- Collection<MatchInfo> specificMatches = _tznames.find(text, startIdx, ALL_SPECIFIC_NAME_TYPES);
- MatchInfo specificMatch = null;
- if (specificMatches != null) {
- for (MatchInfo match : specificMatches) {
- if (startIdx + match.matchLength() > parsedPos) {
- specificMatch = match;
- parsedPos = startIdx + match.matchLength();
+ // Try all specific names and exemplar location names
+ if (parsedPos < maxPos) {
+ Collection<MatchInfo> specificMatches = _tznames.find(text, startIdx, ALL_SIMPLE_NAME_TYPES);
+ MatchInfo specificMatch = null;
+ int matchPos = -1;
+ if (specificMatches != null) {
+ for (MatchInfo match : specificMatches) {
+ if (startIdx + match.matchLength() > matchPos) {
+ specificMatch = match;
+ matchPos = startIdx + match.matchLength();
+ }
}
}
+ if (parsedPos < matchPos) {
+ parsedPos = matchPos;
+ parsedID = getTimeZoneID(specificMatch.tzID(), specificMatch.mzID());
+ parsedTimeType = getTimeType(specificMatch.nameType());
+ parsedOffset = UNKNOWN_OFFSET;
+ }
+
}
-
- GenericMatchInfo genericMatch = null;
+ // Try generic names
if (parsedPos < maxPos) {
- // Try generic names
- genericMatch = getTimeZoneGenericNames().findBestMatch(text, startIdx, ALL_GENERIC_NAME_TYPES);
+ GenericMatchInfo genericMatch = getTimeZoneGenericNames().findBestMatch(text, startIdx, ALL_GENERIC_NAME_TYPES);
+ if (genericMatch != null && parsedPos < startIdx + genericMatch.matchLength()) {
+ parsedPos = startIdx + genericMatch.matchLength();
+ parsedID = genericMatch.tzID();
+ parsedTimeType = genericMatch.timeType();
+ parsedOffset = UNKNOWN_OFFSET;
+ }
}
- // Pick up better match
- if (genericMatch != null && (startIdx + genericMatch.matchLength() > parsedPos)) {
- // use this one
- parsedPos = startIdx + genericMatch.matchLength();
- timeType.value = genericMatch.timeType();
- pos.setIndex(parsedPos);
- return TimeZone.getTimeZone(genericMatch.tzID());
- } else if (specificMatch != null){
- timeType.value = getTimeType(specificMatch.nameType());
- pos.setIndex(parsedPos);
- return TimeZone.getTimeZone(getTimeZoneID(specificMatch.tzID(), specificMatch.mzID()));
+ // Try time zone ID
+ if (parsedPos < maxPos && (evaluated & Style.ZONE_ID.flag) == 0) {
+ tmpPos.setIndex(startIdx);
+ tmpPos.setErrorIndex(-1);
+
+ String id = parseZoneID(text, tmpPos);
+ if (tmpPos.getErrorIndex() == -1 && parsedPos < tmpPos.getIndex()) {
+ parsedPos = tmpPos.getIndex();
+ parsedID = id;
+ parsedTimeType = TimeType.UNKNOWN;
+ parsedOffset = UNKNOWN_OFFSET;
+ }
+ }
+ // Try short time zone ID
+ if (parsedPos < maxPos && (evaluated & Style.ZONE_ID_SHORT.flag) == 0) {
+ tmpPos.setIndex(startIdx);
+ tmpPos.setErrorIndex(-1);
+
+ String id = parseShortZoneID(text, tmpPos);
+ if (tmpPos.getErrorIndex() == -1 && parsedPos < tmpPos.getIndex()) {
+ parsedPos = tmpPos.getIndex();
+ parsedID = id;
+ parsedTimeType = TimeType.UNKNOWN;
+ parsedOffset = UNKNOWN_OFFSET;
+ }
}
}
if (parsedPos > startIdx) {
- // Parsed successfully as one of 'offset' format
- assert parsedOffset != UNKNOWN_OFFSET;
+ // Parsed successfully
+ TimeZone parsedTZ = null;
+ if (parsedID != null) {
+ parsedTZ = TimeZone.getTimeZone(parsedID);
+ } else {
+ assert parsedOffset != UNKNOWN_OFFSET;
+ parsedTZ = getTimeZoneForOffset(parsedOffset);
+ }
+ timeType.value = parsedTimeType;
pos.setIndex(parsedPos);
- return getTimeZoneForOffset(parsedOffset);
+ return parsedTZ;
}
pos.setErrorIndex(startIdx);
return parse(source, pos);
}
+ /**
+ * Private method used for localized GMT formatting.
+ * @param offset the zone's UTC offset
+ * @param isShort true if the short localized GMT format is desired
+ * @return the localized GMT string
+ */
+ private String formatOffsetLocalizedGMT(int offset, boolean isShort) {
+ if (offset == 0) {
+ return _gmtZeroFormat;
+ }
+
+ StringBuilder buf = new StringBuilder();
+ boolean positive = true;
+ if (offset < 0) {
+ offset = -offset;
+ positive = false;
+ }
+
+ int offsetH = offset / MILLIS_PER_HOUR;
+ offset = offset % MILLIS_PER_HOUR;
+ int offsetM = offset / MILLIS_PER_MINUTE;
+ offset = offset % MILLIS_PER_MINUTE;
+ int offsetS = offset / MILLIS_PER_SECOND;
+
+ if (offsetH > MAX_OFFSET_HOUR || offsetM > MAX_OFFSET_MINUTE || offsetS > MAX_OFFSET_SECOND) {
+ throw new IllegalArgumentException("Offset out of range :" + offset);
+ }
+
+ Object[] offsetPatternItems;
+ if (positive) {
+ if (offsetS != 0) {
+ offsetPatternItems = _gmtOffsetPatternItems[GMTOffsetPatternType.POSITIVE_HMS.ordinal()];
+ } else if (offsetM != 0 || !isShort) {
+ offsetPatternItems = _gmtOffsetPatternItems[GMTOffsetPatternType.POSITIVE_HM.ordinal()];
+ } else {
+ offsetPatternItems = _gmtOffsetPatternItems[GMTOffsetPatternType.POSITIVE_H.ordinal()];
+ }
+ } else {
+ if (offsetS != 0) {
+ offsetPatternItems = _gmtOffsetPatternItems[GMTOffsetPatternType.NEGATIVE_HMS.ordinal()];
+ } else if (offsetM != 0 || !isShort) {
+ offsetPatternItems = _gmtOffsetPatternItems[GMTOffsetPatternType.NEGATIVE_HM.ordinal()];
+ } else {
+ offsetPatternItems = _gmtOffsetPatternItems[GMTOffsetPatternType.NEGATIVE_H.ordinal()];
+ }
+ }
+
+ // Building the GMT format string
+ buf.append(_gmtPatternPrefix);
+
+ for (Object item : offsetPatternItems) {
+ if (item instanceof String) {
+ // pattern literal
+ buf.append((String)item);
+ } else if (item instanceof GMTOffsetField) {
+ // Hour/minute/second field
+ GMTOffsetField field = (GMTOffsetField)item;
+ switch (field.getType()) {
+ case 'H':
+ appendOffsetDigits(buf, offsetH, (isShort ? 1 : 2));
+ break;
+ case 'm':
+ appendOffsetDigits(buf, offsetM, 2);
+ break;
+ case 's':
+ appendOffsetDigits(buf, offsetS, 2);
+ break;
+ }
+ }
+ }
+ buf.append(_gmtPatternSuffix);
+ return buf.toString();
+ }
+
+ /**
+ * Numeric offset field combinations
+ */
+ private enum OffsetFields {
+ H, HM, HMS
+ }
+
+ private String formatOffsetISO8601(int offset, boolean isBasic, boolean useUtcIndicator, boolean isShort, boolean ignoreSeconds) {
+ int absOffset = offset < 0 ? -offset : offset;
+ if (useUtcIndicator && (absOffset < MILLIS_PER_SECOND || (ignoreSeconds && absOffset < MILLIS_PER_MINUTE))) {
+ return ISO8601_UTC;
+ }
+ OffsetFields minFields = isShort ? OffsetFields.H : OffsetFields.HM;
+ OffsetFields maxFields = ignoreSeconds ? OffsetFields.HM : OffsetFields.HMS;
+ Character sep = isBasic ? null : ':';
+
+ // Note: OffsetFields.HMS as maxFields is an ICU extension. ISO 8601 specification does
+ // not support seconds field.
+
+ if (absOffset >= MAX_OFFSET) {
+ throw new IllegalArgumentException("Offset out of range :" + offset);
+ }
+
+ int[] fields = new int[3];
+ fields[0] = absOffset / MILLIS_PER_HOUR;
+ absOffset = absOffset % MILLIS_PER_HOUR;
+ fields[1] = absOffset / MILLIS_PER_MINUTE;
+ absOffset = absOffset % MILLIS_PER_MINUTE;
+ fields[2] = absOffset / MILLIS_PER_SECOND;
+
+ assert(fields[0] >= 0 && fields[0] <= MAX_OFFSET_HOUR);
+ assert(fields[1] >= 0 && fields[1] <= MAX_OFFSET_MINUTE);
+ assert(fields[2] >= 0 && fields[2] <= MAX_OFFSET_SECOND);
+
+ int lastIdx = maxFields.ordinal();
+ while (lastIdx > minFields.ordinal()) {
+ if (fields[lastIdx] != 0) {
+ break;
+ }
+ lastIdx--;
+ }
+
+ StringBuilder buf = new StringBuilder();
+ char sign = '+';
+ if (offset < 0) {
+ // if all output fields are 0s, do not use negative sign
+ for (int idx = 0; idx <= lastIdx; idx++) {
+ if (fields[idx] != 0) {
+ sign = '-';
+ break;
+ }
+ }
+ }
+ buf.append(sign);
+
+ for (int idx = 0; idx <= lastIdx; idx++) {
+ if (sep != null && idx != 0) {
+ buf.append(sep);
+ }
+ if (fields[idx] < 10) {
+ buf.append('0');
+ }
+ buf.append(fields[idx]);
+ }
+ return buf.toString();
+ }
/**
* Private method returning the time zone's specific format string.
return name;
}
+ /**
+ * Private method returning the time zone's exemplar location string.
+ * This method will never return null.
+ *
+ * @param tz the time zone
+ * @return the time zone's exemplar location name.
+ */
+ private String formatExemplarLocation(TimeZone tz) {
+ String location = getTimeZoneNames().getExemplarLocationName(ZoneMeta.getCanonicalCLDRID(tz));
+ if (location == null) {
+ // Use "unknown" location
+ location = getTimeZoneNames().getExemplarLocationName(UNKNOWN_ZONE_ID);
+ if (location == null) {
+ // last resort
+ location = UNKNOWN_LOCATION;
+ }
+ }
+ return location;
+ }
+
/**
* Private method returns a time zone ID. If tzID is not null, the value of tzID is returned.
* If tzID is null, then this method look up a time zone ID for the current region. This is a
_gmtOffsetPatterns = new String[size];
System.arraycopy(gmtOffsetPatterns, 0, _gmtOffsetPatterns, 0, size);
_gmtOffsetPatternItems = gmtOffsetPatternItems;
+ checkAbuttingHoursAndMinutes();
+ }
+
+ private void checkAbuttingHoursAndMinutes() {
+ _abuttingOffsetHoursAndMinutes = false;
+ for (Object[] items : _gmtOffsetPatternItems) {
+ boolean afterH = false;
+ for (Object item : items) {
+ if (item instanceof GMTOffsetField) {
+ GMTOffsetField fld = (GMTOffsetField)item;
+ if (afterH) {
+ _abuttingOffsetHoursAndMinutes = true;
+ } else if (fld.getType() == 'H') {
+ afterH = true;
+ }
+ } else if (afterH) {
+ break;
+ }
+ }
+ }
}
/**
return _type;
}
+ @SuppressWarnings("unused")
int getWidth() {
return _width;
}
static boolean isValid(char type, int width) {
- switch (type) {
- case 'H':
- return (width == 1 || width == 2);
- case 'm':
- case 's':
- return (width == 2);
- }
- return false;
+ return (width == 1 || width == 2);
}
}
return items.toArray(new Object[items.size()]);
}
+
/**
- * Appends second field to the offset pattern with hour/minute
+ * Appends seconds field to the offset pattern with hour/minute
*
- * @param offsetHM the offset pattern including hour and minute fields
- * @return the offset pattern including hour, minute and second fields
+ * @param offsetHM the offset pattern including hours and minutes fields
+ * @return the offset pattern including hours, minutes and seconds fields
*/
//TODO This code will be obsoleted once we add hour-minute-second pattern data in CLDR
private static String expandOffsetPattern(String offsetHM) {
int idx_mm = offsetHM.indexOf("mm");
if (idx_mm < 0) {
- // we cannot do anything with this...
- return offsetHM + ":ss";
+ throw new RuntimeException("Bad time zone hour pattern data");
}
String sep = ":";
int idx_H = offsetHM.substring(0, idx_mm).lastIndexOf("H");
return offsetHM.substring(0, idx_mm + 2) + sep + "ss" + offsetHM.substring(idx_mm + 2);
}
+ /**
+ * Truncates minutes field from the offset pattern with hour/minute
+ *
+ * @param offsetHM the offset pattern including hours and minutes fields
+ * @return the offset pattern including only hours field
+ */
+ //TODO This code will be obsoleted once we add hour pattern data in CLDR
+ private static String truncateOffsetPattern(String offsetHM) {
+ int idx_mm = offsetHM.indexOf("mm");
+ if (idx_mm < 0) {
+ throw new RuntimeException("Bad time zone hour pattern data");
+ }
+ int idx_HH = offsetHM.substring(0, idx_mm).lastIndexOf("HH");
+ if (idx_HH >= 0) {
+ return offsetHM.substring(0, idx_HH + 2);
+ }
+ int idx_H = offsetHM.substring(0, idx_mm).lastIndexOf("H");
+ if (idx_H >= 0) {
+ return offsetHM.substring(0, idx_H + 1);
+ }
+ throw new RuntimeException("Bad time zone hour pattern data");
+ }
+
/**
* Appends localized digits to the buffer.
* <p>
*
* @param text the text contains a localized GMT offset string at the position.
* @param pos the position.
+ * @param isShort true if this parser to try the short format first
* @param hasDigitOffset receiving if the parsed zone string contains offset digits.
* @return the offset from GMT(UTC) in milliseconds for the given localized GMT
* offset format string.
*/
- private int parseOffsetLocalizedGMT(String text, ParsePosition pos, Output<Boolean> hasDigitOffset) {
+ private int parseOffsetLocalizedGMT(String text, ParsePosition pos, boolean isShort, Output<Boolean> hasDigitOffset) {
int start = pos.getIndex();
- int idx = start;
- boolean parsed = false;
int offset = 0;
+ int[] parsedLength = {0};
if (hasDigitOffset != null) {
hasDigitOffset.value = false;
}
- do {
- // Prefix part
- int len = _gmtPatternPrefix.length();
- if (len > 0 && !text.regionMatches(true, idx, _gmtPatternPrefix, 0, len)) {
- // prefix match failed
- break;
- }
- idx += len;
-
- // Offset part
- int[] offsetLen = new int[1];
- offset = parseOffsetFields(text, idx, false, offsetLen);
- if (offsetLen[0] == 0) {
- // offset field match failed
- break;
- }
- idx += offsetLen[0];
-
- // Suffix part
- len = _gmtPatternSuffix.length();
- if (len > 0 && !text.regionMatches(true, idx, _gmtPatternSuffix, 0, len)) {
- // no suffix match
- break;
- }
- idx += len;
- parsed = true;
+ offset = parseOffsetLocalizedGMTPattern(text, start, isShort, parsedLength);
- } while (false);
+ // For now, parseOffsetLocalizedGMTPattern handles both long and short
+ // formats, no matter isShort is true or false. This might be changed in future
+ // when strict parsing is necessary, or different set of patterns are used for
+ // short/long formats.
+// if (parsedLength[0] == 0) {
+// offset = parseOffsetLocalizedGMTPattern(text, start, !isShort, parsedLength);
+// }
- if (parsed) {
+ if (parsedLength[0] > 0) {
if (hasDigitOffset != null) {
hasDigitOffset.value = true;
}
- pos.setIndex(idx);
+ pos.setIndex(start + parsedLength[0]);
return offset;
}
// Try the default patterns
- int[] parsedLength = {0};
offset = parseOffsetDefaultLocalizedGMT(text, start, parsedLength);
if (parsedLength[0] > 0) {
if (hasDigitOffset != null) {
return 0;
}
+ /**
+ * Parse localized GMT format generated by the pattern used by this formatter, except
+ * GMT Zero format.
+ * @param text the input text
+ * @param start the start index
+ * @param isShort true if the short localized GMT format is parsed.
+ * @param parsedLen the parsed length, or 0 on failure.
+ * @return the parsed offset in milliseconds.
+ */
+ private int parseOffsetLocalizedGMTPattern(String text, int start, boolean isShort, int[] parsedLen) {
+ int idx = start;
+ int offset = 0;
+ boolean parsed = false;
+
+ do {
+ // Prefix part
+ int len = _gmtPatternPrefix.length();
+ if (len > 0 && !text.regionMatches(true, idx, _gmtPatternPrefix, 0, len)) {
+ // prefix match failed
+ break;
+ }
+ idx += len;
+
+ // Offset part
+ int[] offsetLen = new int[1];
+ offset = parseOffsetFields(text, idx, false, offsetLen);
+ if (offsetLen[0] == 0) {
+ // offset field match failed
+ break;
+ }
+ idx += offsetLen[0];
+
+ // Suffix part
+ len = _gmtPatternSuffix.length();
+ if (len > 0 && !text.regionMatches(true, idx, _gmtPatternSuffix, 0, len)) {
+ // no suffix match
+ break;
+ }
+ idx += len;
+ parsed = true;
+ } while (false);
+
+ parsedLen[0] = parsed ? idx - start : 0;
+ return offset;
+ }
+
/**
* Parses localized GMT offset fields into offset.
*
* @param text the input text
* @param start the start index
- * @param minimumHourWidth true if the parser allows hour field width to be 1
+ * @param isShort true if this is a short format - currently not used
* @param parsedLen the parsed length, or 0 on failure.
* @return the parsed offset in milliseconds.
*/
- private int parseOffsetFields(String text, int start, boolean minimumHourWidth, int[] parsedLen) {
+ private int parseOffsetFields(String text, int start, boolean isShort, int[] parsedLen) {
int outLen = 0;
- int[] tmpParsedLen = {0};
int offset = 0;
- boolean sawVarHourAndAbuttingField = false;
+ int sign = 1;
if (parsedLen != null && parsedLen.length >= 1) {
parsedLen[0] = 0;
}
+ int offsetH, offsetM, offsetS;
+ offsetH = offsetM = offsetS = 0;
+
+ int[] fields = {0, 0, 0};
for (GMTOffsetPatternType gmtPatType : PARSE_GMT_OFFSET_TYPES) {
- int offsetH = 0, offsetM = 0, offsetS = 0;
- int idx = start;
Object[] items = _gmtOffsetPatternItems[gmtPatType.ordinal()];
assert items != null;
- boolean failed = false;
- for (int i = 0; i < items.length; i++) {
- if (items[i] instanceof String) {
- String patStr = (String)items[i];
- int len = patStr.length();
- if (!text.regionMatches(true, idx, patStr, 0, len)) {
- failed = true;
- break;
- }
- idx += len;
- } else {
- assert(items[i] instanceof GMTOffsetField);
- GMTOffsetField field = (GMTOffsetField)items[i];
- char fieldType = field.getType();
- if (fieldType == 'H') {
- int minDigits = 1;
- int maxDigits = minimumHourWidth ? 1 : 2;
- if (!minimumHourWidth && !sawVarHourAndAbuttingField) {
- if (i + 1 < items.length && (items[i + 1] instanceof GMTOffsetField)) {
- sawVarHourAndAbuttingField = true;
- }
- }
- offsetH = parseOffsetFieldWithLocalizedDigits(text, idx, minDigits, maxDigits, 0, MAX_OFFSET_HOUR, tmpParsedLen);
- } else if (fieldType == 'm') {
- offsetM = parseOffsetFieldWithLocalizedDigits(text, idx, 2, 2, 0, MAX_OFFSET_MINUTE, tmpParsedLen);
- } else if (fieldType == 's') {
- offsetS = parseOffsetFieldWithLocalizedDigits(text, idx, 2, 2, 0, MAX_OFFSET_SECOND, tmpParsedLen);
- }
-
- if (tmpParsedLen[0] == 0) {
- failed = true;
- break;
- }
- idx += tmpParsedLen[0];
- }
- }
- if (!failed) {
- int sign = gmtPatType.isPositive() ? 1 : -1;
- offset = ((((offsetH * 60) + offsetM) * 60) + offsetS) * 1000 * sign;
- outLen = idx - start;
+ outLen = parseOffsetFieldsWithPattern(text, start, items, false, fields);
+ if (outLen > 0) {
+ sign = gmtPatType.isPositive() ? 1 : -1;
+ offsetH = fields[0];
+ offsetM = fields[1];
+ offsetS = fields[2];
break;
}
}
-
- if (outLen == 0 && sawVarHourAndAbuttingField && !minimumHourWidth) {
- // When hour field is variable width and another non-literal pattern
- // field follows, the parse loop above might eat up the digit from
- // the abutting field. For example, with pattern "-Hmm" and input "-100",
- // the hour is parsed as -10 and fails to parse minute field.
- //
- // If this is the case, try parsing the text one more time with the arg
- // minimumHourWidth = true
- //
- // Note: This fallback is not applicable when quitAtHourField is true, because
- // the option is designed for supporting the case like "GMT+5". In this case,
- // we should get better result for parsing hour digits as much as possible.
-
- return parseOffsetFields(text, start, true, parsedLen);
+ if (outLen > 0 && _abuttingOffsetHoursAndMinutes) {
+ // When hours field is abutting minutes field,
+ // the parse result above may not be appropriate.
+ // For example, "01020" is parsed as 01:02 above,
+ // but it should be parsed as 00:10:20.
+ int tmpLen = 0;
+ int tmpSign = 1;
+ for (GMTOffsetPatternType gmtPatType : PARSE_GMT_OFFSET_TYPES) {
+ Object[] items = _gmtOffsetPatternItems[gmtPatType.ordinal()];
+ assert items != null;
+
+ // forcing parse to use single hour digit
+ tmpLen = parseOffsetFieldsWithPattern(text, start, items, true, fields);
+ if (tmpLen > 0) {
+ tmpSign = gmtPatType.isPositive() ? 1 : -1;
+ break;
+ }
+ }
+ if (tmpLen > outLen) {
+ // Better parse result with single hour digit
+ outLen = tmpLen;
+ sign = tmpSign;
+ offsetH = fields[0];
+ offsetM = fields[1];
+ offsetS = fields[2];
+ }
}
if (parsedLen != null && parsedLen.length >= 1) {
parsedLen[0] = outLen;
}
+
+ if (outLen > 0) {
+ offset = ((((offsetH * 60) + offsetM) * 60) + offsetS) * 1000 * sign;
+ }
+
return offset;
}
+ /**
+ * Parses localized GMT offset fields with the given pattern
+ *
+ * @param text the input text
+ * @param start the start index
+ * @param patternItems the pattern (already itemized)
+ * @param forceSingleHourDigit true if hours field is parsed as a single digit
+ * @param fields receives the parsed hours/minutes/seconds
+ * @return parsed length
+ */
+ private int parseOffsetFieldsWithPattern(String text, int start, Object[] patternItems, boolean forceSingleHourDigit, int fields[]) {
+ assert (fields != null && fields.length >= 3);
+ fields[0] = fields[1] = fields[2] = 0;
+
+ boolean failed = false;
+ int offsetH, offsetM, offsetS;
+ offsetH = offsetM = offsetS = 0;
+ int idx = start;
+ int[] tmpParsedLen = {0};
+ for (int i = 0; i < patternItems.length; i++) {
+ if (patternItems[i] instanceof String) {
+ String patStr = (String)patternItems[i];
+ int len = patStr.length();
+ if (!text.regionMatches(true, idx, patStr, 0, len)) {
+ failed = true;
+ break;
+ }
+ idx += len;
+ } else {
+ assert(patternItems[i] instanceof GMTOffsetField);
+ GMTOffsetField field = (GMTOffsetField)patternItems[i];
+ char fieldType = field.getType();
+ if (fieldType == 'H') {
+ int maxDigits = forceSingleHourDigit ? 1 : 2;
+ offsetH = parseOffsetFieldWithLocalizedDigits(text, idx, 1, maxDigits, 0, MAX_OFFSET_HOUR, tmpParsedLen);
+ } else if (fieldType == 'm') {
+ offsetM = parseOffsetFieldWithLocalizedDigits(text, idx, 2, 2, 0, MAX_OFFSET_MINUTE, tmpParsedLen);
+ } else if (fieldType == 's') {
+ offsetS = parseOffsetFieldWithLocalizedDigits(text, idx, 2, 2, 0, MAX_OFFSET_SECOND, tmpParsedLen);
+ }
+
+ if (tmpParsedLen[0] == 0) {
+ failed = true;
+ break;
+ }
+ idx += tmpParsedLen[0];
+ }
+ }
+
+ if (failed) {
+ return 0;
+ }
+
+ fields[0] = offsetH;
+ fields[1] = offsetM;
+ fields[2] = offsetS;
+
+ return idx - start;
+ }
+
/**
* Parses the input text using the default format patterns (e.g. "UTC{0}").
* @param text the input text
/**
- * Returns offset from GMT(UTC) in milliseconds for the given ISO 8601 style
- * (extended format) time zone string. When the given string is not an ISO 8601 time
+ * Returns offset from GMT(UTC) in milliseconds for the given ISO 8601 time zone string
+ * (basic format, extended format, or UTC indicator). When the given string is not an ISO 8601 time
* zone string, this method sets the current position as the error index
* to <code>ParsePosition pos</code> and returns 0.
*
- * @param text the text contains ISO 8601 style time zone string (e.g. "-08:00", "Z")
+ * @param text the text contains ISO 8601 style time zone string (e.g. "-08", "-08:00", "Z")
* at the position.
* @param pos the position.
* @param extendedOnly <code>true</code> if parsing the text as ISO 8601 extended offset format (e.g. "-08:00"),
* @return the offset from GMT(UTC) in milliseconds for the given ISO 8601 style
* time zone string.
*/
- private int parseOffsetISO8601(String text, ParsePosition pos, boolean extendedOnly, Output<Boolean> hasDigitOffset) {
+ private static int parseOffsetISO8601(String text, ParsePosition pos, boolean extendedOnly, Output<Boolean> hasDigitOffset) {
if (hasDigitOffset != null) {
hasDigitOffset.value = false;
}
return 0;
}
ParsePosition posOffset = new ParsePosition(start + 1);
- int offset = parseAsciiOffsetFields(text, posOffset, ':', OffsetFields.H, OffsetFields.HMS, false);
+ int offset = parseAsciiOffsetFields(text, posOffset, ':', OffsetFields.H, OffsetFields.HMS);
if (posOffset.getErrorIndex() == -1 && !extendedOnly && (posOffset.getIndex() - start <= 3)) {
// If the text is successfully parsed as extended format with the options above, it can be also parsed
// as basic format. For example, "0230" can be parsed as offset 2:00 (only first digits are valid for
return sign * offset;
}
- /**
- * Numeric offset field combinations
- */
- private enum OffsetFields {
- H, HM, HMS
- }
-
- /**
- * Formats offset using ASCII digits
- * @param offset The offset
- * @param sep The field separator character or null if not required
- * @param minFields The minimum fields
- * @param maxFields The maximum fields
- * @return The offset string
- * @throws IllegalArgumentException if the specified offset is out of supported range
- * (-24 hours < offset < +24 hours).
- */
- private static String formatOffsetWithAsciiDigits(int offset, Character sep, OffsetFields minFields, OffsetFields maxFields) {
- assert maxFields.ordinal() >= minFields.ordinal();
-
- if (Math.abs(offset) >= MAX_OFFSET) {
- throw new IllegalArgumentException("Offset out of range :" + offset);
- }
-
- StringBuilder buf = new StringBuilder();
- char sign = '+';
- if (offset < 0) {
- sign = '-';
- offset = -offset;
- }
- buf.append(sign);
-
- int[] fields = new int[3];
- fields[0] = offset / MILLIS_PER_HOUR;
- offset = offset % MILLIS_PER_HOUR;
- fields[1] = offset / MILLIS_PER_MINUTE;
- offset = offset % MILLIS_PER_MINUTE;
- fields[2] = offset / MILLIS_PER_SECOND;
-
- assert(fields[0] >= 0 && fields[0] <= MAX_OFFSET_HOUR);
- assert(fields[1] >= 0 && fields[1] <= MAX_OFFSET_MINUTE);
- assert(fields[2] >= 0 && fields[2] <= MAX_OFFSET_SECOND);
-
- int lastIdx = maxFields.ordinal();
- while (lastIdx > minFields.ordinal()) {
- if (fields[lastIdx] != 0) {
- break;
- }
- lastIdx--;
- }
-
- for (int idx = 0; idx <= lastIdx; idx++) {
- if (sep != null && idx != 0) {
- buf.append(sep);
- }
- if (fields[idx] < 10) {
- buf.append('0');
- }
- buf.append(fields[idx]);
- }
- return buf.toString();
- }
-
/**
* Parses offset represented by contiguous ASCII digits
* <p>
* @param pos The parse position
* @param minFields The minimum Fields to be parsed
* @param maxFields The maximum Fields to be parsed
- * @param fixedHourWidth true if hour field must be width of 2
+ * @param fixedHourWidth true if hours field must be width of 2
* @return Parsed offset, 0 or positive number.
*/
private static int parseAbuttingAsciiOffsetFields(String text, ParsePosition pos,
* @param sep The separator character
* @param minFields The minimum Fields to be parsed
* @param maxFields The maximum Fields to be parsed
- * @param fixedHourWidth true if hour field must be width of 2
* @return Parsed offset, 0 or positive number.
*/
- private static int parseAsciiOffsetFields(String text, ParsePosition pos,
- char sep, OffsetFields minFields, OffsetFields maxFields, boolean fixedHourWidth) {
+ private static int parseAsciiOffsetFields(String text, ParsePosition pos, char sep,
+ OffsetFields minFields, OffsetFields maxFields) {
int start = pos.getIndex();
int[] fieldVal = {0, 0, 0};
int[] fieldLen = {0, -1, -1};
for (int idx = start, fieldIdx = 0; idx < text.length() && fieldIdx <= maxFields.ordinal(); idx++) {
char c = text.charAt(idx);
if (c == sep) {
- if (fieldLen[fieldIdx] < 0) {
- // next field - expected
- fieldLen[fieldIdx] = 0;
- } else if (fieldIdx == 0 && !fixedHourWidth) {
+ if (fieldIdx == 0) {
+ if (fieldLen[0] == 0) {
+ // no hours field
+ break;
+ }
// 1 digit hour, move to next field
fieldIdx++;
- fieldLen[fieldIdx] = 0;
} else {
- // otherwise, premature field
- break;
+ if (fieldLen[fieldIdx] != -1) {
+ // premature minutes or seconds field
+ break;
+ }
+ fieldLen[fieldIdx] = 0;
}
continue;
+ } else if (fieldLen[fieldIdx] == -1) {
+ // no separator after 2 digit field
+ break;
}
int digit = ASCII_DIGITS.indexOf(c);
if (digit < 0) {
OffsetFields parsedFields = null;
do {
// hour
- if (fieldLen[0] == 0 || (fieldLen[0] == 1 && fixedHourWidth)) {
+ if (fieldLen[0] == 0) {
break;
}
if (fieldVal[0] > MAX_OFFSET_HOUR) {
- if (fixedHourWidth) {
- break;
- }
offset = (fieldVal[0] / 10) * MILLIS_PER_HOUR;
parsedFields = OffsetFields.H;
parsedLen = 1;
return offset;
}
+ /**
+ * Parse a zone ID.
+ * @param text the text contains a time zone ID string at the position.
+ * @param pos the position.
+ * @return The zone ID parsed.
+ */
+ private static String parseZoneID(String text, ParsePosition pos) {
+ String resolvedID = null;
+ if (ZONE_ID_TRIE == null) {
+ synchronized (TimeZoneFormat.class) {
+ if (ZONE_ID_TRIE == null) {
+ // Build zone ID trie
+ TextTrieMap<String> trie = new TextTrieMap<String>(true);
+ String[] ids = TimeZone.getAvailableIDs();
+ for (String id : ids) {
+ trie.put(id, id);
+ }
+ ZONE_ID_TRIE = trie;
+ }
+ }
+ }
+
+ int[] matchLen = new int[] {0};
+ Iterator<String> itr = ZONE_ID_TRIE.get(text, pos.getIndex(), matchLen);
+ if (itr != null) {
+ resolvedID = itr.next();
+ pos.setIndex(pos.getIndex() + matchLen[0]);
+ } else {
+ // TODO
+ // We many need to handle rule based custom zone ID (See ZoneMeta.parseCustomID),
+ // such as GM+05:00. However, the public parse method in this class also calls
+ // parseOffsetLocalizedGMT and custom zone IDs are likely supported by the parser,
+ // so we might not need to handle them here.
+ pos.setErrorIndex(pos.getIndex());
+ }
+ return resolvedID;
+ }
+
+ /**
+ * Parse a short zone ID.
+ * @param text the text contains a time zone ID string at the position.
+ * @param pos the position.
+ * @return The zone ID for the parsed short zone ID.
+ */
+ private static String parseShortZoneID(String text, ParsePosition pos) {
+ String resolvedID = null;
+ if (SHORT_ZONE_ID_TRIE == null) {
+ synchronized (TimeZoneFormat.class) {
+ if (SHORT_ZONE_ID_TRIE == null) {
+ // Build short zone ID trie
+ TextTrieMap<String> trie = new TextTrieMap<String>(true);
+ Set<String> canonicalIDs = TimeZone.getAvailableIDs(SystemTimeZoneType.CANONICAL, null, null);
+ for (String id : canonicalIDs) {
+ String shortID = ZoneMeta.getShortID(id);
+ if (shortID != null) {
+ trie.put(shortID, id);
+ }
+ }
+ // Canonical list does not contain Etc/Unknown
+ trie.put(UNKNOWN_SHORT_ZONE_ID, UNKNOWN_ZONE_ID);
+ SHORT_ZONE_ID_TRIE = trie;
+ }
+ }
+ }
+
+ int[] matchLen = new int[] {0};
+ Iterator<String> itr = SHORT_ZONE_ID_TRIE.get(text, pos.getIndex(), matchLen);
+ if (itr != null) {
+ resolvedID = itr.next();
+ pos.setIndex(pos.getIndex() + matchLen[0]);
+ } else {
+ pos.setErrorIndex(pos.getIndex());
+ }
+
+ return resolvedID;
+ }
+
+ /**
+ * Parse an exemplar location string.
+ * @param text the text contains an exemplar location string at the position.
+ * @param pos the position.
+ * @return The zone ID for the parsed exemplar location.
+ */
+ private String parseExemplarLocation(String text, ParsePosition pos) {
+ int startIdx = pos.getIndex();
+ int parsedPos = -1;
+ String tzID = null;
+
+ EnumSet<NameType> nameTypes = EnumSet.of(NameType.EXEMPLAR_LOCATION);
+ Collection<MatchInfo> exemplarMatches = _tznames.find(text, startIdx, nameTypes);
+ if (exemplarMatches != null) {
+ MatchInfo exemplarMatch = null;
+ for (MatchInfo match : exemplarMatches) {
+ if (startIdx + match.matchLength() > parsedPos) {
+ exemplarMatch = match;
+ parsedPos = startIdx + match.matchLength();
+ }
+ }
+ if (exemplarMatch != null) {
+ tzID = getTimeZoneID(exemplarMatch.tzID(), exemplarMatch.mzID());
+ pos.setIndex(parsedPos);
+ }
+ }
+ if (tzID == null) {
+ pos.setErrorIndex(startIdx);
+ }
+
+ return tzID;
+ }
/**
* Implements <code>TimeZoneFormat</code> object cache
throw new InvalidObjectException("Missing field: gmtPattern");
}
- _gmtOffsetPatterns = (String[])fields.get("_gmtOffsetPatterns", null);
- if (_gmtOffsetPatterns == null) {
+ String[] tmpGmtOffsetPatterns = (String[])fields.get("_gmtOffsetPatterns", null);
+ if (tmpGmtOffsetPatterns == null) {
throw new InvalidObjectException("Missing field: gmtOffsetPatterns");
- } else if (_gmtOffsetPatterns.length < 4) {
+ } else if (tmpGmtOffsetPatterns.length < 4) {
throw new InvalidObjectException("Incompatible field: gmtOffsetPatterns");
}
+ _gmtOffsetPatterns = new String[6];
+ if (tmpGmtOffsetPatterns.length == 4) {
+ for (int i = 0; i < 4; i++) {
+ _gmtOffsetPatterns[i] = tmpGmtOffsetPatterns[i];
+ }
+ _gmtOffsetPatterns[GMTOffsetPatternType.POSITIVE_H.ordinal()] = truncateOffsetPattern(_gmtOffsetPatterns[GMTOffsetPatternType.POSITIVE_HM.ordinal()]);
+ _gmtOffsetPatterns[GMTOffsetPatternType.NEGATIVE_H.ordinal()] = truncateOffsetPattern(_gmtOffsetPatterns[GMTOffsetPatternType.NEGATIVE_HM.ordinal()]);
+ } else {
+ _gmtOffsetPatterns = tmpGmtOffsetPatterns;
+ }
_gmtOffsetDigits = (String[])fields.get("_gmtOffsetDigits", null);
if (_gmtOffsetDigits == null) {
// Expected output field values for above DateFormats on aug13
// Fields are given in order of DateFormat field number
final String EXPECTED[] = {
- "", "1997", "August", "13", "", "", "34", "12", "",
- "Wednesday", "", "", "", "", "PM", "2", "", "Pacific Daylight Time", "", "", "", "", "", "", "","","","","","","",
-
- "", "1997", "ao\u00FBt", "13", "", "14", "34", "12", "",
- "mercredi", "", "", "", "", "", "", "", "heure avanc\u00E9e du Pacifique", "", "", "", "", "", "", "","","","","","","",
-
- "AD", "1997", "8", "13", "14", "14", "34", "12", "5",
- "Wed", "225", "2", "33", "3", "PM", "2", "2", "PDT", "1997", "4", "1997", "2450674", "52452513", "-0700", "PT","4","8","3","3","PDT","1997",
-
- "Anno Domini", "1997", "August", "0013", "0014", "0014", "0034", "0012", "5130",
- "Wednesday", "0225", "0002", "0033", "0003", "PM", "0002", "0002", "Pacific Daylight Time", "1997",
- "Wednesday", "1997", "2450674", "52452513", "GMT-07:00", "Pacific Time","Wednesday","August", "3rd quarter", "3rd quarter","Los Angeles Time","1997",
+ "", "1997", "August", "13", "", "", "34", "12", "", "Wednesday",
+ "", "", "", "", "PM", "2", "", "Pacific Daylight Time", "", "",
+ "", "", "", "", "", "", "", "", "", "",
+ "", "", "", "",
+
+ "", "1997", "ao\u00FBt", "13", "", "14", "34", "12", "", "mercredi",
+ "", "", "", "", "", "", "", "heure avanc\u00E9e du Pacifique", "", "",
+ "", "", "", "", "", "", "", "", "", "",
+ "", "", "", "",
+
+ "AD", "1997", "8", "13", "14", "14", "34", "12", "5", "Wed",
+ "225", "2", "33", "3", "PM", "2", "2", "PDT", "1997", "4",
+ "1997", "2450674", "52452513", "-0700", "PT", "4", "8", "3", "3", "uslax",
+ "1997", "GMT-7", "-07", "-07",
+
+ "Anno Domini", "1997", "August", "0013", "0014", "0014", "0034", "0012", "5130", "Wednesday",
+ "0225", "0002", "0033", "0003", "PM", "0002", "0002", "Pacific Daylight Time", "1997", "Wednesday",
+ "1997", "2450674", "52452513", "GMT-07:00", "Pacific Time", "Wednesday", "August", "3rd quarter", "3rd quarter", "Los Angeles Time",
+ "1997", "GMT-07:00", "-0700", "-0700",
};
assertTrue("data size", EXPECTED.length == COUNT * DateFormat.FIELD_COUNT);
/**
* This MUST be kept in sync with DateFormatSymbols.patternChars.
*/
- static final String PATTERN_CHARS = "GyMdkHmsSEDFwWahKzYeugAZvcLQqVU";
+ static final String PATTERN_CHARS = "GyMdkHmsSEDFwWahKzYeugAZvcLQqVUOXx";
/**
* A list of the DateFormat.Field.
DateFormat.Field.QUARTER, // q
DateFormat.Field.TIME_ZONE, // V
DateFormat.Field.YEAR, // U
+ DateFormat.Field.TIME_ZONE, // O
+ DateFormat.Field.TIME_ZONE, // X
+ DateFormat.Field.TIME_ZONE, // x
};
/**
"STAND_ALONE_QUARTER_FIELD",
"TIMEZONE_SPECIAL_FIELD",
"YEAR_NAME_FIELD",
+ "TIMEZONE_LOCALIZED_GMT_OFFSET_FIELD",
+ "TIMEZONE_ISO_FIELD",
+ "TIMEZONE_ISO_LOCAL_FIELD",
};
/**
{ "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" },
{ "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZZ", "-08:00", "-8:00" },
{ "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "PST", "America/Los_Angeles" },
- { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "V", "PST", "America/Los_Angeles" },
{ "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "Pacific Standard Time", "America/Los_Angeles" },
{ "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
{ "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
{ "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "PDT", "America/Los_Angeles" },
- { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "V", "PDT", "America/Los_Angeles" },
{ "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "Pacific Daylight Time", "America/Los_Angeles" },
{ "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "PT", "America/Los_Angeles" },
{ "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "Pacific Time", "America/Los_Angeles" },
{ "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "VVVV", "Los Angeles Time", "America/Los_Angeles" },
- { "en_GB", "America/Los_Angeles", "2004-01-15T12:00:00Z", "z", "GMT-08:00", "America/Los_Angeles" },
+ { "en_GB", "America/Los_Angeles", "2004-01-15T12:00:00Z", "z", "GMT-8", "America/Los_Angeles" },
{ "en", "America/Phoenix", "2004-01-15T00:00:00Z", "Z", "-0700", "-7:00" },
{ "en", "America/Phoenix", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
{ "en", "America/Phoenix", "2004-01-15T00:00:00Z", "z", "MST", "America/Phoenix" },
- { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "V", "MST", "America/Phoenix" },
{ "en", "America/Phoenix", "2004-01-15T00:00:00Z", "zzzz", "Mountain Standard Time", "America/Phoenix" },
{ "en", "America/Phoenix", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
{ "en", "America/Phoenix", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
{ "en", "America/Phoenix", "2004-07-15T00:00:00Z", "z", "MST", "America/Phoenix" },
- { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "V", "MST", "America/Phoenix" },
{ "en", "America/Phoenix", "2004-07-15T00:00:00Z", "zzzz", "Mountain Standard Time", "America/Phoenix" },
{ "en", "America/Phoenix", "2004-07-15T00:00:00Z", "v", "MST", "America/Phoenix" },
{ "en", "America/Phoenix", "2004-07-15T00:00:00Z", "vvvv", "Mountain Standard Time", "America/Phoenix" },
{ "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
- { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "V", "GMT-03:00", "-3:00" },
+ { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argentina Standard Time", "-3:00" },
{ "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
- { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "V", "GMT-03:00", "-3:00" },
+ { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argentina Standard Time", "-3:00" },
{ "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Aires Time", "America/Buenos_Aires" },
{ "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentina Standard Time", "America/Buenos_Aires" },
{ "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
- { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "V", "GMT-03:00", "-3:00" },
+ { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argentina Standard Time", "-3:00" },
{ "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
- { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "V", "GMT-03:00", "-3:00" },
+ { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argentina Standard Time", "-3:00" },
{ "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Aires Time", "America/Buenos_Aires" },
{ "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentina Standard Time", "America/Buenos_Aires" },
{ "en", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
{ "en", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" },
- { "en", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-05:00", "-5:00" },
- { "en", "America/Havana", "2004-01-15T00:00:00Z", "V", "GMT-05:00", "-5:00" },
+ { "en", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00" },
{ "en", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "Cuba Standard Time", "-5:00" },
{ "en", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
{ "en", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" },
- { "en", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-04:00", "-4:00" },
- { "en", "America/Havana", "2004-07-15T00:00:00Z", "V", "GMT-04:00", "-4:00" },
+ { "en", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00" },
{ "en", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "Cuba Daylight Time", "-4:00" },
{ "en", "America/Havana", "2004-07-15T00:00:00Z", "v", "Cuba Time", "America/Havana" },
{ "en", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "Cuba Time", "America/Havana" },
{ "en", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
{ "en", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
- { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
- { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "V", "GMT+11:00", "+11:00" },
+ { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
{ "en", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "Australian Eastern Daylight Time", "+11:00" },
{ "en", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
{ "en", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
- { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
- { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "V", "GMT+10:00", "+10:00" },
+ { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
{ "en", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "Australian Eastern Standard Time", "+10:00" },
{ "en", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "Sydney Time", "Australia/Sydney" },
{ "en", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "Eastern Australia Time", "Australia/Sydney" },
{ "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
{ "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
- { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
- { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "V", "GMT+11:00", "+11:00" },
+ { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
{ "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "Australian Eastern Daylight Time", "+11:00" },
{ "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
{ "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
- { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
- { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "V", "GMT+10:00", "+10:00" },
+ { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
{ "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "Australian Eastern Standard Time", "+10:00" },
{ "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "Sydney Time", "Australia/Sydney" },
{ "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "Eastern Australia Time", "Australia/Sydney" },
{ "en", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
{ "en", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00" },
{ "en", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" },
- { "en", "Europe/London", "2004-01-15T00:00:00Z", "V", "GMT", "+0:00" },
{ "en", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "Greenwich Mean Time", "+0:00" },
{ "en", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
{ "en", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" },
- { "en", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+01:00", "Europe/London" },
- { "en", "Europe/London", "2004-07-15T00:00:00Z", "V", "GMT+01:00", "Europe/London" },
+ { "en", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "Europe/London" },
{ "en", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "British Summer Time", "Europe/London" },
// icu en.txt has exemplar city for this time zone
{ "en", "Europe/London", "2004-07-15T00:00:00Z", "v", "United Kingdom Time", "Europe/London" },
{ "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
{ "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
- { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-03:00", "-3:00" },
+ { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" },
{ "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" },
// JB#5150
{ "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
{ "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
- { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+05:30", "+5:30" },
- { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "V", "GMT+05:30", "+5:30" },
+ { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+5:30", "+5:30" },
{ "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "India Standard Time", "+5:30" },
{ "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
{ "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
- { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+05:30", "+05:30" },
- { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "V", "GMT+05:30", "+05:30" },
+ { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+5:30", "+05:30" },
{ "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "India Standard Time", "+5:30" },
{ "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "India Time", "Asia/Calcutta" },
{ "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "India Standard Time", "Asia/Calcutta" },
{ "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
{ "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" },
- { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-08:00", "-8:00" },
+ { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-8", "-8:00" },
{ "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "Nordamerikanische Westk\u00fcsten-Normalzeit", "-8:00" },
{ "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
{ "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
- { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-07:00", "-7:00" },
+ { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-7", "-7:00" },
{ "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "Nordamerikanische Westk\u00fcsten-Sommerzeit", "-7:00" },
{ "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "Los Angeles Zeit", "America/Los_Angeles" },
{ "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "Nordamerikanische Westk\u00fcstenzeit", "America/Los_Angeles" },
{ "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argentinische Normalzeit", "-3:00" },
{ "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argentinische Normalzeit", "-3:00" },
{ "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Aires Zeit", "America/Buenos_Aires" },
{ "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentinische Normalzeit", "America/Buenos_Aires" },
{ "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argentinische Normalzeit", "-3:00" },
{ "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argentinische Normalzeit", "-3:00" },
{ "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Aires Zeit", "America/Buenos_Aires" },
{ "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentinische Normalzeit", "America/Buenos_Aires" },
{ "de", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
{ "de", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" },
- { "de", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-05:00", "-5:00" },
+ { "de", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00" },
{ "de", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "Kubanische Normalzeit", "-5:00" },
{ "de", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
{ "de", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" },
- { "de", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-04:00", "-4:00" },
+ { "de", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00" },
{ "de", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "Kubanische Sommerzeit", "-4:00" },
{ "de", "America/Havana", "2004-07-15T00:00:00Z", "v", "Kuba Zeit", "America/Havana" },
{ "de", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "Kubanische Zeit", "America/Havana" },
{ "de", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
{ "de", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
- { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
+ { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
{ "de", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "Ostaustralische Sommerzeit", "+11:00" },
{ "de", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
{ "de", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
- { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
+ { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
{ "de", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "Ostaustralische Normalzeit", "+10:00" },
{ "de", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "Sydney Zeit", "Australia/Sydney" },
{ "de", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "Ostaustralische Zeit", "Australia/Sydney" },
{ "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
{ "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
- { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
+ { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
{ "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "Ostaustralische Sommerzeit", "+11:00" },
{ "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
{ "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
- { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
+ { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
{ "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "Ostaustralische Normalzeit", "+10:00" },
{ "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "Sydney Zeit", "Australia/Sydney" },
{ "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "Ostaustralische Zeit", "Australia/Sydney" },
{ "de", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "Mittlere Greenwich-Zeit", "+0:00" },
{ "de", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
{ "de", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" },
- { "de", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+01:00", "+1:00" },
+ { "de", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "+1:00" },
{ "de", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "Britische Sommerzeit", "+1:00" },
{ "de", "Europe/London", "2004-07-15T00:00:00Z", "v", "Vereinigtes K\u00f6nigreich Zeit", "Europe/London" },
{ "de", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "Vereinigtes K\u00f6nigreich Zeit", "Europe/London" },
{ "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
{ "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
- { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-03:00", "-3:00" },
+ { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" },
{ "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" },
// JB#5150
{ "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
{ "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
- { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+05:30", "+5:30" },
+ { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+5:30", "+5:30" },
{ "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "Indische Zeit", "+5:30" },
{ "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
{ "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
- { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+05:30", "+05:30" },
+ { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+5:30", "+05:30" },
{ "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "Indische Zeit", "+5:30" },
{ "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "Indien Zeit", "Asia/Calcutta" },
{ "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "Indische Zeit", "Asia/Calcutta" },
{ "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
{ "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0800", "-8:00" },
- { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-0800", "America/Los_Angeles" },
+ { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-8", "America/Los_Angeles" },
{ "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\u5317\u7f8e\u592a\u5e73\u6d0b\u6807\u51c6\u65f6\u95f4", "America/Los_Angeles" },
{ "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
{ "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0700", "-7:00" },
- { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-0700", "America/Los_Angeles" },
+ { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-7", "America/Los_Angeles" },
{ "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\u5317\u7f8e\u592a\u5e73\u6d0b\u590f\u4ee4\u65f6\u95f4", "America/Los_Angeles" },
// icu zh.txt has exemplar city for this time zone
{ "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\u6D1B\u6749\u77F6\u65F6\u95F4", "America/Los_Angeles" },
{ "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0300", "-3:00" },
- { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-0300", "-3:00" },
+ { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-3", "-3:00" },
{ "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\u963f\u6839\u5ef7\u6807\u51c6\u65f6\u95f4", "-3:00" },
{ "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0300", "-3:00" },
- { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-0300", "-3:00" },
+ { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-3", "-3:00" },
{ "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\u963f\u6839\u5ef7\u6807\u51c6\u65f6\u95f4", "-3:00" },
// icu zh.txt does not have info for this time zone
{ "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u5E03\u5B9C\u8BFA\u65AF\u827E\u5229\u65AF\u65F6\u95F4", "America/Buenos_Aires" },
{ "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0300", "-3:00" },
- { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-0300", "-3:00" },
+ { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-3", "-3:00" },
{ "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\u963f\u6839\u5ef7\u6807\u51c6\u65f6\u95f4", "-3:00" },
{ "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0300", "-3:00" },
- { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-0300", "-3:00" },
+ { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-3", "-3:00" },
{ "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\u963f\u6839\u5ef7\u6807\u51c6\u65f6\u95f4", "-3:00" },
{ "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u5E03\u5B9C\u8BFA\u65AF\u827E\u5229\u65AF\u65F6\u95F4", "America/Buenos_Aires" },
{ "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\u963f\u6839\u5ef7\u6807\u51c6\u65f6\u95f4", "America/Buenos_Aires" },
{ "zh", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
{ "zh", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0500", "-5:00" },
- { "zh", "America/Havana", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-0500", "-5:00" },
+ { "zh", "America/Havana", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-5", "-5:00" },
{ "zh", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\u53e4\u5df4\u6807\u51c6\u65f6\u95f4", "-5:00" },
{ "zh", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
{ "zh", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0400", "-4:00" },
- { "zh", "America/Havana", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-0400", "-4:00" },
+ { "zh", "America/Havana", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-4", "-4:00" },
{ "zh", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\u53e4\u5df4\u590f\u4ee4\u65f6\u95f4", "-4:00" },
{ "zh", "America/Havana", "2004-07-15T00:00:00Z", "v", "\u53e4\u5df4\u65f6\u95f4", "America/Havana" },
{ "zh", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\u53e4\u5df4\u65f6\u95f4", "America/Havana" },
{ "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
{ "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"+1100", "+11:00" },
- { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "z", GMT_ZH+"+1100", "+11:00" },
+ { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "z", GMT_ZH+"+11", "+11:00" },
{ "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\u6fb3\u5927\u5229\u4e9a\u4e1c\u90e8\u590f\u4ee4\u65f6\u95f4", "+11:00" },
{ "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
{ "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"+1000", "+10:00" },
- { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "z", GMT_ZH+"+1000", "+10:00" },
+ { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "z", GMT_ZH+"+10", "+10:00" },
{ "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\u6fb3\u5927\u5229\u4e9a\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4", "+10:00" },
{ "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\u6089\u5C3C\u65F6\u95F4", "Australia/Sydney" },
{ "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\u6fb3\u5927\u5229\u4e9a\u4e1c\u90e8\u65f6\u95f4", "Australia/Sydney" },
{ "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
{ "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"+1100", "+11:00" },
- { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", GMT_ZH+"+1100", "+11:00" },
+ { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", GMT_ZH+"+11", "+11:00" },
{ "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\u6fb3\u5927\u5229\u4e9a\u4e1c\u90e8\u590f\u4ee4\u65f6\u95f4", "+11:00" },
{ "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
{ "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"+1000", "+10:00" },
- { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", GMT_ZH+"+1000", "+10:00" },
+ { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", GMT_ZH+"+10", "+10:00" },
{ "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\u6fb3\u5927\u5229\u4e9a\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4", "+10:00" },
{ "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\u6089\u5C3C\u65F6\u95F4", "Australia/Sydney" },
{ "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\u6fb3\u5927\u5229\u4e9a\u4e1c\u90e8\u65f6\u95f4", "Australia/Sydney" },
{ "zh", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
{ "zh", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH, "+0:00" },
{ "zh", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" },
- { "zh", "Europe/London", "2004-01-15T00:00:00Z", "V", "GMT", "+0:00" },
{ "zh", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\u683C\u6797\u5C3C\u6CBB\u6807\u51C6\u65F6\u95F4", "+0:00" },
{ "zh", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
{ "zh", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"+0100", "+1:00" },
- { "zh", "Europe/London", "2004-07-15T00:00:00Z", "z", GMT_ZH+"+0100", "+1:00" },
- { "zh", "Europe/London", "2004-07-15T00:00:00Z", "V", GMT_ZH+"+0100", "+1:00" },
+ { "zh", "Europe/London", "2004-07-15T00:00:00Z", "z", GMT_ZH+"+1", "+1:00" },
{ "zh", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "\u82f1\u56fd\u590f\u4ee4\u65f6\u95f4", "+1:00" },
{ "zh", "Europe/London", "2004-07-15T00:00:00Z", "v", "\u82f1\u56fd\u65f6\u95f4", "Europe/London" },
{ "zh", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\u82f1\u56fd\u65f6\u95f4", "Europe/London" },
{ "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0300", "-3:00" },
- { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-0300", "-3:00" },
+ { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-3", "-3:00" },
{ "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", GMT_ZH+"-0300", "-3:00" },
{ "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0300", "-3:00" },
- { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-0300", "-3:00" },
+ { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-3", "-3:00" },
{ "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", GMT_ZH+"-0300", "-3:00" },
- { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", GMT_ZH+"-0300", "-3:00" },
+ { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", GMT_ZH+"-3", "-3:00" },
{ "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", GMT_ZH+"-0300", "-3:00" },
// JB#5150
{ "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
{ "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"+0530", "+5:30" },
- { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", GMT_ZH+"+0530", "+5:30" },
+ { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", GMT_ZH+"+530", "+5:30" },
{ "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\u5370\u5ea6\u65f6\u95f4", "+5:30" },
{ "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
{ "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"+0530", "+5:30" },
- { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", GMT_ZH+"+0530", "+05:30" },
+ { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", GMT_ZH+"+530", "+05:30" },
{ "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\u5370\u5ea6\u65f6\u95f4", "+5:30" },
{ "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "\u5370\u5ea6\u65f6\u95f4", "Asia/Calcutta" },
{ "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\u5370\u5EA6\u65f6\u95f4", "Asia/Calcutta" },
{ "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
{ "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" },
- { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-08:00", "-8:00" },
+ { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-8", "-8:00" },
{ "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\u092a\u094d\u0930\u0936\u093e\u0902\u0924\u0020\u092e\u093e\u0928\u0915\u0020\u0938\u092e\u092f", "-8:00" },
{ "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
{ "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
- { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-07:00", "-7:00" },
+ { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-7", "-7:00" },
{ "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\u092A\u094D\u0930\u0936\u093E\u0902\u0924 \u0926\u093F\u0935\u093E\u0935\u0932\u094B\u0915 \u0938\u092E\u092F", "-7:00" },
{ "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\u0932\u094B\u0938 \u090F\u0902\u091C\u093F\u0932\u0947\u0938 \u0938\u092E\u092F", "America/Los_Angeles" },
{ "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\u092A\u094D\u0930\u0936\u093E\u0902\u0924 \u0938\u092E\u092F", "America/Los_Angeles" },
{ "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\u0905\u0930\u094D\u091C\u0947\u0902\u091F\u0940\u0928\u093E \u092E\u093E\u0928\u0915 \u0938\u092E\u092F", "-3:00" },
{ "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\u0905\u0930\u094D\u091C\u0947\u0902\u091F\u0940\u0928\u093E \u092E\u093E\u0928\u0915 \u0938\u092E\u092F", "-3:00" },
{ "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u092C\u094D\u092F\u0942\u0928\u0938 \u0906\u092F\u0930\u0938 \u0938\u092E\u092F", "America/Buenos_Aires" },
{ "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\u0905\u0930\u094D\u091C\u0947\u0902\u091F\u0940\u0928\u093E \u092E\u093E\u0928\u0915 \u0938\u092E\u092F", "America/Buenos_Aires" },
{ "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\u0905\u0930\u094D\u091C\u0947\u0902\u091F\u0940\u0928\u093E \u092E\u093E\u0928\u0915 \u0938\u092E\u092F", "-3:00" },
{ "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\u0905\u0930\u094D\u091C\u0947\u0902\u091F\u0940\u0928\u093E \u092E\u093E\u0928\u0915 \u0938\u092E\u092F", "-3:00" },
{ "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u092C\u094D\u092F\u0942\u0928\u0938 \u0906\u092F\u0930\u0938 \u0938\u092E\u092F", "America/Buenos_Aires" },
{ "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\u0905\u0930\u094D\u091C\u0947\u0902\u091F\u0940\u0928\u093E \u092E\u093E\u0928\u0915 \u0938\u092E\u092F", "America/Buenos_Aires" },
{ "hi", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
{ "hi", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" },
- { "hi", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-05:00", "-5:00" },
+ { "hi", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00" },
{ "hi", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\u0915\u094d\u092f\u0942\u092c\u093e \u0915\u093e \u092e\u093e\u0928\u0915 \u0938\u092e\u092f", "-5:00" },
{ "hi", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
{ "hi", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" },
- { "hi", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-04:00", "-4:00" },
+ { "hi", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00" },
{ "hi", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\u0915\u094d\u092f\u0942\u092c\u093e \u0915\u093e \u0921\u0947\u0932\u093e\u0907\u091f \u091f\u093e\u0907\u092e", "-4:00" },
{ "hi", "America/Havana", "2004-07-15T00:00:00Z", "v", "\u0915\u094d\u092f\u0942\u092c\u093e \u0938\u092E\u092F", "America/Havana" },
{ "hi", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\u0915\u094d\u092f\u0942\u092c\u093e \u0915\u093e \u0938\u092E\u092F", "America/Havana" },
{ "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
{ "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
- { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
+ { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
{ "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\u0911\u0938\u094D\u200D\u091F\u094D\u0930\u0947\u0932\u093F\u092F\u093E\u0908 \u092A\u0942\u0930\u094D\u0935\u0940 \u0926\u093F\u0935\u093E\u0935\u0932\u094B\u0915 \u0938\u092E\u092F", "+11:00" },
{ "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
{ "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
- { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
+ { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
{ "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\u0911\u0938\u094D\u200D\u091F\u094D\u0930\u0947\u0932\u093F\u092F\u093E\u0908 \u092A\u0942\u0930\u094D\u0935\u0940 \u092E\u093E\u0928\u0915 \u0938\u092E\u092F", "+10:00" },
{ "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\u0938\u093F\u0921\u0928\u0940 \u0938\u092E\u092F", "Australia/Sydney" },
{ "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\u092A\u0942\u0930\u094D\u0935\u0940 \u0911\u0938\u094D\u091F\u094D\u0930\u0947\u0932\u093F\u092F\u093E\u0908 \u0938\u092E\u092F", "Australia/Sydney" },
{ "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
{ "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
- { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
+ { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
{ "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\u0911\u0938\u094D\u200D\u091F\u094D\u0930\u0947\u0932\u093F\u092F\u093E\u0908 \u092A\u0942\u0930\u094D\u0935\u0940 \u0926\u093F\u0935\u093E\u0935\u0932\u094B\u0915 \u0938\u092E\u092F", "+11:00" },
{ "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
{ "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
- { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
+ { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
{ "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\u0911\u0938\u094D\u200D\u091F\u094D\u0930\u0947\u0932\u093F\u092F\u093E\u0908 \u092A\u0942\u0930\u094D\u0935\u0940 \u092E\u093E\u0928\u0915 \u0938\u092E\u092F", "+10:00" },
{ "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\u0938\u093F\u0921\u0928\u0940 \u0938\u092E\u092F", "Australia/Sydney" },
{ "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\u092A\u0942\u0930\u094D\u0935\u0940 \u0911\u0938\u094D\u091F\u094D\u0930\u0947\u0932\u093F\u092F\u093E\u0908 \u0938\u092E\u092F", "Australia/Sydney" },
{ "hi", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\u0917\u094d\u0930\u0940\u0928\u0935\u093f\u091a \u092e\u0940\u0928 \u091f\u093e\u0907\u092e", "+0:00" },
{ "hi", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
{ "hi", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" },
- { "hi", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+01:00", "+1:00" },
+ { "hi", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "+1:00" },
{ "hi", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "GMT+01:00", "+1:00" },
{ "hi", "Europe/London", "2004-07-15T00:00:00Z", "v", "\u092C\u094D\u0930\u093F\u091F\u0947\u0928 \u0938\u092E\u092F", "Europe/London" },
{ "hi", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\u092C\u094D\u0930\u093F\u091F\u0947\u0928 \u0938\u092E\u092F", "Europe/London" },
{ "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
{ "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
- { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-03:00", "-3:00" },
+ { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" },
{ "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" },
{ "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
{ "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
{ "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"-0800", "-8:00" },
- { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", GMT_BG+"-0800", "America/Los_Angeles" },
- { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "V", GMT_BG+"-0800", "America/Los_Angeles" },
+ { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", GMT_BG+"-8", "America/Los_Angeles" },
{ "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\u0422\u0438\u0445\u043E\u043E\u043A\u0435\u0430\u043D\u0441\u043A\u0430 \u0447\u0430\u0441\u043E\u0432\u0430 \u0437\u043E\u043D\u0430", "America/Los_Angeles" },
{ "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
{ "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"-0700", "-7:00" },
- { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", GMT_BG+"-0700", "America/Los_Angeles" },
- { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "V", GMT_BG+"-0700", "America/Los_Angeles" },
+ { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", GMT_BG+"-7", "America/Los_Angeles" },
{ "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\u0422\u0438\u0445\u043E\u043E\u043A\u0435\u0430\u043D\u0441\u043A\u0430 \u043B\u044F\u0442\u043D\u0430 \u0447\u0430\u0441\u043E\u0432\u0430 \u0437\u043E\u043D\u0430", "America/Los_Angeles" },
// icu bg.txt has exemplar city for this time zone
{ "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\u041B\u043E\u0441 \u0410\u043D\u0436\u0435\u043B\u0438\u0441 \u0432\u0440\u0435\u043C\u0435", "America/Los_Angeles" },
{ "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"-0300", "-3:00" },
- { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", GMT_BG+"-0300", "-3:00" },
+ { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", GMT_BG+"-3", "-3:00" },
{ "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\u0410\u0440\u0436\u0435\u043D\u0442\u0438\u043D\u0430 \u2013 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u0432\u0440\u0435\u043c\u0435", "-3:00" },
{ "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"-0300", "-3:00" },
- { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", GMT_BG+"-0300", "-3:00" },
+ { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", GMT_BG+"-3", "-3:00" },
{ "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\u0410\u0440\u0436\u0435\u043D\u0442\u0438\u043D\u0430 \u2013 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u0432\u0440\u0435\u043c\u0435", "-3:00" },
{ "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u0411\u0443\u0435\u043D\u043E\u0441 \u0410\u0439\u0440\u0435\u0441 \u0432\u0440\u0435\u043C\u0435", "America/Buenos_Aires" },
{ "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\u0410\u0440\u0436\u0435\u043D\u0442\u0438\u043D\u0430 \u2013 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u0432\u0440\u0435\u043c\u0435", "America/Buenos_Aires" },
{ "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"-0300", "-3:00" },
- { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", GMT_BG+"-0300", "-3:00" },
+ { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", GMT_BG+"-3", "-3:00" },
{ "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\u0410\u0440\u0436\u0435\u043D\u0442\u0438\u043D\u0430 \u2013 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u0432\u0440\u0435\u043c\u0435", "-3:00" },
{ "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"-0300", "-3:00" },
- { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", GMT_BG+"-0300", "-3:00" },
+ { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", GMT_BG+"-3", "-3:00" },
{ "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\u0410\u0440\u0436\u0435\u043D\u0442\u0438\u043D\u0430 \u2013 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u0432\u0440\u0435\u043c\u0435", "-3:00" },
// icu bg.txt does not have info for this time zone
{ "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u0411\u0443\u0435\u043D\u043E\u0441 \u0410\u0439\u0440\u0435\u0441 \u0432\u0440\u0435\u043C\u0435", "America/Buenos_Aires" },
{ "bg", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
{ "bg", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"-0500", "-5:00" },
- { "bg", "America/Havana", "2004-01-15T00:00:00Z", "z", GMT_BG+"-0500", "-5:00" },
+ { "bg", "America/Havana", "2004-01-15T00:00:00Z", "z", GMT_BG+"-5", "-5:00" },
{ "bg", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\u041a\u0443\u0431\u0438\u043d\u0441\u043a\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u0432\u0440\u0435\u043c\u0435", "-5:00" },
{ "bg", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
{ "bg", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"-0400", "-4:00" },
- { "bg", "America/Havana", "2004-07-15T00:00:00Z", "z", GMT_BG+"-0400", "-4:00" },
+ { "bg", "America/Havana", "2004-07-15T00:00:00Z", "z", GMT_BG+"-4", "-4:00" },
{ "bg", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\u041a\u0443\u0431\u0438\u043d\u0441\u043a\u043e \u043b\u044f\u0442\u043d\u043e \u0447\u0430\u0441\u043e\u0432\u043e \u0432\u0440\u0435\u043c\u0435", "-4:00" },
{ "bg", "America/Havana", "2004-07-15T00:00:00Z", "v", "\u041a\u0443\u0431\u0430 \u0432\u0440\u0435\u043C\u0435", "America/Havana" },
{ "bg", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\u041a\u0443\u0431\u0438\u043d\u0441\u043a\u043e \u0432\u0440\u0435\u043C\u0435", "America/Havana" },
{ "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
{ "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"+1100", "+11:00" },
- { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "z", GMT_BG+"+1100", "+11:00" },
+ { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "z", GMT_BG+"+11", "+11:00" },
{ "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\u0410\u0432\u0441\u0442\u0440\u0430\u043B\u0438\u044F \u2013 \u0438\u0437\u0442\u043E\u0447\u043D\u043E \u043B\u044F\u0442\u043D\u043E \u0447\u0430\u0441\u043E\u0432\u043E \u0432\u0440\u0435\u043C\u0435", "+11:00" },
{ "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
{ "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"+1000", "+10:00" },
- { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "z", GMT_BG+"+1000", "+10:00" },
+ { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "z", GMT_BG+"+10", "+10:00" },
{ "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\u0410\u0432\u0441\u0442\u0440\u0430\u043B\u0438\u044F \u2013 \u0438\u0437\u0442\u043E\u0447\u043D\u043E \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u043E \u0432\u0440\u0435\u043C\u0435", "+10:00" },
{ "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\u0421\u0438\u0434\u043D\u0438 \u0432\u0440\u0435\u043C\u0435", "Australia/Sydney" },
{ "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\u0410\u0432\u0441\u0442\u0440\u0430\u043B\u0438\u044F \u2013 \u0438\u0437\u0442\u043E\u0447\u043D\u043E \u0432\u0440\u0435\u043C\u0435", "Australia/Sydney" },
{ "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
{ "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"+1100", "+11:00" },
- { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", GMT_BG+"+1100", "+11:00" },
+ { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", GMT_BG+"+11", "+11:00" },
{ "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\u0410\u0432\u0441\u0442\u0440\u0430\u043B\u0438\u044F \u2013 \u0438\u0437\u0442\u043E\u0447\u043D\u043E \u043B\u044F\u0442\u043D\u043E \u0447\u0430\u0441\u043E\u0432\u043E \u0432\u0440\u0435\u043C\u0435", "+11:00" },
{ "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
{ "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"+1000", "+10:00" },
- { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", GMT_BG+"+1000", "+10:00" },
+ { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", GMT_BG+"+10", "+10:00" },
{ "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\u0410\u0432\u0441\u0442\u0440\u0430\u043B\u0438\u044F \u2013 \u0438\u0437\u0442\u043E\u0447\u043D\u043E \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u043E \u0432\u0440\u0435\u043C\u0435", "+10:00" },
{ "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\u0421\u0438\u0434\u043D\u0438 \u0432\u0440\u0435\u043C\u0435", "Australia/Sydney" },
{ "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\u0410\u0432\u0441\u0442\u0440\u0430\u043B\u0438\u044F \u2013 \u0438\u0437\u0442\u043E\u0447\u043D\u043E \u0432\u0440\u0435\u043C\u0435", "Australia/Sydney" },
{ "bg", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\u0427\u0430\u0441\u043E\u0432\u0430 \u0437\u043E\u043D\u0430 \u0413\u0440\u0438\u043D\u0443\u0438\u0447", "+0:00" },
{ "bg", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
{ "bg", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"+0100", "+1:00" },
- { "bg", "Europe/London", "2004-07-15T00:00:00Z", "z", GMT_BG+"+0100", "+1:00" },
+ { "bg", "Europe/London", "2004-07-15T00:00:00Z", "z", GMT_BG+"+1", "+1:00" },
{ "bg", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", GMT_BG+"+0100", "+1:00" },
{ "bg", "Europe/London", "2004-07-15T00:00:00Z", "v", "\u041e\u0431\u0435\u0434\u0438\u043d\u0435\u043d\u043e \u043a\u0440\u0430\u043b\u0441\u0442\u0432\u043e \u0432\u0440\u0435\u043C\u0435", "Europe/London" },
{ "bg", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\u041e\u0431\u0435\u0434\u0438\u043d\u0435\u043d\u043e \u043a\u0440\u0430\u043b\u0441\u0442\u0432\u043e \u0432\u0440\u0435\u043C\u0435", "Europe/London" },
{ "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"-0300", "-3:00" },
- { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", GMT_BG+"-0300", "-3:00" },
+ { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", GMT_BG+"-3", "-3:00" },
{ "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", GMT_BG+"-0300", "-3:00" },
{ "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"-0300", "-3:00" },
- { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", GMT_BG+"-0300", "-3:00" },
+ { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", GMT_BG+"-3", "-3:00" },
{ "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", GMT_BG+"-0300", "-3:00" },
- { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", GMT_BG+"-0300", "-3:00" },
+ { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", GMT_BG+"-3", "-3:00" },
{ "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", GMT_BG+"-0300", "-3:00" },
// JB#5150
{ "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
{ "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"+0530", "+5:30" },
- { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", GMT_BG+"+0530", "+5:30" },
+ { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", GMT_BG+"+530", "+5:30" },
{ "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\u0418\u043d\u0434\u0438\u0439\u0441\u043a\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u0432\u0440\u0435\u043c\u0435", "+5:30" },
{ "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
{ "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"+0530", "+5:30" },
- { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", GMT_BG+"+0530", "+05:30" },
+ { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", GMT_BG+"+530", "+05:30" },
{ "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\u0418\u043d\u0434\u0438\u0439\u0441\u043a\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u0432\u0440\u0435\u043c\u0435", "+5:30" },
{ "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "\u0418\u043D\u0434\u0438\u044F \u0432\u0440\u0435\u043C\u0435", "Asia/Calcutta" },
{ "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\u0418\u043d\u0434\u0438\u0439\u0441\u043a\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u0432\u0440\u0435\u043c\u0435", "Asia/Calcutta" },
{ "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
{ "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" },
- { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-08:00", "America/Los_Angeles" },
- { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "V", "GMT-08:00", "America/Los_Angeles" },
+ { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-8", "America/Los_Angeles" },
{ "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u6a19\u6e96\u6642", "America/Los_Angeles" },
{ "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
{ "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
- { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-07:00", "America/Los_Angeles" },
- { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "V", "GMT-07:00", "America/Los_Angeles" },
+ { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-7", "America/Los_Angeles" },
{ "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593", "America/Los_Angeles" },
// icu ja.txt has exemplar city for this time zone
{ "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\u30ED\u30B5\u30F3\u30BC\u30EB\u30B9\u6642\u9593", "America/Los_Angeles" },
{ "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6A19\u6E96\u6642", "-3:00" },
{ "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6A19\u6E96\u6642", "-3:00" },
// icu ja.txt does not have info for this time zone
{ "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u30D6\u30A8\u30CE\u30B9\u30A2\u30A4\u30EC\u30B9\u6642\u9593", "America/Buenos_Aires" },
{ "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6A19\u6E96\u6642", "-3:00" },
{ "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6A19\u6E96\u6642", "-3:00" },
// icu ja.txt does not have info for this time zone
{ "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u30D6\u30A8\u30CE\u30B9\u30A2\u30A4\u30EC\u30B9\u6642\u9593", "America/Buenos_Aires" },
{ "ja", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
{ "ja", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" },
- { "ja", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-05:00", "-5:00" },
+ { "ja", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00" },
{ "ja", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\u30AD\u30E5\u30FC\u30D0\u6A19\u6E96\u6642", "-5:00" },
{ "ja", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
{ "ja", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" },
- { "ja", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-04:00", "-4:00" },
+ { "ja", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00" },
{ "ja", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\u30AD\u30E5\u30FC\u30D0\u590F\u6642\u9593", "-4:00" },
{ "ja", "America/Havana", "2004-07-15T00:00:00Z", "v", "\u30ad\u30e5\u30fc\u30d0\u6642\u9593", "America/Havana" },
{ "ja", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\u30ad\u30e5\u30fc\u30d0\u6642\u9593", "America/Havana" },
{ "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
{ "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
- { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
+ { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
{ "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2\u6771\u90E8\u590F\u6642\u9593", "+11:00" },
{ "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
{ "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
- { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
+ { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
{ "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2\u6771\u90E8\u6A19\u6E96\u6642", "+10:00" },
// icu ja.txt does not have info for this time zone
{ "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\u30B7\u30C9\u30CB\u30FC\u6642\u9593", "Australia/Sydney" },
{ "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
{ "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
- { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
+ { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
{ "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2\u6771\u90E8\u590F\u6642\u9593", "+11:00" },
{ "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
{ "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
- { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
+ { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
{ "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2\u6771\u90E8\u6A19\u6E96\u6642", "+10:00" },
{ "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\u30B7\u30C9\u30CB\u30FC\u6642\u9593", "Australia/Sydney" },
{ "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2\u6771\u90E8\u6642\u9593", "Australia/Sydney" },
{ "ja", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
{ "ja", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00" },
{ "ja", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" },
- { "ja", "Europe/London", "2004-01-15T00:00:00Z", "V", "GMT", "+0:00" },
{ "ja", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642", "+0:00" },
{ "ja", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
{ "ja", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" },
- { "ja", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+01:00", "+1:00" },
- { "ja", "Europe/London", "2004-07-15T00:00:00Z", "V", "GMT+01:00", "+1:00" },
+ { "ja", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "+1:00" },
{ "ja", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "\u82f1\u56fd\u590f\u6642\u9593", "+1:00" },
{ "ja", "Europe/London", "2004-07-15T00:00:00Z", "v", "\u30a4\u30ae\u30ea\u30b9\u6642\u9593", "Europe/London" },
{ "ja", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\u30a4\u30ae\u30ea\u30b9\u6642\u9593", "Europe/London" },
{ "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
{ "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
- { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-03:00", "-3:00" },
+ { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" },
{ "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" },
// JB#5150
{ "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
{ "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
- { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+05:30", "+5:30" },
+ { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+5:30", "+5:30" },
{ "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\u30A4\u30F3\u30C9\u6642\u9593", "+5:30" },
{ "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
{ "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
- { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+05:30", "+05:30" },
+ { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+5:30", "+05:30" },
{ "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\u30A4\u30F3\u30C9\u6642\u9593", "+5:30" },
{ "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "\u30A4\u30F3\u30C9\u6642\u9593", "Asia/Calcutta" },
{ "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\u30A4\u30F3\u30C9\u6642\u9593", "Asia/Calcutta" },
{ "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
{ "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" },
- { "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-08:00", "-8:00" },
+ { "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-8", "-8:00" },
{ "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "GMT-08:00", "-8:00" },
{ "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
{ "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
- { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-07:00", "-7:00" },
+ { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-7", "-7:00" },
{ "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "GMT-07:00", "-7:00" },
{ "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "Los Angeles", "America/Los_Angeles" },
{ "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "Los Angeles", "America/Los_Angeles" },
{ "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
{ "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
{ "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Aires", "America/Buenos_Aires" },
{ "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Buenos Aires", "America/Buenos_Aires" },
{ "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
{ "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
{ "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Aires", "America/Buenos_Aires" },
{ "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Buenos Aires", "America/Buenos_Aires" },
{ "ti", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
{ "ti", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" },
- { "ti", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-05:00", "-5:00" },
+ { "ti", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00" },
{ "ti", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "GMT-05:00", "-5:00" },
{ "ti", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
{ "ti", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" },
- { "ti", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-04:00", "-4:00" },
+ { "ti", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00" },
{ "ti", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "GMT-04:00", "-4:00" },
{ "ti", "America/Havana", "2004-07-15T00:00:00Z", "v", "CU", "America/Havana" },
{ "ti", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "CU", "America/Havana" },
{ "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
{ "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
- { "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
+ { "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
{ "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "GMT+11:00", "+11:00" },
{ "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
{ "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
- { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
+ { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
{ "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "GMT+10:00", "+10:00" },
{ "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "Sydney", "Australia/Sydney" },
{ "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "Sydney", "Australia/Sydney" },
{ "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
{ "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
- { "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
+ { "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
{ "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "GMT+11:00", "+11:00" },
{ "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
{ "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
- { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
+ { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
{ "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "GMT+10:00", "+10:00" },
{ "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "Sydney", "Australia/Sydney" },
{ "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "Sydney", "Australia/Sydney" },
{ "ti", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "GMT", "+0:00" },
{ "ti", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
{ "ti", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" },
- { "ti", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+01:00", "+1:00" },
+ { "ti", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "+1:00" },
{ "ti", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "GMT+01:00", "+1:00" },
{ "ti", "Europe/London", "2004-07-15T00:00:00Z", "v", "GB", "Europe/London" },
{ "ti", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "GB", "Europe/London" },
{ "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
{ "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
{ "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
- { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
+ { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
{ "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
- { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-03:00", "-3:00" },
+ { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" },
{ "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" },
// JB#5150
{ "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
{ "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
- { "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+05:30", "+5:30" },
+ { "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+5:30", "+5:30" },
{ "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "GMT+05:30", "+5:30" },
{ "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
{ "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
- { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+05:30", "+05:30" },
+ { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+5:30", "+05:30" },
{ "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "GMT+05:30", "+5:30" },
{ "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "IN", "Asia/Calcutta" },
{ "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "IN", "Asia/Calcutta" },
{ "en_GB", "Europe/Paris", "2004-07-15T00:00:00Z", "z", "CEST", "+2:00"},
{ "en_HK", "Europe/Paris", "2004-01-15T00:00:00Z", "zzzz", "Central European Standard Time", "+1:00"},
{ "en_HK", "Europe/Paris", "2004-07-15T00:00:00Z", "zzzz", "Central European Summer Time", "+2:00"},
- { "en_HK", "Europe/Paris", "2004-01-15T00:00:00Z", "z", "GMT+01:00", "+1:00"},
- { "en_HK", "Europe/Paris", "2004-07-15T00:00:00Z", "z", "GMT+02:00", "+2:00"},
+ { "en_HK", "Europe/Paris", "2004-01-15T00:00:00Z", "z", "GMT+1", "+1:00"},
+ { "en_HK", "Europe/Paris", "2004-07-15T00:00:00Z", "z", "GMT+2", "+2:00"},
};
/**
* Verify that strings which contain incomplete specifications are parsed
"HH:mm:ss vvvv", "10:20:30 UT+10:00", "10:20:30 +1000",
"HH:mm:ss zzzz", "10:20:30 UTC", "10:20:30 +0000", // standalone "UTC"
"ZZZZ HH:mm:ss", "UT 10:20:30", "10:20:30 +0000",
- "V HH:mm:ss", "UT+0130 10:20:30", "10:20:30 +0130",
- "V HH:mm:ss", "UTC+0130 10:20:30", "10:20:30 +0130",
- "HH mm Z ss", "10 20 GMT-1100 30", "10:20:30 -1100",
+ "z HH:mm:ss", "UT+0130 10:20:30", "10:20:30 +0130",
+ "z HH:mm:ss", "UTC+0130 10:20:30", "10:20:30 +0130",
+ // Note: GMT-1100 no longer works because of the introduction of the short
+ // localized GMT support. Previous implementation support this level of
+ // leniency (no separator char in localized GMT format), but the new
+ // implementation handles GMT-11 as the legitimate short localized GMT format
+ // and stop at there. Otherwise, roundtrip would be broken.
+ //"HH mm Z ss", "10 20 GMT-1100 30", "10:20:30 -1100",
+ "HH mm Z ss", "10 20 GMT-11 30", "10:20:30 -1100",
"HH:mm:ssZZZZZ", "14:25:45Z", "14:25:45 +0000",
"HH:mm:ssZZZZZ", "15:00:00-08:00", "15:00:00 -0800",
};