2 *******************************************************************************
\r
3 * Copyright (C) 2001-2010, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
9 * Port From: ICU4C v1.8.1 : format : DateFormatTest
\r
10 * Source File: $ICU4CRoot/source/test/intltest/dtfmttst.cpp
\r
13 package com.ibm.icu.dev.test.format;
\r
15 import java.text.AttributedCharacterIterator;
\r
16 import java.text.CharacterIterator;
\r
17 import java.text.FieldPosition;
\r
18 import java.text.ParseException;
\r
19 import java.text.ParsePosition;
\r
20 import java.util.Date;
\r
21 import java.util.Iterator;
\r
22 import java.util.Locale;
\r
23 import java.util.Map;
\r
24 import java.util.ResourceBundle;
\r
25 import java.util.Set;
\r
27 import com.ibm.icu.impl.ICUResourceBundle;
\r
28 import com.ibm.icu.text.ChineseDateFormat;
\r
29 import com.ibm.icu.text.ChineseDateFormatSymbols;
\r
30 import com.ibm.icu.text.DateFormat;
\r
31 import com.ibm.icu.text.DateFormatSymbols;
\r
32 import com.ibm.icu.text.NumberFormat;
\r
33 import com.ibm.icu.text.SimpleDateFormat;
\r
34 import com.ibm.icu.text.ChineseDateFormat.Field;
\r
35 import com.ibm.icu.util.BuddhistCalendar;
\r
36 import com.ibm.icu.util.Calendar;
\r
37 import com.ibm.icu.util.ChineseCalendar;
\r
38 import com.ibm.icu.util.GregorianCalendar;
\r
39 import com.ibm.icu.util.HebrewCalendar;
\r
40 import com.ibm.icu.util.IslamicCalendar;
\r
41 import com.ibm.icu.util.JapaneseCalendar;
\r
42 import com.ibm.icu.util.TimeZone;
\r
43 import com.ibm.icu.util.ULocale;
\r
44 import com.ibm.icu.util.UResourceBundle;
\r
45 import com.ibm.icu.util.VersionInfo;
\r
47 public class DateFormatTest extends com.ibm.icu.dev.test.TestFmwk {
\r
49 public static void main(String[] args) throws Exception {
\r
50 new DateFormatTest().run(args);
\r
54 * Verify that patterns have the correct values and could produce the
\r
55 * the DateFormat instances that contain the correct localized patterns.
\r
57 public void TestPatterns() {
\r
58 final String[][] EXPECTED = {
\r
59 {DateFormat.MINUTE_SECOND, "ms", "en", "mm:ss"}, // (fixed expected result per ticket 6872<-6626)
\r
60 {DateFormat.HOUR24_MINUTE, "Hm", "en", "HH:mm"}, // (fixed expected result per ticket 6872<-6626)
\r
61 {DateFormat.HOUR24_MINUTE_SECOND, "Hms","en","HH:mm:ss"}, // (fixed expected result per ticket 6872<-6626)
\r
62 {DateFormat.HOUR_MINUTE, "hm","en","h:mm a"}, // (fixed expected result per ticket 6872<-7180)
\r
63 {DateFormat.HOUR_MINUTE_SECOND, "hms","en","h:mm:ss a"}, // (fixed expected result per ticket 6872<-7180)
\r
64 {DateFormat.DAY, "d","en","d"},
\r
65 {DateFormat.STANDALONE_MONTH, "LLLL","en","LLLL"},
\r
66 {DateFormat.ABBR_STANDALONE_MONTH, "LLL","en","LLL"},
\r
67 {DateFormat.YEAR, "y","en","y"},
\r
68 {DateFormat.MONTH_DAY, "MMMMd","en","MMMM d"},
\r
69 {DateFormat.ABBR_MONTH_DAY, "MMMd","en","MMM d"},
\r
70 {DateFormat.NUM_MONTH_DAY, "Md","en","M/d"},
\r
71 {DateFormat.MONTH_WEEKDAY_DAY, "MMMMEEEEd","en","EEEE, MMMM d"},
\r
72 {DateFormat.ABBR_MONTH_WEEKDAY_DAY, "MMMEd","en","E, MMM d"},
\r
73 {DateFormat.NUM_MONTH_WEEKDAY_DAY, "MEd","en","E, M/d"},
\r
74 {DateFormat.YEAR_MONTH, "yMMMM","en","MMMM y"},
\r
75 {DateFormat.YEAR_ABBR_MONTH, "yMMM","en","MMM y"},
\r
76 {DateFormat.YEAR_NUM_MONTH, "yM","en","M/y"},
\r
77 {DateFormat.YEAR_ABBR_MONTH_WEEKDAY_DAY, "yMMMEd", "en", "E, MMM d, y"},
\r
78 {DateFormat.YEAR_NUM_MONTH_WEEKDAY_DAY, "yMEd", "en", "EEE, M/d/y"},
\r
79 {DateFormat.YEAR_QUARTER, "yQQQ", "en", "QQQ y"},
\r
80 {DateFormat.YEAR_ABBR_QUARTER, "yQ", "en", "Q y"}
\r
83 for (int i = 0; i < EXPECTED.length; i++) {
\r
85 // Verify that patterns have the correct values
\r
86 String actualPattern = EXPECTED[i][0];
\r
87 String expectedPattern = EXPECTED[i][1];
\r
88 ULocale locale = new ULocale(EXPECTED[i][2], "", "");
\r
89 if (!actualPattern.equals(expectedPattern)) {
\r
90 errln("FAILURE! Expected pattern: " + expectedPattern +
\r
91 " but was: " + actualPattern);
\r
94 // Verify that DataFormat instances produced contain the correct
\r
95 // localized patterns
\r
96 DateFormat date1 = DateFormat.getPatternInstance(actualPattern,
\r
98 DateFormat date2 = DateFormat.getPatternInstance(Calendar.getInstance(locale),
\r
99 actualPattern, locale);
\r
101 String expectedLocalPattern = EXPECTED[i][3];
\r
102 String actualLocalPattern1 = ((SimpleDateFormat)date1).toLocalizedPattern();
\r
103 String actualLocalPattern2 = ((SimpleDateFormat)date2).toLocalizedPattern();
\r
104 if (!actualLocalPattern1.equals(expectedLocalPattern)) {
\r
105 errln("FAILURE! Expected local pattern: " + expectedLocalPattern
\r
106 + " but was: " + actualLocalPattern1);
\r
108 if (!actualLocalPattern2.equals(expectedLocalPattern)) {
\r
109 errln("FAILURE! Expected local pattern: " + expectedLocalPattern
\r
110 + " but was: " + actualLocalPattern2);
\r
115 // Test written by Wally Wedel and emailed to me.
\r
116 public void TestWallyWedel() {
\r
118 * Instantiate a TimeZone so we can get the ids.
\r
120 //TimeZone tz = new SimpleTimeZone(7, ""); //The variable is never used
\r
122 * Computational variables.
\r
124 int offset, hours, minutes, seconds;
\r
126 * Instantiate a SimpleDateFormat set up to produce a full time
\r
129 SimpleDateFormat sdf = new SimpleDateFormat("zzzz");
\r
131 * A String array for the time zone ids.
\r
134 final String[] ids = TimeZone.getAvailableIDs();
\r
135 int ids_length = ids.length; //when fixed the bug should comment it out
\r
138 * How many ids do we have?
\r
140 logln("Time Zone IDs size:" + ids_length);
\r
142 * Column headings (sort of)
\r
144 logln("Ordinal ID offset(h:m) name");
\r
146 * Loop through the tzs.
\r
148 Date today = new Date();
\r
149 Calendar cal = Calendar.getInstance();
\r
150 for (int i = 0; i < ids_length; i++) {
\r
151 logln(i + " " + ids[i]);
\r
152 TimeZone ttz = TimeZone.getTimeZone(ids[i]);
\r
153 // offset = ttz.getRawOffset();
\r
154 cal.setTimeZone(ttz);
\r
155 cal.setTime(today);
\r
156 offset = cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET);
\r
157 // logln(i + " " + ids[i] + " offset " + offset);
\r
163 hours = offset / 3600000;
\r
164 minutes = (offset % 3600000) / 60000;
\r
165 seconds = (offset % 60000) / 1000;
\r
166 String dstOffset = sign + (hours < 10 ? "0" : "") + hours
\r
167 + ":" + (minutes < 10 ? "0" : "") + minutes;
\r
168 if (seconds != 0) {
\r
169 dstOffset += ":" + (seconds < 10 ? "0" : "") + seconds;
\r
172 * Instantiate a date so we can display the time zone name.
\r
174 sdf.setTimeZone(ttz);
\r
176 * Format the output.
\r
178 StringBuffer fmtOffset = new StringBuffer("");
\r
179 FieldPosition pos = new FieldPosition(0);
\r
182 fmtOffset = sdf.format(today, fmtOffset, pos);
\r
183 } catch (Exception e) {
\r
184 logln("Exception:" + e);
\r
187 // UnicodeString fmtOffset = tzS.toString();
\r
188 String fmtDstOffset = null;
\r
189 if (fmtOffset.toString().startsWith("GMT")) {
\r
190 //fmtDstOffset = fmtOffset.substring(3);
\r
191 fmtDstOffset = fmtOffset.substring(3, fmtOffset.length());
\r
197 boolean ok = fmtDstOffset == null || fmtDstOffset.equals("") || fmtDstOffset.equals(dstOffset);
\r
199 logln(i + " " + ids[i] + " " + dstOffset + " "
\r
200 + fmtOffset + (fmtDstOffset != null ? " ok" : " ?"));
\r
202 errln(i + " " + ids[i] + " " + dstOffset + " " + fmtOffset + " *** FAIL ***");
\r
208 public void TestEquals() {
\r
209 DateFormat fmtA = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.FULL);
\r
210 DateFormat fmtB = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.FULL);
\r
211 if (!fmtA.equals(fmtB))
\r
216 * Test the parsing of 2-digit years.
\r
218 public void TestTwoDigitYearDSTParse() {
\r
220 SimpleDateFormat fullFmt = new SimpleDateFormat("EEE MMM dd HH:mm:ss.SSS zzz yyyy G");
\r
221 SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yy h:mm:ss 'o''clock' a z", Locale.ENGLISH);
\r
222 String s = "03-Apr-04 2:20:47 o'clock AM PST";
\r
225 * SimpleDateFormat(pattern, locale) Construct a SimpleDateDateFormat using
\r
226 * the given pattern, the locale and using the TimeZone.getDefault();
\r
227 * So it need to add the timezone offset on hour field.
\r
228 * ps. the Method Calendar.getTime() used by SimpleDateFormat.parse() always
\r
229 * return Date value with TimeZone.getDefault() [Richard/GCL]
\r
232 TimeZone defaultTZ = TimeZone.getDefault();
\r
233 TimeZone PST = TimeZone.getTimeZone("PST");
\r
234 int defaultOffset = defaultTZ.getRawOffset();
\r
235 int PSTOffset = PST.getRawOffset();
\r
236 int hour = 2 + (defaultOffset - PSTOffset) / (60*60*1000);
\r
237 // hour is the expected hour of day, in units of seconds
\r
238 hour = ((hour < 0) ? hour + 24 : hour) * 60*60;
\r
240 Date d = fmt.parse(s);
\r
241 Calendar cal = Calendar.getInstance();
\r
244 hour += defaultTZ.inDaylightTime(d) ? 1 : 0;
\r
246 logln(s + " P> " + ((DateFormat) fullFmt).format(d));
\r
247 // hr is the actual hour of day, in units of seconds
\r
249 int hr = cal.get(Calendar.HOUR_OF_DAY) * 60*60 -
\r
250 cal.get(Calendar.DST_OFFSET) / 1000;
\r
252 errln("FAIL: Hour (-DST) = " + hr / (60*60.0)+
\r
253 "; expected " + hour / (60*60.0));
\r
254 } catch (ParseException e) {
\r
255 errln("Parse Error:" + e.getMessage());
\r
261 * Verify that returned field position indices are correct.
\r
263 public void TestFieldPosition() {
\r
265 StringBuffer buf = new StringBuffer();
\r
268 if (VersionInfo.ICU_VERSION.compareTo(VersionInfo.getInstance(3, 7)) >= 0) {
\r
269 DateFormatSymbols rootSyms = new DateFormatSymbols(new Locale("", "", ""));
\r
270 assertEquals("patternChars", PATTERN_CHARS, rootSyms.getLocalPatternChars());
\r
273 assertTrue("DATEFORMAT_FIELD_NAMES", DATEFORMAT_FIELD_NAMES.length == DateFormat.FIELD_COUNT);
\r
274 if(DateFormat.FIELD_COUNT != PATTERN_CHARS.length()){
\r
275 errln("Did not get the correct value for DateFormat.FIELD_COUNT. Expected: "+ PATTERN_CHARS.length());
\r
278 // Create test formatters
\r
279 final int COUNT = 4;
\r
280 DateFormat[] dateFormats = new DateFormat[COUNT];
\r
281 dateFormats[0] = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.US);
\r
282 dateFormats[1] = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.FRANCE);
\r
283 // Make the pattern "G y M d..."
\r
284 buf.append(PATTERN_CHARS);
\r
285 for (j=buf.length()-1; j>=0; --j) buf.insert(j, ' ');
\r
286 dateFormats[2] = new SimpleDateFormat(buf.toString(), Locale.US);
\r
287 // Make the pattern "GGGG yyyy MMMM dddd..."
\r
288 for (j=buf.length()-1; j>=0; j-=2) {
\r
289 for (i=0; i<3; ++i) {
\r
290 buf.insert(j, buf.charAt(j));
\r
293 dateFormats[3] = new SimpleDateFormat(buf.toString(), Locale.US);
\r
295 Date aug13 = new Date((long) 871508052513.0);
\r
297 // Expected output field values for above DateFormats on aug13
\r
298 // Fields are given in order of DateFormat field number
\r
299 final String EXPECTED[] = {
\r
300 "", "1997", "August", "13", "", "", "34", "12", "",
\r
301 "Wednesday", "", "", "", "", "PM", "2", "", "Pacific Daylight Time", "", "", "", "", "", "", "","","","","","",
\r
303 "", "1997", "ao\u00FBt", "13", "", "14", "34", "12", "",
\r
304 "mercredi", "", "", "", "", "", "", "", "heure avanc\u00E9e du Pacifique", "", "", "", "", "", "", "","","","","","",
\r
306 "AD", "1997", "8", "13", "14", "14", "34", "12", "5",
\r
307 "Wed", "225", "2", "33", "2", "PM", "2", "2", "PDT", "1997", "4", "1997", "2450674", "52452513", "-0700", "PT","4","8","3","3","PDT",
\r
309 "Anno Domini", "1997", "August", "0013", "0014", "0014", "0034", "0012", "5130",
\r
310 "Wednesday", "0225", "0002", "0033", "0002", "PM", "0002", "0002", "Pacific Daylight Time", "1997",
\r
311 "Wednesday", "1997", "2450674", "52452513", "GMT-07:00", "Pacific Time","Wednesday","August", "3rd quarter", "3rd quarter","United States (Los Angeles)",
\r
314 assertTrue("data size", EXPECTED.length == COUNT * DateFormat.FIELD_COUNT);
\r
316 final DateFormat.Field[] DTFMT_FIELDS = {
\r
317 DateFormat.Field.AM_PM,
\r
318 DateFormat.Field.DAY_OF_MONTH,
\r
319 DateFormat.Field.DAY_OF_WEEK,
\r
320 DateFormat.Field.DAY_OF_WEEK_IN_MONTH,
\r
321 DateFormat.Field.DAY_OF_YEAR,
\r
323 DateFormat.Field.DOW_LOCAL,
\r
324 DateFormat.Field.ERA,
\r
325 DateFormat.Field.EXTENDED_YEAR,
\r
326 DateFormat.Field.HOUR_OF_DAY0,
\r
327 DateFormat.Field.HOUR_OF_DAY1,
\r
329 DateFormat.Field.HOUR0,
\r
330 DateFormat.Field.HOUR1,
\r
331 DateFormat.Field.JULIAN_DAY,
\r
332 DateFormat.Field.MILLISECOND,
\r
333 DateFormat.Field.MILLISECONDS_IN_DAY,
\r
335 DateFormat.Field.MINUTE,
\r
336 DateFormat.Field.MONTH,
\r
337 DateFormat.Field.QUARTER,
\r
338 DateFormat.Field.SECOND,
\r
339 DateFormat.Field.TIME_ZONE,
\r
341 DateFormat.Field.WEEK_OF_MONTH,
\r
342 DateFormat.Field.WEEK_OF_YEAR,
\r
343 DateFormat.Field.YEAR,
\r
344 DateFormat.Field.YEAR_WOY,
\r
347 final String[][] EXPECTED_BY_FIELD = {
\r
348 {"PM", "13", "Wednesday", "", "",
\r
349 "", "", "", "", "",
\r
350 "", "2", "", "", "",
\r
351 "34", "August", "", "12", "Pacific Daylight Time",
\r
352 "", "", "1997", ""},
\r
354 {"", "13", "mercredi", "", "",
\r
355 "", "", "", "14", "",
\r
356 "", "", "", "", "",
\r
357 "34", "ao\u00FBt", "", "12", "heure avanc\u00E9e du Pacifique",
\r
358 "", "", "1997", ""},
\r
360 {"PM", "13", "Wed", "2", "225",
\r
361 "4", "AD", "1997", "14", "14",
\r
362 "2", "2", "2450674", "5", "52452513",
\r
363 "34", "8", "3", "12", "PDT",
\r
364 "2", "33", "1997", "1997"},
\r
366 {"PM", "0013", "Wednesday", "0002", "0225",
\r
367 "Wednesday", "Anno Domini", "1997", "0014", "0014",
\r
368 "0002", "0002", "2450674", "5130", "52452513",
\r
369 "0034", "August", "3rd quarter", "0012", "Pacific Daylight Time",
\r
370 "0002", "0033", "1997", "1997"},
\r
373 TimeZone PT = TimeZone.getTimeZone("America/Los_Angeles");
\r
374 for (j = 0, exp = 0; j < COUNT; ++j) {
\r
376 DateFormat df = dateFormats[j];
\r
377 df.setTimeZone(PT);
\r
378 logln(" Pattern = " + ((SimpleDateFormat) df).toPattern());
\r
380 logln(" Result = " + df.format(aug13));
\r
381 } catch (Exception e) {
\r
382 errln("FAIL: " + e);
\r
383 e.printStackTrace();
\r
390 for (i = 0; i < DateFormat.FIELD_COUNT; ++i, ++exp) {
\r
391 pos = new FieldPosition(i);
\r
393 df.format(aug13, buf, pos);
\r
394 field = buf.substring(pos.getBeginIndex(), pos.getEndIndex());
\r
395 assertEquals("pattern#" + j + " field #" + i + " " + DATEFORMAT_FIELD_NAMES[i],
\r
396 EXPECTED[exp], field);
\r
399 // FieldPostion initialized by DateFormat.Field trac#6089
\r
400 for(i = 0; i < DTFMT_FIELDS.length; i++) {
\r
401 // The format method only set position for the first occurrence of
\r
402 // the specified field.
\r
403 pos = new FieldPosition(DTFMT_FIELDS[i]);
\r
405 df.format(aug13, buf, pos);
\r
406 field = buf.substring(pos.getBeginIndex(), pos.getEndIndex());
\r
407 assertEquals("pattern#" + j + " " + DTFMT_FIELDS[i].toString(), EXPECTED_BY_FIELD[j][i], field);
\r
412 * This MUST be kept in sync with DateFormatSymbols.patternChars.
\r
414 static final String PATTERN_CHARS = "GyMdkHmsSEDFwWahKzYeugAZvcLQqV";
\r
417 * A list of the DateFormat.Field.
\r
418 * This MUST be kept in sync with PATTERN_CHARS above.
\r
420 static final DateFormat.Field[] DATEFORMAT_FIELDS = {
\r
421 DateFormat.Field.ERA, // G
\r
422 DateFormat.Field.YEAR, // y
\r
423 DateFormat.Field.MONTH, // M
\r
424 DateFormat.Field.DAY_OF_MONTH, // d
\r
425 DateFormat.Field.HOUR_OF_DAY1, // k
\r
426 DateFormat.Field.HOUR_OF_DAY0, // H
\r
427 DateFormat.Field.MINUTE, // m
\r
428 DateFormat.Field.SECOND, // s
\r
429 DateFormat.Field.MILLISECOND, // S
\r
430 DateFormat.Field.DAY_OF_WEEK, // E
\r
431 DateFormat.Field.DAY_OF_YEAR, // D
\r
432 DateFormat.Field.DAY_OF_WEEK_IN_MONTH, // F
\r
433 DateFormat.Field.WEEK_OF_YEAR, // w
\r
434 DateFormat.Field.WEEK_OF_MONTH, // W
\r
435 DateFormat.Field.AM_PM, // a
\r
436 DateFormat.Field.HOUR1, // h
\r
437 DateFormat.Field.HOUR0, // K
\r
438 DateFormat.Field.TIME_ZONE, // z
\r
439 DateFormat.Field.YEAR_WOY, // Y
\r
440 DateFormat.Field.DOW_LOCAL, // e
\r
441 DateFormat.Field.EXTENDED_YEAR, // u
\r
442 DateFormat.Field.JULIAN_DAY, // g
\r
443 DateFormat.Field.MILLISECONDS_IN_DAY, // A
\r
444 DateFormat.Field.TIME_ZONE, // Z
\r
445 DateFormat.Field.TIME_ZONE, // v
\r
446 DateFormat.Field.DAY_OF_WEEK, // c
\r
447 DateFormat.Field.MONTH, // L
\r
448 DateFormat.Field.QUARTER, // Q
\r
449 DateFormat.Field.QUARTER, // q
\r
450 DateFormat.Field.TIME_ZONE, // V
\r
454 * A list of the names of all the fields in DateFormat.
\r
455 * This MUST be kept in sync with DateFormat.
\r
457 static final String DATEFORMAT_FIELD_NAMES[] = {
\r
462 "HOUR_OF_DAY1_FIELD",
\r
463 "HOUR_OF_DAY0_FIELD",
\r
466 "MILLISECOND_FIELD",
\r
467 "DAY_OF_WEEK_FIELD",
\r
468 "DAY_OF_YEAR_FIELD",
\r
469 "DAY_OF_WEEK_IN_MONTH_FIELD",
\r
470 "WEEK_OF_YEAR_FIELD",
\r
471 "WEEK_OF_MONTH_FIELD",
\r
478 "EXTENDED_YEAR_FIELD",
\r
479 "JULIAN_DAY_FIELD",
\r
480 "MILLISECONDS_IN_DAY_FIELD",
\r
481 "TIMEZONE_RFC_FIELD",
\r
482 "GENERIC_TIMEZONE_FIELD",
\r
483 "STAND_ALONE_DAY_FIELD",
\r
484 "STAND_ALONE_MONTH_FIELD",
\r
486 "STAND_ALONE_QUARTER_FIELD",
\r
487 "TIMEZONE_SPECIAL_FIELD",
\r
491 * General parse/format tests. Add test cases as needed.
\r
493 public void TestGeneral() {
\r
496 "yyyy MM dd HH:mm:ss.SSS",
\r
498 // Milliseconds are left-justified, since they format as fractions of a second
\r
499 // Both format and parse should round HALF_UP
\r
500 "y/M/d H:mm:ss.S", "fp", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.6", "2004 03 10 16:36:31.600",
\r
501 "y/M/d H:mm:ss.SS", "fp", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.57", "2004 03 10 16:36:31.570",
\r
502 "y/M/d H:mm:ss.SSS", "F", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.567",
\r
503 "y/M/d H:mm:ss.SSSS", "pf", "2004/3/10 16:36:31.5679", "2004 03 10 16:36:31.568", "2004/3/10 16:36:31.5680",
\r
505 expect(DATA, new Locale("en", "", ""));
\r
508 public void TestGenericTime() {
\r
511 // any zone pattern should parse any zone
\r
512 Locale en = new Locale("en", "", "");
\r
514 "yyyy MM dd HH:mm zzz",
\r
516 "y/M/d H:mm zzzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Standard Time",
\r
517 "y/M/d H:mm zzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PST",
\r
518 "y/M/d H:mm vvvv", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Time",
\r
519 "y/M/d H:mm v", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PT",
\r
520 // non-generic timezone string influences dst offset even if wrong for date/time
\r
521 "y/M/d H:mm zzz", "pf", "2004/1/1 1:00 PDT", "2004 01 01 01:00 PDT", "2004/1/1 0:00 PST",
\r
522 "y/M/d H:mm vvvv", "pf", "2004/1/1 1:00 PDT", "2004 01 01 01:00 PDT", "2004/1/1 0:00 Pacific Time",
\r
523 "y/M/d H:mm zzz", "pf", "2004/7/1 1:00 PST", "2004 07 01 02:00 PDT", "2004/7/1 2:00 PDT",
\r
524 "y/M/d H:mm vvvv", "pf", "2004/7/1 1:00 PST", "2004 07 01 02:00 PDT", "2004/7/1 2:00 Pacific Time",
\r
525 // generic timezone generates dst offset appropriate for local time
\r
526 "y/M/d H:mm zzz", "pf", "2004/1/1 1:00 PT", "2004 01 01 01:00 PST", "2004/1/1 1:00 PST",
\r
527 "y/M/d H:mm vvvv", "pf", "2004/1/1 1:00 PT", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Time",
\r
528 "y/M/d H:mm zzz", "pf", "2004/7/1 1:00 PT", "2004 07 01 01:00 PDT", "2004/7/1 1:00 PDT",
\r
529 "y/M/d H:mm vvvv", "pf", "2004/7/1 1:00 PT", "2004 07 01 01:00 PDT", "2004/7/1 1:00 Pacific Time",
\r
530 // daylight savings time transition edge cases.
\r
531 // time to parse does not really exist, PT interpreted as earlier time
\r
532 "y/M/d H:mm zzz", "pf", "2005/4/3 2:30 PT", "2005 04 03 03:30 PDT", "2005/4/3 3:30 PDT",
\r
533 "y/M/d H:mm zzz", "pf", "2005/4/3 2:30 PST", "2005 04 03 03:30 PDT", "2005/4/3 3:30 PDT",
\r
534 "y/M/d H:mm zzz", "pf", "2005/4/3 2:30 PDT", "2005 04 03 01:30 PST", "2005/4/3 1:30 PST",
\r
535 "y/M/d H:mm v", "pf", "2005/4/3 2:30 PT", "2005 04 03 03:30 PDT", "2005/4/3 3:30 PT",
\r
536 "y/M/d H:mm v", "pf", "2005/4/3 2:30 PST", "2005 04 03 03:30 PDT", "2005/4/3 3:30 PT",
\r
537 "y/M/d H:mm v", "pf", "2005/4/3 2:30 PDT", "2005 04 03 01:30 PST", "2005/4/3 1:30 PT",
\r
538 "y/M/d H:mm", "pf", "2005/4/3 2:30", "2005 04 03 03:30 PDT", "2005/4/3 3:30",
\r
539 // time to parse is ambiguous, PT interpreted as later time
\r
540 "y/M/d H:mm zzz", "pf", "2005/10/30 1:30 PT", "2005 10 30 01:30 PST", "2005/10/30 1:30 PST",
\r
541 "y/M/d H:mm v", "pf", "2005/10/30 1:30 PT", "2005 10 30 01:30 PST", "2005/10/30 1:30 PT",
\r
542 "y/M/d H:mm", "pf", "2005/10/30 1:30 PT", "2005 10 30 01:30 PST", "2005/10/30 1:30",
\r
544 "y/M/d H:mm zzz", "pf", "2004/10/31 1:30 PT", "2004 10 31 01:30 PST", "2004/10/31 1:30 PST",
\r
545 "y/M/d H:mm zzz", "pf", "2004/10/31 1:30 PST", "2004 10 31 01:30 PST", "2004/10/31 1:30 PST",
\r
546 "y/M/d H:mm zzz", "pf", "2004/10/31 1:30 PDT", "2004 10 31 01:30 PDT", "2004/10/31 1:30 PDT",
\r
547 "y/M/d H:mm v", "pf", "2004/10/31 1:30 PT", "2004 10 31 01:30 PST", "2004/10/31 1:30 PT",
\r
548 "y/M/d H:mm v", "pf", "2004/10/31 1:30 PST", "2004 10 31 01:30 PST", "2004/10/31 1:30 PT",
\r
549 "y/M/d H:mm v", "pf", "2004/10/31 1:30 PDT", "2004 10 31 01:30 PDT", "2004/10/31 1:30 PT",
\r
550 "y/M/d H:mm", "pf", "2004/10/31 1:30", "2004 10 31 01:30 PST", "2004/10/31 1:30",
\r
551 // Below is actually an invalid test case. See the note in #5910. Disable the case for now.
\r
552 // TODO: Revisit after 3.8
\r
553 //"y/M/d H:mm vvvv", "pf", "2004/10/31 1:30 Argentina Time", "2004 10 30 21:30 PDT", "2004/10/31 1:30 Argentina Time",
\r
557 logln("cross format/parse tests");
\r
558 final String basepat = "yy/MM/dd H:mm ";
\r
559 final SimpleDateFormat[] formats = {
\r
560 new SimpleDateFormat(basepat + "v", en),
\r
561 new SimpleDateFormat(basepat + "vvvv", en),
\r
562 new SimpleDateFormat(basepat + "zzz", en),
\r
563 new SimpleDateFormat(basepat + "zzzz", en)
\r
566 final SimpleDateFormat univ = new SimpleDateFormat("yyyy MM dd HH:mm zzz", en);
\r
567 final String[] times = { "2004 01 02 03:04 PST", "2004 07 08 09:10 PDT" };
\r
568 for (int i = 0; i < times.length; ++i) {
\r
570 Date d = univ.parse(times[i]);
\r
571 logln("time: " + d);
\r
572 for (int j = 0; j < formats.length; ++j) {
\r
573 String test = formats[j].format(d);
\r
574 logln("test: '" + test + "'");
\r
575 for (int k = 0; k < formats.length; ++k) {
\r
577 Date t = formats[k].parse(test);
\r
578 if (!d.equals(t)) {
\r
579 errln("format " + k +
\r
580 " incorrectly parsed output of format " + j +
\r
581 " (" + test + "), returned " +
\r
582 t + " instead of " + d);
\r
584 logln("format " + k + " parsed ok");
\r
587 catch (ParseException e) {
\r
588 errln("format " + k +
\r
589 " could not parse output of format " + j +
\r
590 " (" + test + ")");
\r
595 catch (ParseException e) {
\r
596 errln("univ could not parse: " + times[i]);
\r
602 public void TestGenericTimeZoneOrder() {
\r
603 // generic times should parse the same no matter what the placement of the time zone string
\r
604 // should work for standard and daylight times
\r
607 "yyyy MM dd HH:mm zzz",
\r
608 // standard time, explicit daylight/standard
\r
609 "y/M/d H:mm zzz", "pf", "2004/1/1 1:00 PT", "2004 01 01 01:00 PST", "2004/1/1 1:00 PST",
\r
610 "y/M/d zzz H:mm", "pf", "2004/1/1 PT 1:00", "2004 01 01 01:00 PST", "2004/1/1 PST 1:00",
\r
611 "zzz y/M/d H:mm", "pf", "PT 2004/1/1 1:00", "2004 01 01 01:00 PST", "PST 2004/1/1 1:00",
\r
613 // standard time, generic
\r
614 "y/M/d H:mm vvvv", "pf", "2004/1/1 1:00 PT", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Time",
\r
615 "y/M/d vvvv H:mm", "pf", "2004/1/1 PT 1:00", "2004 01 01 01:00 PST", "2004/1/1 Pacific Time 1:00",
\r
616 "vvvv y/M/d H:mm", "pf", "PT 2004/1/1 1:00", "2004 01 01 01:00 PST", "Pacific Time 2004/1/1 1:00",
\r
618 // daylight time, explicit daylight/standard
\r
619 "y/M/d H:mm zzz", "pf", "2004/7/1 1:00 PT", "2004 07 01 01:00 PDT", "2004/7/1 1:00 PDT",
\r
620 "y/M/d zzz H:mm", "pf", "2004/7/1 PT 1:00", "2004 07 01 01:00 PDT", "2004/7/1 PDT 1:00",
\r
621 "zzz y/M/d H:mm", "pf", "PT 2004/7/1 1:00", "2004 07 01 01:00 PDT", "PDT 2004/7/1 1:00",
\r
623 // daylight time, generic
\r
624 "y/M/d H:mm vvvv", "pf", "2004/7/1 1:00 PT", "2004 07 01 01:00 PDT", "2004/7/1 1:00 Pacific Time",
\r
625 "y/M/d vvvv H:mm", "pf", "2004/7/1 PT 1:00", "2004 07 01 01:00 PDT", "2004/7/1 Pacific Time 1:00",
\r
626 "vvvv y/M/d H:mm", "pf", "PT 2004/7/1 1:00", "2004 07 01 01:00 PDT", "Pacific Time 2004/7/1 1:00",
\r
628 Locale en = new Locale("en", "", "");
\r
632 public void TestTimeZoneDisplayName() {
\r
633 Calendar cal = new GregorianCalendar();
\r
634 SimpleDateFormat testfmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
\r
636 for (int i = 0; i < fallbackTests.length; ++i) {
\r
637 String[] info = fallbackTests[i];
\r
638 logln(info[0] + ";" + info[1] + ";" + info[2] + ";" + info[3]);
\r
642 Date testd = testfmt.parse(info[2]);
\r
643 time = testd.getTime();
\r
644 } catch (ParseException pe) {
\r
645 errln("Failed to parse test date data");
\r
648 ULocale l = new ULocale(info[0]);
\r
649 TimeZone tz = TimeZone.getTimeZone(info[1]);
\r
650 SimpleDateFormat fmt = new SimpleDateFormat(info[3], l);
\r
651 cal.setTimeInMillis(time);
\r
652 cal.setTimeZone(tz);
\r
653 String result = fmt.format(cal);
\r
654 if (!result.equals(info[4])) {
\r
655 errln(info[0] + ";" + info[1] + ";" + info[2] + ";" + info[3] + " expected: '" +
\r
656 info[4] + "' but got: '" + result + "'");
\r
661 private static final String GMT_BG = "\u0413\u0440\u0438\u0438\u043D\u0443\u0438\u0447";
\r
662 private static final String GMT_ZH = "\u683C\u6797\u5C3C\u6CBB\u6807\u51C6\u65F6\u95F4";
\r
663 //private static final String GMT_BG = "GMT";
\r
665 private static final String[][] fallbackTests = {
\r
666 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
\r
667 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" },
\r
668 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "PST", "America/Los_Angeles" },
\r
669 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "V", "PST", "America/Los_Angeles" },
\r
670 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "Pacific Standard Time", "America/Los_Angeles" },
\r
671 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
\r
672 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
\r
673 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "PDT", "America/Los_Angeles" },
\r
674 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "V", "PDT", "America/Los_Angeles" },
\r
675 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "Pacific Daylight Time", "America/Los_Angeles" },
\r
676 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "PT", "America/Los_Angeles" },
\r
677 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "Pacific Time", "America/Los_Angeles" },
\r
678 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "VVVV", "United States (Los Angeles)", "America/Los_Angeles" },
\r
679 { "en_GB", "America/Los_Angeles", "2004-01-15T12:00:00Z", "z", "PST", "America/Los_Angeles" },
\r
680 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "Z", "-0700", "-7:00" },
\r
681 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
\r
682 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "z", "MST", "America/Phoenix" },
\r
683 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "V", "MST", "America/Phoenix" },
\r
684 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "zzzz", "Mountain Standard Time", "America/Phoenix" },
\r
685 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
\r
686 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
\r
687 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "z", "MST", "America/Phoenix" },
\r
688 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "V", "MST", "America/Phoenix" },
\r
689 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "zzzz", "Mountain Standard Time", "America/Phoenix" },
\r
690 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "v", "MST", "America/Phoenix" },
\r
691 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "vvvv", "Mountain Standard Time", "America/Phoenix" },
\r
692 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "VVVV", "United States (Phoenix)", "America/Phoenix" },
\r
694 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
695 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
696 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
697 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "V", "ART", "-3:00" },
\r
698 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argentina Time", "-3:00" },
\r
699 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
700 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
701 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
702 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "V", "ART", "-3:00" },
\r
703 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argentina Time", "-3:00" },
\r
704 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Argentina (Buenos Aires)", "America/Buenos_Aires" },
\r
705 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentina Time", "America/Buenos_Aires" },
\r
706 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "VVVV", "Argentina (Buenos Aires)", "America/Buenos_Aires" },
\r
708 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
709 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
710 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
711 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "V", "ART", "-3:00" },
\r
712 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argentina Time", "-3:00" },
\r
713 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
714 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
715 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
716 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "V", "ART", "-3:00" },
\r
717 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argentina Time", "-3:00" },
\r
718 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Argentina (Buenos Aires)", "America/Buenos_Aires" },
\r
719 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentina Time", "America/Buenos_Aires" },
\r
720 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "VVVV", "Argentina (Buenos Aires)", "America/Buenos_Aires" },
\r
722 { "en", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
\r
723 { "en", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" },
\r
724 { "en", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-05:00", "-5:00" },
\r
725 { "en", "America/Havana", "2004-01-15T00:00:00Z", "V", "CST (Cuba)", "-5:00" },
\r
726 { "en", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "Cuba Standard Time", "-5:00" },
\r
727 { "en", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
\r
728 { "en", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" },
\r
729 { "en", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-04:00", "-4:00" },
\r
730 { "en", "America/Havana", "2004-07-15T00:00:00Z", "V", "CDT (Cuba)", "-4:00" },
\r
731 { "en", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "Cuba Daylight Time", "-4:00" },
\r
732 { "en", "America/Havana", "2004-07-15T00:00:00Z", "v", "Cuba Time", "America/Havana" },
\r
733 { "en", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "Cuba Time", "America/Havana" },
\r
734 { "en", "America/Havana", "2004-07-15T00:00:00Z", "VVVV", "Cuba Time", "America/Havana" },
\r
736 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
\r
737 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
\r
738 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
\r
739 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "V", "AEDT", "+11:00" },
\r
740 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "Australian Eastern Daylight Time", "+11:00" },
\r
741 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
\r
742 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
\r
743 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
\r
744 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "V", "AEST", "+10:00" },
\r
745 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "Australian Eastern Standard Time", "+10:00" },
\r
746 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "Australia (Sydney)", "Australia/Sydney" },
\r
747 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "Eastern Australia Time", "Australia/Sydney" },
\r
748 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "VVVV", "Australia (Sydney)", "Australia/Sydney" },
\r
750 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
\r
751 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
\r
752 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
\r
753 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "V", "AEDT", "+11:00" },
\r
754 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "Australian Eastern Daylight Time", "+11:00" },
\r
755 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
\r
756 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
\r
757 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
\r
758 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "V", "AEST", "+10:00" },
\r
759 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "Australian Eastern Standard Time", "+10:00" },
\r
760 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "Australia (Sydney)", "Australia/Sydney" },
\r
761 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "Eastern Australia Time", "Australia/Sydney" },
\r
762 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "VVVV", "Australia (Sydney)", "Australia/Sydney" },
\r
764 { "en", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
\r
765 { "en", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+00:00", "+0:00" },
\r
766 { "en", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" },
\r
767 { "en", "Europe/London", "2004-01-15T00:00:00Z", "V", "GMT", "+0:00" },
\r
768 { "en", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "Greenwich Mean Time", "+0:00" },
\r
769 { "en", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
\r
770 { "en", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" },
\r
771 { "en", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+01:00", "Europe/London" },
\r
772 { "en", "Europe/London", "2004-07-15T00:00:00Z", "V", "BST", "Europe/London" },
\r
773 { "en", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "British Summer Time", "Europe/London" },
\r
774 // icu en.txt has exemplar city for this time zone
\r
775 { "en", "Europe/London", "2004-07-15T00:00:00Z", "v", "United Kingdom Time", "Europe/London" },
\r
776 { "en", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "United Kingdom Time", "Europe/London" },
\r
777 { "en", "Europe/London", "2004-07-15T00:00:00Z", "VVVV", "United Kingdom Time", "Europe/London" },
\r
779 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
780 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
781 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
782 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
783 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
784 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
785 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
786 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
787 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-03:00", "-3:00" },
\r
788 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" },
\r
791 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
\r
792 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
\r
793 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+05:30", "+5:30" },
\r
794 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "V", "IST", "+5:30" },
\r
795 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "India Standard Time", "+5:30" },
\r
796 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
\r
797 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
\r
798 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+05:30", "+05:30" },
\r
799 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "V", "IST", "+05:30" },
\r
800 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "India Standard Time", "+5:30" },
\r
801 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "India Time", "Asia/Calcutta" },
\r
802 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "India Standard Time", "Asia/Calcutta" },
\r
806 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
\r
807 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" },
\r
808 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-08:00", "-8:00" },
\r
809 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "GMT-08:00", "-8:00" },
\r
810 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
\r
811 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
\r
812 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-07:00", "-7:00" },
\r
813 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "GMT-07:00", "-7:00" },
\r
814 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "Vereinigte Staaten (Los Angeles)", "America/Los_Angeles" },
\r
815 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "Vereinigte Staaten (Los Angeles)", "America/Los_Angeles" },
\r
817 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
818 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
819 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
820 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
821 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
822 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
823 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
824 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
825 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Argentinien (Buenos Aires)", "America/Buenos_Aires" },
\r
826 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentinien (Buenos Aires)", "America/Buenos_Aires" },
\r
828 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
829 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
830 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
831 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
832 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
833 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
834 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
835 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
836 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Argentinien (Buenos Aires)", "America/Buenos_Aires" },
\r
837 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentinien (Buenos Aires)", "America/Buenos_Aires" },
\r
839 { "de", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
\r
840 { "de", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" },
\r
841 { "de", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-05:00", "-5:00" },
\r
842 { "de", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "GMT-05:00", "-5:00" },
\r
843 { "de", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
\r
844 { "de", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" },
\r
845 { "de", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-04:00", "-4:00" },
\r
846 { "de", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "GMT-04:00", "-4:00" },
\r
847 { "de", "America/Havana", "2004-07-15T00:00:00Z", "v", "(Kuba)", "America/Havana" },
\r
848 { "de", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "(Kuba)", "America/Havana" },
\r
849 // added to test proper fallback of country name
\r
850 { "de_CH", "America/Havana", "2004-07-15T00:00:00Z", "v", "(Kuba)", "America/Havana" },
\r
851 { "de_CH", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "(Kuba)", "America/Havana" },
\r
853 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
\r
854 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
\r
855 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
\r
856 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "GMT+11:00", "+11:00" },
\r
857 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
\r
858 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
\r
859 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
\r
860 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "GMT+10:00", "+10:00" },
\r
861 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "Australien (Sydney)", "Australia/Sydney" },
\r
862 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "Australien (Sydney)", "Australia/Sydney" },
\r
864 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
\r
865 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
\r
866 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
\r
867 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "GMT+11:00", "+11:00" },
\r
868 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
\r
869 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
\r
870 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
\r
871 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "GMT+10:00", "+10:00" },
\r
872 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "Australien (Sydney)", "Australia/Sydney" },
\r
873 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "Australien (Sydney)", "Australia/Sydney" },
\r
875 { "de", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
\r
876 { "de", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+00:00", "+0:00" },
\r
877 { "de", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT+00:00", "+0:00" },
\r
878 { "de", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "GMT+00:00", "+0:00" },
\r
879 { "de", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
\r
880 { "de", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" },
\r
881 { "de", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+01:00", "+1:00" },
\r
882 { "de", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "GMT+01:00", "+1:00" },
\r
883 { "de", "Europe/London", "2004-07-15T00:00:00Z", "v", "(Vereinigtes K\u00f6nigreich)", "Europe/London" },
\r
884 { "de", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "(Vereinigtes K\u00f6nigreich)", "Europe/London" },
\r
886 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
887 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
888 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
889 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
890 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
891 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
892 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
893 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
894 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-03:00", "-3:00" },
\r
895 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" },
\r
898 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
\r
899 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
\r
900 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+05:30", "+5:30" },
\r
901 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "GMT+05:30", "+5:30" },
\r
902 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
\r
903 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
\r
904 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+05:30", "+05:30" },
\r
905 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "GMT+05:30", "+5:30" },
\r
906 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "(Indien)", "Asia/Calcutta" },
\r
907 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "(Indien)", "Asia/Calcutta" },
\r
911 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
\r
912 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0800", "-8:00" },
\r
913 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-0800", "America/Los_Angeles" },
\r
914 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\u592a\u5e73\u6d0b\u6807\u51c6\u65f6\u95f4", "America/Los_Angeles" },
\r
915 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
\r
916 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0700", "-7:00" },
\r
917 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-0700", "America/Los_Angeles" },
\r
918 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\u592a\u5e73\u6d0b\u590f\u4ee4\u65f6\u95f4", "America/Los_Angeles" },
\r
919 // icu zh.txt has exemplar city for this time zone
\r
920 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\u7f8e\u56fd (\u6d1b\u6749\u77f6)", "America/Los_Angeles" },
\r
921 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\u7f8e\u56fd\u592a\u5e73\u6d0b\u65f6\u95f4", "America/Los_Angeles" },
\r
923 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
924 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0300", "-3:00" },
\r
925 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-0300", "-3:00" },
\r
926 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\u963f\u6839\u5ef7\u6807\u51c6\u65f6\u95f4", "-3:00" },
\r
927 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
928 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0300", "-3:00" },
\r
929 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-0300", "-3:00" },
\r
930 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\u963f\u6839\u5ef7\u6807\u51c6\u65f6\u95f4", "-3:00" },
\r
931 // icu zh.txt does not have info for this time zone
\r
932 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u963f\u6839\u5ef7 (\u5e03\u5b9c\u8bfa\u65af\u827e\u5229\u65af)", "America/Buenos_Aires" },
\r
933 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\u963f\u6839\u5ef7\u6807\u51c6\u65f6\u95f4", "America/Buenos_Aires" },
\r
935 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
936 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0300", "-3:00" },
\r
937 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-0300", "-3:00" },
\r
938 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\u963f\u6839\u5ef7\u6807\u51c6\u65f6\u95f4", "-3:00" },
\r
939 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
940 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0300", "-3:00" },
\r
941 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-0300", "-3:00" },
\r
942 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\u963f\u6839\u5ef7\u6807\u51c6\u65f6\u95f4", "-3:00" },
\r
943 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u963f\u6839\u5ef7 (\u5e03\u5b9c\u8bfa\u65af\u827e\u5229\u65af)", "America/Buenos_Aires" },
\r
944 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\u963f\u6839\u5ef7\u6807\u51c6\u65f6\u95f4", "America/Buenos_Aires" },
\r
946 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
\r
947 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0500", "-5:00" },
\r
948 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-0500", "-5:00" },
\r
949 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\u53e4\u5df4\u6807\u51c6\u65f6\u95f4", "-5:00" },
\r
950 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
\r
951 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0400", "-4:00" },
\r
952 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-0400", "-4:00" },
\r
953 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\u53e4\u5df4\u590f\u4ee4\u65f6\u95f4", "-4:00" },
\r
954 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "v", "\u53e4\u5df4\u65f6\u95f4", "America/Havana" },
\r
955 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\u53e4\u5df4\u65f6\u95f4", "America/Havana" },
\r
957 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
\r
958 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"+1100", "+11:00" },
\r
959 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "z", GMT_ZH+"+1100", "+11:00" },
\r
960 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\u6fb3\u5927\u5229\u4e9a\u4e1c\u90e8\u590f\u4ee4\u65f6\u95f4", "+11:00" },
\r
961 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
\r
962 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"+1000", "+10:00" },
\r
963 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "z", GMT_ZH+"+1000", "+10:00" },
\r
964 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\u6fb3\u5927\u5229\u4e9a\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4", "+10:00" },
\r
965 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\u6fb3\u5927\u5229\u4e9a (\u6089\u5c3c)", "Australia/Sydney" },
\r
966 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\u6fb3\u5927\u5229\u4e9a\u4e1c\u90e8\u65f6\u95f4", "Australia/Sydney" },
\r
968 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
\r
969 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"+1100", "+11:00" },
\r
970 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", GMT_ZH+"+1100", "+11:00" },
\r
971 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\u6fb3\u5927\u5229\u4e9a\u4e1c\u90e8\u590f\u4ee4\u65f6\u95f4", "+11:00" },
\r
972 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
\r
973 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"+1000", "+10:00" },
\r
974 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", GMT_ZH+"+1000", "+10:00" },
\r
975 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\u6fb3\u5927\u5229\u4e9a\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4", "+10:00" },
\r
976 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\u6fb3\u5927\u5229\u4e9a (\u6089\u5c3c)", "Australia/Sydney" },
\r
977 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\u6fb3\u5927\u5229\u4e9a\u4e1c\u90e8\u65f6\u95f4", "Australia/Sydney" },
\r
979 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
\r
980 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"+0000", "+0:00" },
\r
981 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "z", GMT_ZH+"+0000", "+0:00" },
\r
982 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "V", "GMT", "+0:00" },
\r
983 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\u683C\u6797\u5C3C\u6CBB\u6807\u51C6\u65F6\u95F4", "+0:00" },
\r
984 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
\r
985 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"+0100", "+1:00" },
\r
986 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "z", GMT_ZH+"+0100", "+1:00" },
\r
987 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "V", "BST", "+1:00" },
\r
988 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", GMT_ZH+"+0100", "+1:00" },
\r
989 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "v", "\u82f1\u56fd\u65f6\u95f4", "Europe/London" },
\r
990 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\u82f1\u56fd\u65f6\u95f4", "Europe/London" },
\r
991 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "VVVV", "\u82f1\u56fd\u65f6\u95f4", "Europe/London" },
\r
993 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
994 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0300", "-3:00" },
\r
995 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", GMT_ZH+"-0300", "-3:00" },
\r
996 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", GMT_ZH+"-0300", "-3:00" },
\r
997 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
998 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"-0300", "-3:00" },
\r
999 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", GMT_ZH+"-0300", "-3:00" },
\r
1000 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", GMT_ZH+"-0300", "-3:00" },
\r
1001 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", GMT_ZH+"-0300", "-3:00" },
\r
1002 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", GMT_ZH+"-0300", "-3:00" },
\r
1005 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
\r
1006 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", GMT_ZH+"+0530", "+5:30" },
\r
1007 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", GMT_ZH+"+0530", "+5:30" },
\r
1008 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\u5370\u5ea6\u6807\u51c6\u65f6\u95f4", "+5:30" },
\r
1009 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
\r
1010 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", GMT_ZH+"+0530", "+5:30" },
\r
1011 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", GMT_ZH+"+0530", "+05:30" },
\r
1012 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\u5370\u5ea6\u6807\u51c6\u65f6\u95f4", "+5:30" },
\r
1013 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "\u5370\u5ea6\u65f6\u95f4", "Asia/Calcutta" },
\r
1014 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\u5370\u5EA6\u6807\u51c6\u65f6\u95f4", "Asia/Calcutta" },
\r
1018 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
\r
1019 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-\u0966\u096e:\u0966\u0966", "-8:00" },
\r
1020 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-\u0966\u096e:\u0966\u0966", "-8:00" },
\r
1021 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "GMT-\u0966\u096e:\u0966\u0966", "-8:00" },
\r
1022 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
\r
1023 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-\u0966\u096d:\u0966\u0966", "-7:00" },
\r
1024 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-\u0966\u096d:\u0966\u0966", "-7:00" },
\r
1025 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "GMT-\u0966\u096d:\u0966\u0966", "-7:00" },
\r
1026 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\u0938\u0902\u092f\u0941\u0915\u094d\u0924 \u0930\u093e\u091c\u094d\u092f \u0905\u092e\u0947\u0930\u093f\u0915\u093e (\u0932\u094b\u0938 \u090f\u0902\u091c\u093f\u0932\u0947\u0938)", "America/Los_Angeles" },
\r
1027 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\u0938\u0902\u092f\u0941\u0915\u094d\u0924 \u0930\u093e\u091c\u094d\u092f \u0905\u092e\u0947\u0930\u093f\u0915\u093e (\u0932\u094b\u0938 \u090f\u0902\u091c\u093f\u0932\u0947\u0938)", "America/Los_Angeles" },
\r
1029 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1030 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1031 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1032 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1033 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1034 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1035 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1036 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1037 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u0905\u0930\u094d\u091c\u0947\u0928\u094d\u091f\u0940\u0928\u093e (\u092c\u094d\u092f\u0942\u0928\u0938 \u0906\u092f\u0930\u0938)", "America/Buenos_Aires" },
\r
1038 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\u0905\u0930\u094d\u091c\u0947\u0928\u094d\u091f\u0940\u0928\u093e (\u092c\u094d\u092f\u0942\u0928\u0938 \u0906\u092f\u0930\u0938)", "America/Buenos_Aires" },
\r
1040 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1041 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1042 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1043 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1044 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1045 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1046 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1047 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1048 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u0905\u0930\u094d\u091c\u0947\u0928\u094d\u091f\u0940\u0928\u093e (\u092c\u094d\u092f\u0942\u0928\u0938 \u0906\u092f\u0930\u0938)", "America/Buenos_Aires" },
\r
1049 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\u0905\u0930\u094d\u091c\u0947\u0928\u094d\u091f\u0940\u0928\u093e (\u092c\u094d\u092f\u0942\u0928\u0938 \u0906\u092f\u0930\u0938)", "America/Buenos_Aires" },
\r
1051 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
\r
1052 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-\u0966\u096b:\u0966\u0966", "-5:00" },
\r
1053 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-\u0966\u096b:\u0966\u0966", "-5:00" },
\r
1054 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "GMT-\u0966\u096b:\u0966\u0966", "-5:00" },
\r
1055 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
\r
1056 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-\u0966\u096a:\u0966\u0966", "-4:00" },
\r
1057 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-\u0966\u096a:\u0966\u0966", "-4:00" },
\r
1058 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "GMT-\u0966\u096a:\u0966\u0966", "-4:00" },
\r
1059 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "v", "(\u0915\u094d\u092f\u0942\u092c\u093e)", "America/Havana" },
\r
1060 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "(\u0915\u094d\u092f\u0942\u092c\u093e)", "America/Havana" },
\r
1062 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
\r
1063 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+\u0967\u0967:\u0966\u0966", "+11:00" },
\r
1064 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+\u0967\u0967:\u0966\u0966", "+11:00" },
\r
1065 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "GMT+\u0967\u0967:\u0966\u0966", "+11:00" },
\r
1066 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
\r
1067 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+\u0967\u0966:\u0966\u0966", "+10:00" },
\r
1068 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+\u0967\u0966:\u0966\u0966", "+10:00" },
\r
1069 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "GMT+\u0967\u0966:\u0966\u0966", "+10:00" },
\r
1070 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\u0911\u0938\u094d\u091f\u094d\u0930\u0947\u0932\u093f\u092f\u093e (\u0938\u093f\u0921\u0928\u0940)", "Australia/Sydney" },
\r
1071 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\u0911\u0938\u094d\u091f\u094d\u0930\u0947\u0932\u093f\u092f\u093e (\u0938\u093f\u0921\u0928\u0940)", "Australia/Sydney" },
\r
1073 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
\r
1074 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+\u0967\u0967:\u0966\u0966", "+11:00" },
\r
1075 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+\u0967\u0967:\u0966\u0966", "+11:00" },
\r
1076 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "GMT+\u0967\u0967:\u0966\u0966", "+11:00" },
\r
1077 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
\r
1078 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+\u0967\u0966:\u0966\u0966", "+10:00" },
\r
1079 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+\u0967\u0966:\u0966\u0966", "+10:00" },
\r
1080 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "GMT+\u0967\u0966:\u0966\u0966", "+10:00" },
\r
1081 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\u0911\u0938\u094d\u091f\u094d\u0930\u0947\u0932\u093f\u092f\u093e (\u0938\u093f\u0921\u0928\u0940)", "Australia/Sydney" },
\r
1082 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\u0911\u0938\u094d\u091f\u094d\u0930\u0947\u0932\u093f\u092f\u093e (\u0938\u093f\u0921\u0928\u0940)", "Australia/Sydney" },
\r
1084 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
\r
1085 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+\u0966\u0966:\u0966\u0966", "+0:00" },
\r
1086 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT+\u0966\u0966:\u0966\u0966", "+0:00" },
\r
1087 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "GMT+\u0966\u0966:\u0966\u0966", "+0:00" },
\r
1088 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
\r
1089 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+\u0966\u0967:\u0966\u0966", "+1:00" },
\r
1090 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+\u0966\u0967:\u0966\u0966", "+1:00" },
\r
1091 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "GMT+\u0966\u0967:\u0966\u0966", "+1:00" },
\r
1092 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "v", "(\u092C\u094D\u0930\u093F\u0924\u0928)", "Europe/London" },
\r
1093 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "(\u092C\u094D\u0930\u093F\u0924\u0928)", "Europe/London" },
\r
1095 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1096 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1097 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1098 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1099 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1100 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1101 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1102 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1103 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1104 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-\u0966\u0969:\u0966\u0966", "-3:00" },
\r
1106 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
\r
1107 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+\u0966\u096B:\u0969\u0966", "+5:30" },
\r
1108 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "IST", "+5:30" },
\r
1109 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\u092D\u093E\u0930\u0924\u0940\u092F \u0938\u092E\u092F", "+5:30" },
\r
1110 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
\r
1111 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+\u0966\u096B:\u0969\u0966", "+5:30" },
\r
1112 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "IST", "+05:30" },
\r
1113 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\u092D\u093E\u0930\u0924\u0940\u092F \u0938\u092E\u092F", "+5:30" },
\r
1114 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "IST", "Asia/Calcutta" },
\r
1115 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\u092D\u093E\u0930\u0924\u0940\u092F \u0938\u092E\u092F", "Asia/Calcutta" },
\r
1119 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
\r
1120 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"-0800", "-8:00" },
\r
1121 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", GMT_BG+"-0800", "America/Los_Angeles" },
\r
1122 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "V", "PST", "America/Los_Angeles" },
\r
1123 { "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" },
\r
1124 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
\r
1125 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"-0700", "-7:00" },
\r
1126 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", GMT_BG+"-0700", "America/Los_Angeles" },
\r
1127 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "V", "PDT", "America/Los_Angeles" },
\r
1128 { "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" },
\r
1129 // icu bg.txt has exemplar city for this time zone
\r
1130 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\u0421\u0410\u0429 (\u041b\u043e\u0441 \u0410\u043d\u0436\u0435\u043b\u0438\u0441)", "America/Los_Angeles" },
\r
1131 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\u0421\u0410\u0429 (\u041b\u043e\u0441 \u0410\u043d\u0436\u0435\u043b\u0438\u0441)", "America/Los_Angeles" },
\r
1132 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "VVVV", "\u0421\u0410\u0429 (\u041b\u043e\u0441 \u0410\u043d\u0436\u0435\u043b\u0438\u0441)", "America/Los_Angeles" },
\r
1134 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1135 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"-0300", "-3:00" },
\r
1136 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", GMT_BG+"-0300", "-3:00" },
\r
1137 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", GMT_BG+"-0300", "-3:00" },
\r
1138 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1139 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"-0300", "-3:00" },
\r
1140 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", GMT_BG+"-0300", "-3:00" },
\r
1141 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", GMT_BG+"-0300", "-3:00" },
\r
1142 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u0410\u0440\u0436\u0435\u043d\u0442\u0438\u043d\u0430 (\u0411\u0443\u0435\u043D\u043E\u0441 \u0410\u0439\u0440\u0435\u0441)", "America/Buenos_Aires" },
\r
1143 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\u0410\u0440\u0436\u0435\u043d\u0442\u0438\u043d\u0430 (\u0411\u0443\u0435\u043D\u043E\u0441 \u0410\u0439\u0440\u0435\u0441)", "America/Buenos_Aires" },
\r
1145 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1146 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"-0300", "-3:00" },
\r
1147 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", GMT_BG+"-0300", "-3:00" },
\r
1148 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", GMT_BG+"-0300", "-3:00" },
\r
1149 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1150 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"-0300", "-3:00" },
\r
1151 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", GMT_BG+"-0300", "-3:00" },
\r
1152 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", GMT_BG+"-0300", "-3:00" },
\r
1153 // icu bg.txt does not have info for this time zone
\r
1154 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u0410\u0440\u0436\u0435\u043d\u0442\u0438\u043d\u0430 (\u0411\u0443\u0435\u043D\u043E\u0441 \u0410\u0439\u0440\u0435\u0441)", "America/Buenos_Aires" },
\r
1155 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\u0410\u0440\u0436\u0435\u043d\u0442\u0438\u043d\u0430 (\u0411\u0443\u0435\u043D\u043E\u0441 \u0410\u0439\u0440\u0435\u0441)", "America/Buenos_Aires" },
\r
1157 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
\r
1158 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"-0500", "-5:00" },
\r
1159 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "z", GMT_BG+"-0500", "-5:00" },
\r
1160 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", GMT_BG+"-0500", "-5:00" },
\r
1161 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
\r
1162 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"-0400", "-4:00" },
\r
1163 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "z", GMT_BG+"-0400", "-4:00" },
\r
1164 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", GMT_BG+"-0400", "-4:00" },
\r
1165 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "v", "(\u041a\u0443\u0431\u0430)", "America/Havana" },
\r
1166 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "(\u041a\u0443\u0431\u0430)", "America/Havana" },
\r
1168 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
\r
1169 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"+1100", "+11:00" },
\r
1170 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "z", GMT_BG+"+1100", "+11:00" },
\r
1171 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", GMT_BG+"+1100", "+11:00" },
\r
1172 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
\r
1173 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"+1000", "+10:00" },
\r
1174 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "z", GMT_BG+"+1000", "+10:00" },
\r
1175 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", GMT_BG+"+1000", "+10:00" },
\r
1176 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u044f (\u0421\u0438\u0434\u043D\u0438)", "Australia/Sydney" },
\r
1177 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u044f (\u0421\u0438\u0434\u043D\u0438)", "Australia/Sydney" },
\r
1179 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
\r
1180 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"+1100", "+11:00" },
\r
1181 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", GMT_BG+"+1100", "+11:00" },
\r
1182 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", GMT_BG+"+1100", "+11:00" },
\r
1183 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
\r
1184 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"+1000", "+10:00" },
\r
1185 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", GMT_BG+"+1000", "+10:00" },
\r
1186 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", GMT_BG+"+1000", "+10:00" },
\r
1187 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u044f (\u0421\u0438\u0434\u043D\u0438)", "Australia/Sydney" },
\r
1188 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u044f (\u0421\u0438\u0434\u043D\u0438)", "Australia/Sydney" },
\r
1190 { "bg", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
\r
1191 { "bg", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"+0000", "+0:00" },
\r
1192 { "bg", "Europe/London", "2004-01-15T00:00:00Z", "z", GMT_BG+"+0000", "+0:00" },
\r
1193 { "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" },
\r
1194 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
\r
1195 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"+0100", "+1:00" },
\r
1196 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "z", GMT_BG+"+0100", "+1:00" },
\r
1197 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", GMT_BG+"+0100", "+1:00" },
\r
1198 { "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)", "Europe/London" },
\r
1199 { "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)", "Europe/London" },
\r
1201 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1202 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"-0300", "-3:00" },
\r
1203 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", GMT_BG+"-0300", "-3:00" },
\r
1204 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", GMT_BG+"-0300", "-3:00" },
\r
1205 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1206 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"-0300", "-3:00" },
\r
1207 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", GMT_BG+"-0300", "-3:00" },
\r
1208 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", GMT_BG+"-0300", "-3:00" },
\r
1209 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", GMT_BG+"-0300", "-3:00" },
\r
1210 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", GMT_BG+"-0300", "-3:00" },
\r
1213 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
\r
1214 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", GMT_BG+"+0530", "+5:30" },
\r
1215 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", GMT_BG+"+0530", "+5:30" },
\r
1216 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", GMT_BG+"+0530", "+5:30" },
\r
1217 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
\r
1218 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", GMT_BG+"+0530", "+5:30" },
\r
1219 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", GMT_BG+"+0530", "+05:30" },
\r
1220 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", GMT_BG+"+0530", "+5:30" },
\r
1221 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "(\u0418\u043D\u0434\u0438\u044F)", "Asia/Calcutta" },
\r
1222 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "(\u0418\u043D\u0434\u0438\u044F)", "Asia/Calcutta" },
\r
1226 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
\r
1227 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" },
\r
1228 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-08:00", "America/Los_Angeles" },
\r
1229 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "V", "PST", "America/Los_Angeles" },
\r
1230 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u6a19\u6e96\u6642", "America/Los_Angeles" },
\r
1231 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
\r
1232 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
\r
1233 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-07:00", "America/Los_Angeles" },
\r
1234 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "V", "PDT", "America/Los_Angeles" },
\r
1235 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593", "America/Los_Angeles" },
\r
1236 // icu ja.txt has exemplar city for this time zone
\r
1237 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\u30A2\u30E1\u30EA\u30AB\u5408\u8846\u56FD (\u30ed\u30b5\u30f3\u30bc\u30eb\u30b9)", "America/Los_Angeles" },
\r
1238 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\u30A2\u30E1\u30EA\u30AB\u592A\u5E73\u6D0B\u6642\u9593", "America/Los_Angeles" },
\r
1239 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "VVVV", "\u30A2\u30E1\u30EA\u30AB\u5408\u8846\u56FD (\u30ed\u30b5\u30f3\u30bc\u30eb\u30b9)", "America/Los_Angeles" },
\r
1241 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1242 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
1243 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
1244 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
1245 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1246 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
1247 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
1248 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
1249 // icu ja.txt does not have info for this time zone
\r
1250 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3 (\u30D6\u30A8\u30CE\u30B9\u30A2\u30A4\u30EC\u30B9)", "America/Buenos_Aires" },
\r
1251 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3\u6642\u9593", "America/Buenos_Aires" },
\r
1253 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1254 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
1255 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
1256 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
1257 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1258 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
1259 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
1260 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
1261 // icu ja.txt does not have info for this time zone
\r
1262 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3 (\u30D6\u30A8\u30CE\u30B9\u30A2\u30A4\u30EC\u30B9)", "America/Buenos_Aires" },
\r
1263 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3\u6642\u9593", "America/Buenos_Aires" },
\r
1265 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
\r
1266 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" },
\r
1267 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-05:00", "-5:00" },
\r
1268 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "GMT-05:00", "-5:00" },
\r
1269 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
\r
1270 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" },
\r
1271 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-04:00", "-4:00" },
\r
1272 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "GMT-04:00", "-4:00" },
\r
1273 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "v", "\u30ad\u30e5\u30fc\u30d0\u6642\u9593", "America/Havana" },
\r
1274 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\u30ad\u30e5\u30fc\u30d0\u6642\u9593", "America/Havana" },
\r
1276 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
\r
1277 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
\r
1278 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
\r
1279 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "GMT+11:00", "+11:00" },
\r
1280 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
\r
1281 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
\r
1282 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
\r
1283 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "GMT+10:00", "+10:00" },
\r
1284 // icu ja.txt does not have info for this time zone
\r
1285 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2 (\u30b7\u30c9\u30cb\u30fc)", "Australia/Sydney" },
\r
1286 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2 (\u30b7\u30c9\u30cb\u30fc)", "Australia/Sydney" },
\r
1288 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
\r
1289 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
\r
1290 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
\r
1291 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "GMT+11:00", "+11:00" },
\r
1292 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
\r
1293 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
\r
1294 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
\r
1295 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "GMT+10:00", "+10:00" },
\r
1296 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2 (\u30b7\u30c9\u30cb\u30fc)", "Australia/Sydney" },
\r
1297 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2 (\u30b7\u30c9\u30cb\u30fc)", "Australia/Sydney" },
\r
1299 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
\r
1300 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+00:00", "+0:00" },
\r
1301 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT+00:00", "+0:00" },
\r
1302 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "V", "GMT", "+0:00" },
\r
1303 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642", "+0:00" },
\r
1304 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
\r
1305 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" },
\r
1306 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+01:00", "+1:00" },
\r
1307 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "V", "GMT+01:00", "+1:00" },
\r
1308 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "GMT+01:00", "+1:00" },
\r
1309 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "v", "\u30a4\u30ae\u30ea\u30b9\u6642\u9593", "Europe/London" },
\r
1310 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\u30a4\u30ae\u30ea\u30b9\u6642\u9593", "Europe/London" },
\r
1311 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "VVVV", "\u30a4\u30ae\u30ea\u30b9\u6642\u9593", "Europe/London" },
\r
1313 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1314 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
1315 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
1316 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
1317 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1318 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
1319 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
1320 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
1321 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-03:00", "-3:00" },
\r
1322 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" },
\r
1325 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
\r
1326 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
\r
1327 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+05:30", "+5:30" },
\r
1328 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "GMT+05:30", "+5:30" },
\r
1329 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
\r
1330 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
\r
1331 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+05:30", "+05:30" },
\r
1332 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "GMT+05:30", "+5:30" },
\r
1333 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "\u30A4\u30F3\u30C9\u6642\u9593", "Asia/Calcutta" },
\r
1334 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\u30A4\u30F3\u30C9\u6642\u9593", "Asia/Calcutta" },
\r
1338 { "si", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
\r
1339 { "si", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" },
\r
1340 { "si", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-08:00", "-8:00" },
\r
1341 { "si", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "GMT-08:00", "-8:00" },
\r
1342 { "si", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
\r
1343 { "si", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
\r
1344 { "si", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-07:00", "-7:00" },
\r
1345 { "si", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "GMT-07:00", "-7:00" },
\r
1346 { "si", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "US (Los Angeles)", "America/Los_Angeles" },
\r
1347 { "si", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "US (Los Angeles)", "America/Los_Angeles" },
\r
1349 { "si", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1350 { "si", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
1351 { "si", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
1352 { "si", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
1353 { "si", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1354 { "si", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
1355 { "si", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
1356 { "si", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
1357 { "si", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "AR (Buenos Aires)", "America/Buenos_Aires" },
\r
1358 { "si", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "AR (Buenos Aires)", "America/Buenos_Aires" },
\r
1360 { "si", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1361 { "si", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
1362 { "si", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
1363 { "si", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
1364 { "si", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1365 { "si", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
1366 { "si", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
1367 { "si", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
1368 { "si", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "AR (Buenos Aires)", "America/Buenos_Aires" },
\r
1369 { "si", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "AR (Buenos Aires)", "America/Buenos_Aires" },
\r
1371 { "si", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
\r
1372 { "si", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" },
\r
1373 { "si", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-05:00", "-5:00" },
\r
1374 { "si", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "GMT-05:00", "-5:00" },
\r
1375 { "si", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
\r
1376 { "si", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" },
\r
1377 { "si", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-04:00", "-4:00" },
\r
1378 { "si", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "GMT-04:00", "-4:00" },
\r
1379 { "si", "America/Havana", "2004-07-15T00:00:00Z", "v", "(CU)", "America/Havana" },
\r
1380 { "si", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "(CU)", "America/Havana" },
\r
1382 { "si", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
\r
1383 { "si", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
\r
1384 { "si", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
\r
1385 { "si", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "GMT+11:00", "+11:00" },
\r
1386 { "si", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
\r
1387 { "si", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
\r
1388 { "si", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
\r
1389 { "si", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "GMT+10:00", "+10:00" },
\r
1390 { "si", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "AU (Sydney)", "Australia/Sydney" },
\r
1391 { "si", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "AU (Sydney)", "Australia/Sydney" },
\r
1393 { "si", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
\r
1394 { "si", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
\r
1395 { "si", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" },
\r
1396 { "si", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "GMT+11:00", "+11:00" },
\r
1397 { "si", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
\r
1398 { "si", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
\r
1399 { "si", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" },
\r
1400 { "si", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "GMT+10:00", "+10:00" },
\r
1401 { "si", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "AU (Sydney)", "Australia/Sydney" },
\r
1402 { "si", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "AU (Sydney)", "Australia/Sydney" },
\r
1404 { "si", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
\r
1405 { "si", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+00:00", "+0:00" },
\r
1406 { "si", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT+00:00", "+0:00" },
\r
1407 { "si", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "GMT+00:00", "+0:00" },
\r
1408 { "si", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
\r
1409 { "si", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" },
\r
1410 { "si", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+01:00", "+1:00" },
\r
1411 { "si", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "GMT+01:00", "+1:00" },
\r
1412 { "si", "Europe/London", "2004-07-15T00:00:00Z", "v", "(GB)", "Europe/London" },
\r
1413 { "si", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "(GB)", "Europe/London" },
\r
1415 { "si", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1416 { "si", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
1417 { "si", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
1418 { "si", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
1419 { "si", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
\r
1420 { "si", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
\r
1421 { "si", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" },
\r
1422 { "si", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
\r
1423 { "si", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-03:00", "-3:00" },
\r
1424 { "si", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" },
\r
1427 { "si", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
\r
1428 { "si", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
\r
1429 { "si", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+05:30", "+5:30" },
\r
1430 { "si", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "GMT+05:30", "+5:30" },
\r
1431 { "si", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
\r
1432 { "si", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
\r
1433 { "si", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+05:30", "+05:30" },
\r
1434 { "si", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "GMT+05:30", "+5:30" },
\r
1435 { "si", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "(IN)", "Asia/Calcutta" },
\r
1436 { "si", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "(IN)", "Asia/Calcutta" },
\r
1441 * Verify that strings which contain incomplete specifications are parsed
\r
1442 * correctly. In some instances, this means not being parsed at all, and
\r
1443 * returning an appropriate error.
\r
1445 public void TestPartialParse994() {
\r
1447 SimpleDateFormat f = new SimpleDateFormat();
\r
1448 Calendar cal = Calendar.getInstance();
\r
1450 cal.set(1997, 1 - 1, 17, 10, 11, 42);
\r
1452 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17 10:11:42", cal.getTime());
\r
1453 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17 10:", date);
\r
1454 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17 10", date);
\r
1455 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17 ", date);
\r
1456 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17", date);
\r
1459 // internal test subroutine, used by TestPartialParse994
\r
1460 public void tryPat994(SimpleDateFormat format, String pat, String str, Date expected) {
\r
1462 logln("Pattern \"" + pat + "\" String \"" + str + "\"");
\r
1464 format.applyPattern(pat);
\r
1465 Date date = format.parse(str);
\r
1466 String f = ((DateFormat) format).format(date);
\r
1467 logln(" parse(" + str + ") -> " + date);
\r
1468 logln(" format -> " + f);
\r
1469 if (expected.equals(Null) || !date.equals(expected))
\r
1470 errln("FAIL: Expected null"); //" + expected);
\r
1471 if (!f.equals(str))
\r
1472 errln("FAIL: Expected " + str);
\r
1473 } catch (ParseException e) {
\r
1474 logln("ParseException: " + e.getMessage());
\r
1475 if (!(expected ==Null))
\r
1476 errln("FAIL: Expected " + expected);
\r
1477 } catch (Exception e) {
\r
1478 errln("*** Exception:");
\r
1479 e.printStackTrace();
\r
1484 * Verify the behavior of patterns in which digits for different fields run together
\r
1485 * without intervening separators.
\r
1487 public void TestRunTogetherPattern985() {
\r
1488 String format = "yyyyMMddHHmmssSSS";
\r
1491 SimpleDateFormat formatter = new SimpleDateFormat(format);
\r
1492 Date date1 = new Date();
\r
1493 now = ((DateFormat) formatter).format(date1);
\r
1495 ParsePosition pos = new ParsePosition(0);
\r
1496 Date date2 = formatter.parse(now, pos);
\r
1497 if (date2 == null)
\r
1498 then = "Parse stopped at " + pos.getIndex();
\r
1500 then = ((DateFormat) formatter).format(date2);
\r
1502 if (date2 == null || !date2.equals(date1))
\r
1507 * Verify the behavior of patterns in which digits for different fields run together
\r
1508 * without intervening separators.
\r
1510 public void TestRunTogetherPattern917() {
\r
1511 SimpleDateFormat fmt;
\r
1513 fmt = new SimpleDateFormat("yyyy/MM/dd");
\r
1514 myDate = "1997/02/03";
\r
1515 Calendar cal = Calendar.getInstance();
\r
1517 cal.set(1997, 2 - 1, 3);
\r
1518 _testIt917(fmt, myDate, cal.getTime());
\r
1519 fmt = new SimpleDateFormat("yyyyMMdd");
\r
1520 myDate = "19970304";
\r
1522 cal.set(1997, 3 - 1, 4);
\r
1523 _testIt917(fmt, myDate, cal.getTime());
\r
1527 // internal test subroutine, used by TestRunTogetherPattern917
\r
1528 public void _testIt917(SimpleDateFormat fmt, String str, Date expected) {
\r
1529 logln("pattern=" + fmt.toPattern() + " string=" + str);
\r
1530 Date o = new Date();
\r
1531 o = (Date) ((DateFormat) fmt).parseObject(str, new ParsePosition(0));
\r
1532 logln("Parsed object: " + o);
\r
1533 if (o == null || !o.equals(expected))
\r
1534 errln("FAIL: Expected " + expected);
\r
1535 String formatted = o==null? "null" : ((DateFormat) fmt).format(o);
\r
1536 logln( "Formatted string: " + formatted);
\r
1537 if (!formatted.equals(str))
\r
1538 errln( "FAIL: Expected " + str);
\r
1542 * Verify the handling of Czech June and July, which have the unique attribute that
\r
1543 * one is a proper prefix substring of the other.
\r
1545 public void TestCzechMonths459() {
\r
1546 DateFormat fmt = DateFormat.getDateInstance(DateFormat.FULL, new Locale("cs", "", ""));
\r
1547 logln("Pattern " + ((SimpleDateFormat) fmt).toPattern());
\r
1548 Calendar cal = Calendar.getInstance();
\r
1550 cal.set(1997, Calendar.JUNE, 15);
\r
1551 Date june = cal.getTime();
\r
1553 cal.set(1997, Calendar.JULY, 15);
\r
1554 Date july = cal.getTime();
\r
1555 String juneStr = fmt.format(june);
\r
1556 String julyStr = fmt.format(july);
\r
1558 logln("format(June 15 1997) = " + juneStr);
\r
1559 Date d = fmt.parse(juneStr);
\r
1560 String s = fmt.format(d);
\r
1561 int month, yr, day;
\r
1563 yr = cal.get(Calendar.YEAR);
\r
1564 month = cal.get(Calendar.MONTH);
\r
1565 day = cal.get(Calendar.DAY_OF_MONTH);
\r
1566 logln(" . parse . " + s + " (month = " + month + ")");
\r
1567 if (month != Calendar.JUNE)
\r
1568 errln("FAIL: Month should be June");
\r
1570 errln("FAIL: Year should be 1997");
\r
1572 errln("FAIL: day should be 15");
\r
1573 logln("format(July 15 1997) = " + julyStr);
\r
1574 d = fmt.parse(julyStr);
\r
1575 s = fmt.format(d);
\r
1577 yr = cal.get(Calendar.YEAR) - 1900;
\r
1578 month = cal.get(Calendar.MONTH);
\r
1579 day = cal.get(Calendar.DAY_OF_WEEK);
\r
1580 logln(" . parse . " + s + " (month = " + month + ")");
\r
1581 if (month != Calendar.JULY)
\r
1582 errln("FAIL: Month should be July");
\r
1583 } catch (ParseException e) {
\r
1584 errln(e.getMessage());
\r
1589 * Test the handling of 'D' in patterns.
\r
1591 public void TestLetterDPattern212() {
\r
1592 String dateString = "1995-040.05:01:29";
\r
1593 String bigD = "yyyy-DDD.hh:mm:ss";
\r
1594 String littleD = "yyyy-ddd.hh:mm:ss";
\r
1595 Calendar cal = Calendar.getInstance();
\r
1597 cal.set(1995, 0, 1, 5, 1, 29);
\r
1598 Date expLittleD = cal.getTime();
\r
1599 Date expBigD = new Date((long) (expLittleD.getTime() + 39 * 24 * 3600000.0));
\r
1600 expLittleD = expBigD; // Expect the same, with default lenient parsing
\r
1601 logln("dateString= " + dateString);
\r
1602 SimpleDateFormat formatter = new SimpleDateFormat(bigD);
\r
1603 ParsePosition pos = new ParsePosition(0);
\r
1604 Date myDate = formatter.parse(dateString, pos);
\r
1605 logln("Using " + bigD + " . " + myDate);
\r
1606 if (!myDate.equals(expBigD))
\r
1607 errln("FAIL: Expected " + expBigD);
\r
1608 formatter = new SimpleDateFormat(littleD);
\r
1609 pos = new ParsePosition(0);
\r
1610 myDate = formatter.parse(dateString, pos);
\r
1611 logln("Using " + littleD + " . " + myDate);
\r
1612 if (!myDate.equals(expLittleD))
\r
1613 errln("FAIL: Expected " + expLittleD);
\r
1617 * Test the day of year pattern.
\r
1619 public void TestDayOfYearPattern195() {
\r
1620 Calendar cal = Calendar.getInstance();
\r
1621 Date today = cal.getTime();
\r
1622 int year,month,day;
\r
1623 year = cal.get(Calendar.YEAR);
\r
1624 month = cal.get(Calendar.MONTH);
\r
1625 day = cal.get(Calendar.DAY_OF_MONTH);
\r
1627 cal.set(year, month, day);
\r
1628 Date expected = cal.getTime();
\r
1629 logln("Test Date: " + today);
\r
1630 SimpleDateFormat sdf = (SimpleDateFormat)DateFormat.getDateInstance();
\r
1631 tryPattern(sdf, today, null, expected);
\r
1632 tryPattern(sdf, today, "G yyyy DDD", expected);
\r
1635 // interl test subroutine, used by TestDayOfYearPattern195
\r
1636 public void tryPattern(SimpleDateFormat sdf, Date d, String pattern, Date expected) {
\r
1637 if (pattern != null)
\r
1638 sdf.applyPattern(pattern);
\r
1639 logln("pattern: " + sdf.toPattern());
\r
1640 String formatResult = ((DateFormat) sdf).format(d);
\r
1641 logln(" format -> " + formatResult);
\r
1643 Date d2 = sdf.parse(formatResult);
\r
1644 logln(" parse(" + formatResult + ") -> " + d2);
\r
1645 if (!d2.equals(expected))
\r
1646 errln("FAIL: Expected " + expected);
\r
1647 String format2 = ((DateFormat) sdf).format(d2);
\r
1648 logln(" format -> " + format2);
\r
1649 if (!formatResult.equals(format2))
\r
1650 errln("FAIL: Round trip drift");
\r
1651 } catch (Exception e) {
\r
1652 errln(e.getMessage());
\r
1657 * Test the handling of single quotes in patterns.
\r
1659 public void TestQuotePattern161() {
\r
1660 SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy 'at' hh:mm:ss a zzz", Locale.US);
\r
1661 Calendar cal = Calendar.getInstance();
\r
1663 cal.set(1997, Calendar.AUGUST, 13, 10, 42, 28);
\r
1664 Date currentTime_1 = cal.getTime();
\r
1665 String dateString = ((DateFormat) formatter).format(currentTime_1);
\r
1666 String exp = "08/13/1997 at 10:42:28 AM ";
\r
1667 logln("format(" + currentTime_1 + ") = " + dateString);
\r
1668 if (!dateString.substring(0, exp.length()).equals(exp))
\r
1669 errln("FAIL: Expected " + exp);
\r
1674 * Verify the correct behavior when handling invalid input strings.
\r
1676 public void TestBadInput135() {
\r
1677 int looks[] = {DateFormat.SHORT, DateFormat.MEDIUM, DateFormat.LONG, DateFormat.FULL};
\r
1678 int looks_length = looks.length;
\r
1679 final String[] strings = {"Mar 15", "Mar 15 1997", "asdf", "3/1/97 1:23:", "3/1/00 1:23:45 AM"};
\r
1680 int strings_length = strings.length;
\r
1681 DateFormat full = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.US);
\r
1682 String expected = "March 1, 2000 1:23:45 AM ";
\r
1683 for (int i = 0; i < strings_length; ++i) {
\r
1684 final String text = strings[i];
\r
1685 for (int j = 0; j < looks_length; ++j) {
\r
1686 int dateLook = looks[j];
\r
1687 for (int k = 0; k < looks_length; ++k) {
\r
1688 int timeLook = looks[k];
\r
1689 DateFormat df = DateFormat.getDateTimeInstance(dateLook, timeLook, Locale.US);
\r
1690 String prefix = text + ", " + dateLook + "/" + timeLook + ": ";
\r
1692 Date when = df.parse(text);
\r
1693 if (when == null) {
\r
1694 errln(prefix + "SHOULD NOT HAPPEN: parse returned null.");
\r
1697 if (when != null) {
\r
1699 format = full.format(when);
\r
1700 logln(prefix + "OK: " + format);
\r
1701 if (!format.substring(0, expected.length()).equals(expected))
\r
1702 errln("FAIL: Expected " + expected);
\r
1704 } catch(java.text.ParseException e) {
\r
1705 logln(e.getMessage());
\r
1713 * Verify the correct behavior when parsing an array of inputs against an
\r
1714 * array of patterns, with known results. The results are encoded after
\r
1715 * the input strings in each row.
\r
1717 public void TestBadInput135a() {
\r
1719 SimpleDateFormat dateParse = new SimpleDateFormat("", Locale.US);
\r
1722 String[] parseFormats ={"MMMM d, yyyy", "MMMM d yyyy", "M/d/yy",
\r
1723 "d MMMM, yyyy", "d MMMM yyyy", "d MMMM",
\r
1724 "MMMM d", "yyyy", "h:mm a MMMM d, yyyy" };
\r
1725 String[] inputStrings = {
\r
1726 "bogus string", null, null, null, null, null, null, null, null, null,
\r
1727 "April 1, 1997", "April 1, 1997", null, null, null, null, null, "April 1", null, null,
\r
1728 "Jan 1, 1970", "January 1, 1970", null, null, null, null, null, "January 1", null, null,
\r
1729 "Jan 1 2037", null, "January 1 2037", null, null, null, null, "January 1", null, null,
\r
1730 "1/1/70", null, null, "1/1/70", null, null, null, null, "0001", null,
\r
1731 "5 May 1997", null, null, null, null, "5 May 1997", "5 May", null, "0005", null,
\r
1732 "16 May", null, null, null, null, null, "16 May", null, "0016", null,
\r
1733 "April 30", null, null, null, null, null, null, "April 30", null, null,
\r
1734 "1998", null, null, null, null, null, null, null, "1998", null,
\r
1735 "1", null, null, null, null, null, null, null, "0001", null,
\r
1736 "3:00 pm Jan 1, 1997", null, null, null, null, null, null, null, "0003", "3:00 PM January 1, 1997",
\r
1738 final int PF_LENGTH = parseFormats.length;
\r
1739 final int INPUT_LENGTH = inputStrings.length;
\r
1741 dateParse.applyPattern("d MMMM, yyyy");
\r
1742 dateParse.setTimeZone(TimeZone.getDefault());
\r
1743 ss = "not parseable";
\r
1745 logln("Trying to parse \"" + ss + "\" with " + dateParse.toPattern());
\r
1747 date = dateParse.parse(ss);
\r
1748 } catch (Exception ex) {
\r
1749 logln("FAIL:" + ex);
\r
1751 for (int i = 0; i < INPUT_LENGTH; i += (PF_LENGTH + 1)) {
\r
1752 ParsePosition parsePosition = new ParsePosition(0);
\r
1753 String s = inputStrings[i];
\r
1754 for (int index = 0; index < PF_LENGTH; ++index) {
\r
1755 final String expected = inputStrings[i + 1 + index];
\r
1756 dateParse.applyPattern(parseFormats[index]);
\r
1757 dateParse.setTimeZone(TimeZone.getDefault());
\r
1759 parsePosition.setIndex(0);
\r
1760 date = dateParse.parse(s, parsePosition);
\r
1761 if (parsePosition.getIndex() != 0) {
\r
1763 s1 = s.substring(0, parsePosition.getIndex());
\r
1764 s2 = s.substring(parsePosition.getIndex(), s.length());
\r
1765 if (date == null) {
\r
1766 errln("ERROR: null result fmt=\"" + parseFormats[index]
\r
1767 + "\" pos=" + parsePosition.getIndex()
\r
1768 + " " + s1 + "|" + s2);
\r
1770 String result = ((DateFormat) dateParse).format(date);
\r
1771 logln("Parsed \"" + s + "\" using \"" + dateParse.toPattern() + "\" to: " + result);
\r
1772 if (expected == null)
\r
1773 errln("FAIL: Expected parse failure");
\r
1775 if (!result.equals(expected))
\r
1776 errln("FAIL: Expected " + expected);
\r
1779 if (expected != null) {
\r
1780 errln("FAIL: Expected " + expected + " from \"" + s
\r
1781 + "\" with \"" + dateParse.toPattern()+ "\"");
\r
1783 } catch (Exception ex) {
\r
1784 logln("FAIL:" + ex);
\r
1792 * Test the parsing of two-digit years.
\r
1794 public void TestTwoDigitYear() {
\r
1795 DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
\r
1796 Calendar cal = Calendar.getInstance();
\r
1798 cal.set(117 + 1900, Calendar.JUNE, 5);
\r
1799 parse2DigitYear(fmt, "6/5/17", cal.getTime());
\r
1801 cal.set(34 + 1900, Calendar.JUNE, 4);
\r
1802 parse2DigitYear(fmt, "6/4/34", cal.getTime());
\r
1805 // internal test subroutine, used by TestTwoDigitYear
\r
1806 public void parse2DigitYear(DateFormat fmt, String str, Date expected) {
\r
1808 Date d = fmt.parse(str);
\r
1809 logln("Parsing \""+ str+ "\" with "+ ((SimpleDateFormat) fmt).toPattern()
\r
1811 if (!d.equals(expected))
\r
1812 errln( "FAIL: Expected " + expected);
\r
1813 } catch (ParseException e) {
\r
1814 errln(e.getMessage());
\r
1819 * Test the formatting of time zones.
\r
1821 public void TestDateFormatZone061() {
\r
1823 DateFormat formatter;
\r
1824 date = new Date(859248000000l);
\r
1825 logln("Date 1997/3/25 00:00 GMT: " + date);
\r
1826 formatter = new SimpleDateFormat("dd-MMM-yyyyy HH:mm", Locale.UK);
\r
1827 formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
\r
1828 String temp = formatter.format(date);
\r
1829 logln("Formatted in GMT to: " + temp);
\r
1831 Date tempDate = formatter.parse(temp);
\r
1832 logln("Parsed to: " + tempDate);
\r
1833 if (!tempDate.equals(date))
\r
1834 errln("FAIL: Expected " + date + " Got: " + tempDate);
\r
1835 } catch (Throwable t) {
\r
1836 System.out.println(t);
\r
1842 * Test the formatting of time zones.
\r
1844 public void TestDateFormatZone146() {
\r
1845 TimeZone saveDefault = TimeZone.getDefault();
\r
1848 TimeZone thedefault = TimeZone.getTimeZone("GMT");
\r
1849 TimeZone.setDefault(thedefault);
\r
1850 // java.util.Locale.setDefault(new java.util.Locale("ar", "", ""));
\r
1852 // check to be sure... its GMT all right
\r
1853 TimeZone testdefault = TimeZone.getDefault();
\r
1854 String testtimezone = testdefault.getID();
\r
1855 if (testtimezone.equals("GMT"))
\r
1856 logln("Test timezone = " + testtimezone);
\r
1858 errln("Test timezone should be GMT, not " + testtimezone);
\r
1860 // now try to use the default GMT time zone
\r
1861 GregorianCalendar greenwichcalendar = new GregorianCalendar(1997, 3, 4, 23, 0);
\r
1862 //*****************************greenwichcalendar.setTimeZone(TimeZone.getDefault());
\r
1863 //greenwichcalendar.set(1997, 3, 4, 23, 0);
\r
1864 // try anything to set hour to 23:00 !!!
\r
1865 greenwichcalendar.set(Calendar.HOUR_OF_DAY, 23);
\r
1867 Date greenwichdate = greenwichcalendar.getTime();
\r
1868 // format every way
\r
1870 "simple format: ", "04/04/97 23:00 GMT+00:00",
\r
1871 "MM/dd/yy HH:mm zzz", "full format: ",
\r
1872 "Friday, April 4, 1997 11:00:00 o'clock PM GMT+00:00",
\r
1873 "EEEE, MMMM d, yyyy h:mm:ss 'o''clock' a zzz",
\r
1874 "long format: ", "April 4, 1997 11:00:00 PM GMT+00:00",
\r
1875 "MMMM d, yyyy h:mm:ss a z", "default format: ",
\r
1876 "04-Apr-97 11:00:00 PM", "dd-MMM-yy h:mm:ss a",
\r
1877 "short format: ", "4/4/97 11:00 PM",
\r
1878 "M/d/yy h:mm a"};
\r
1879 int DATA_length = DATA.length;
\r
1881 for (int i = 0; i < DATA_length; i += 3) {
\r
1882 DateFormat fmt = new SimpleDateFormat(DATA[i + 2], Locale.ENGLISH);
\r
1883 fmt.setCalendar(greenwichcalendar);
\r
1884 String result = fmt.format(greenwichdate);
\r
1885 logln(DATA[i] + result);
\r
1886 if (!result.equals(DATA[i + 1]))
\r
1887 errln("FAIL: Expected " + DATA[i + 1] + ", got " + result);
\r
1891 TimeZone.setDefault(saveDefault);
\r
1897 * Test the formatting of dates in different locales.
\r
1899 public void TestLocaleDateFormat() {
\r
1901 Date testDate = new Date(874306800000l); //Mon Sep 15 00:00:00 PDT 1997
\r
1902 DateFormat dfFrench = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.FRENCH);
\r
1903 DateFormat dfUS = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.US);
\r
1904 //Set TimeZone = PDT
\r
1905 TimeZone tz = TimeZone.getTimeZone("PST");
\r
1906 dfFrench.setTimeZone(tz);
\r
1907 dfUS.setTimeZone(tz);
\r
1908 String expectedFRENCH_JDK12 = "lundi 15 septembre 1997 00:00:00 heure avanc\u00E9e du Pacifique";
\r
1909 //String expectedFRENCH = "lundi 15 septembre 1997 00 h 00 PDT";
\r
1910 String expectedUS = "Monday, September 15, 1997 12:00:00 AM Pacific Daylight Time";
\r
1911 logln("Date set to : " + testDate);
\r
1912 String out = dfFrench.format(testDate);
\r
1913 logln("Date Formated with French Locale " + out);
\r
1914 //fix the jdk resources differences between jdk 1.2 and jdk 1.3
\r
1915 /* our own data only has GMT-xxxx information here
\r
1916 String javaVersion = System.getProperty("java.version");
\r
1917 if (javaVersion.startsWith("1.2")) {
\r
1918 if (!out.equals(expectedFRENCH_JDK12))
\r
1919 errln("FAIL: Expected " + expectedFRENCH_JDK12+" Got "+out);
\r
1921 if (!out.equals(expectedFRENCH))
\r
1922 errln("FAIL: Expected " + expectedFRENCH);
\r
1925 if (!out.equals(expectedFRENCH_JDK12))
\r
1926 errln("FAIL: Expected " + expectedFRENCH_JDK12+" Got "+out);
\r
1927 out = dfUS.format(testDate);
\r
1928 logln("Date Formated with US Locale " + out);
\r
1929 if (!out.equals(expectedUS))
\r
1930 errln("FAIL: Expected " + expectedUS+" Got "+out);
\r
1934 * Test the formatting of dates with the 'NONE' keyword.
\r
1936 public void TestDateFormatNone() {
\r
1938 Date testDate = new Date(874306800000l); //Mon Sep 15 00:00:00 PDT 1997
\r
1939 DateFormat dfFrench = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.NONE, Locale.FRENCH);
\r
1940 //Set TimeZone = PDT
\r
1941 TimeZone tz = TimeZone.getTimeZone("PST");
\r
1942 dfFrench.setTimeZone(tz);
\r
1943 String expectedFRENCH_JDK12 = "lundi 15 septembre 1997";
\r
1944 //String expectedFRENCH = "lundi 15 septembre 1997 00 h 00 PDT";
\r
1945 logln("Date set to : " + testDate);
\r
1946 String out = dfFrench.format(testDate);
\r
1947 logln("Date Formated with French Locale " + out);
\r
1948 if (!out.equals(expectedFRENCH_JDK12))
\r
1949 errln("FAIL: Expected " + expectedFRENCH_JDK12+" Got "+out);
\r
1954 * Test DateFormat(Calendar) API
\r
1956 public void TestDateFormatCalendar() {
\r
1957 DateFormat date=null, time=null, full=null;
\r
1958 Calendar cal=null;
\r
1959 ParsePosition pos = new ParsePosition(0);
\r
1963 /* Create a formatter for date fields. */
\r
1964 date = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
\r
1965 if (date == null) {
\r
1966 errln("FAIL: getDateInstance failed");
\r
1970 /* Create a formatter for time fields. */
\r
1971 time = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US);
\r
1972 if (time == null) {
\r
1973 errln("FAIL: getTimeInstance failed");
\r
1977 /* Create a full format for output */
\r
1978 full = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL,
\r
1980 if (full == null) {
\r
1981 errln("FAIL: getInstance failed");
\r
1985 /* Create a calendar */
\r
1986 cal = Calendar.getInstance(Locale.US);
\r
1987 if (cal == null) {
\r
1988 errln("FAIL: Calendar.getInstance failed");
\r
1992 /* Parse the date */
\r
1996 date.parse(str, cal, pos);
\r
1997 if (pos.getIndex() != str.length()) {
\r
1998 errln("FAIL: DateFormat.parse(4/5/2001) failed at " +
\r
2003 /* Parse the time */
\r
2006 time.parse(str, cal, pos);
\r
2007 if (pos.getIndex() != str.length()) {
\r
2008 errln("FAIL: DateFormat.parse(17:45) failed at " +
\r
2013 /* Check result */
\r
2014 when = cal.getTime();
\r
2015 str = full.format(when);
\r
2016 // Thursday, April 5, 2001 5:45:00 PM PDT 986517900000
\r
2017 if (when.getTime() == 986517900000.0) {
\r
2018 logln("Ok: Parsed result: " + str);
\r
2020 errln("FAIL: Parsed result: " + str + ", exp 4/5/2001 5:45 PM");
\r
2025 * Test DateFormat's parsing of space characters. See jitterbug 1916.
\r
2027 public void TestSpaceParsing() {
\r
2032 // pattern, input, expected output (in quotes)
\r
2033 "MMMM d yy", " 04 05 06", null, // MMMM wants Apr/April
\r
2034 null, "04 05 06", null,
\r
2035 "MM d yy", " 04 05 06", "2006 04 05",
\r
2036 null, "04 05 06", "2006 04 05",
\r
2037 "MMMM d yy", " Apr 05 06", "2006 04 05",
\r
2038 null, "Apr 05 06", "2006 04 05",
\r
2041 expectParse(DATA, new Locale("en", "", ""));
\r
2045 * Test handling of "HHmmss" pattern.
\r
2047 public void TestExactCountFormat() {
\r
2049 "yyyy MM dd HH:mm:ss",
\r
2051 // pattern, input, expected parse or null if expect parse failure
\r
2052 "HHmmss", "123456", "1970 01 01 12:34:56",
\r
2053 null, "12345", "1970 01 01 01:23:45",
\r
2054 null, "1234", null,
\r
2055 null, "00-05", null,
\r
2056 null, "12-34", null,
\r
2057 null, "00+05", null,
\r
2058 "ahhmm", "PM730", "1970 01 01 19:30:00",
\r
2061 expectParse(DATA, new Locale("en", "", ""));
\r
2065 * Test handling of white space.
\r
2067 public void TestWhiteSpaceParsing() {
\r
2071 // pattern, input, expected parse or null if expect parse failure
\r
2073 // Pattern space run should parse input text space run
\r
2074 "MM d yy", " 04 01 03", "2003 04 01",
\r
2075 null, " 04 01 03 ", "2003 04 01",
\r
2078 expectParse(DATA, new Locale("en", "", ""));
\r
2081 public void TestInvalidPattern() {
\r
2082 Exception e = null;
\r
2083 SimpleDateFormat f = null;
\r
2084 String out = null;
\r
2086 f = new SimpleDateFormat("Yesterday");
\r
2087 out = f.format(new Date(0));
\r
2088 } catch (IllegalArgumentException e1) {
\r
2092 logln("Ok: Received " + e.getMessage());
\r
2094 errln("FAIL: Expected exception, got " + f.toPattern() +
\r
2099 public void TestGreekMay() {
\r
2100 Date date = new Date(-9896080848000L);
\r
2101 SimpleDateFormat fmt = new SimpleDateFormat("EEEE, dd MMMM yyyy h:mm:ss a",
\r
2102 new Locale("el", "", ""));
\r
2103 String str = fmt.format(date);
\r
2104 ParsePosition pos = new ParsePosition(0);
\r
2105 Date d2 = fmt.parse(str, pos);
\r
2106 if (!date.equals(d2)) {
\r
2107 errln("FAIL: unable to parse strings where case-folding changes length");
\r
2111 public void TestErrorChecking() {
\r
2113 DateFormat.getDateTimeInstance(-1, -1, Locale.US);
\r
2114 errln("Expected exception for getDateTimeInstance(-1, -1, Locale)");
\r
2116 catch(IllegalArgumentException e) {
\r
2119 catch(Exception e) {
\r
2120 warnln("Expected IllegalArgumentException, got: " + e);
\r
2124 DateFormat df = new SimpleDateFormat("aabbccc");
\r
2125 df.format(new Date());
\r
2126 errln("Expected exception for format with bad pattern");
\r
2128 catch(IllegalArgumentException ex) {
\r
2131 catch(Exception e) {
\r
2132 warnln("Expected IllegalArgumentException, got: " + e);
\r
2136 SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yy"); // opposite of text
\r
2137 fmt.set2DigitYearStart(getDate(2003, Calendar.DECEMBER, 25));
\r
2138 String text = "12/25/03";
\r
2139 Calendar xcal = new GregorianCalendar();
\r
2140 xcal.setLenient(false);
\r
2141 ParsePosition pp = new ParsePosition(0);
\r
2142 fmt.parse(text, xcal, pp); // should get parse error on second field, not lenient
\r
2143 if (pp.getErrorIndex() == -1) {
\r
2144 errln("Expected parse error");
\r
2146 logln("three ok");
\r
2151 public void TestChineseDateFormatLocalizedPatternChars() {
\r
2153 // make sure we can display localized versions of the chars used in the default
\r
2154 // chinese date format patterns
\r
2155 Calendar chineseCalendar = new ChineseCalendar();
\r
2156 chineseCalendar.setTimeInMillis((new Date()).getTime());
\r
2157 SimpleDateFormat longChineseDateFormat =
\r
2158 (SimpleDateFormat)chineseCalendar.getDateTimeFormat(DateFormat.LONG, DateFormat.LONG, Locale.CHINA );
\r
2159 DateFormatSymbols dfs = new ChineseDateFormatSymbols( chineseCalendar, Locale.CHINA );
\r
2160 longChineseDateFormat.setDateFormatSymbols( dfs );
\r
2161 // This next line throws the exception
\r
2163 longChineseDateFormat.toLocalizedPattern();
\r
2165 catch (Exception e) {
\r
2166 errln("could not localized pattern: " + e.getMessage());
\r
2170 public void TestCoverage() {
\r
2171 Date now = new Date();
\r
2172 Calendar cal = new GregorianCalendar();
\r
2173 DateFormat f = DateFormat.getTimeInstance();
\r
2174 logln("time: " + f.format(now));
\r
2176 int hash = f.hashCode(); // sigh, everyone overrides this
\r
2178 f = DateFormat.getInstance(cal);
\r
2179 if(hash == f.hashCode()){
\r
2180 errln("FAIL: hashCode equal for inequal objects");
\r
2182 logln("time again: " + f.format(now));
\r
2184 f = DateFormat.getTimeInstance(cal, DateFormat.FULL);
\r
2185 logln("time yet again: " + f.format(now));
\r
2187 f = DateFormat.getDateInstance();
\r
2188 logln("time yet again: " + f.format(now));
\r
2190 ICUResourceBundle rb = (ICUResourceBundle)UResourceBundle.getBundleInstance(ICUResourceBundle.ICU_BASE_NAME,"de_DE");
\r
2191 DateFormatSymbols sym = new DateFormatSymbols(rb, Locale.GERMANY);
\r
2192 DateFormatSymbols sym2 = (DateFormatSymbols)sym.clone();
\r
2193 if (sym.hashCode() != sym2.hashCode()) {
\r
2194 errln("fail, date format symbols hashcode not equal");
\r
2196 if (!sym.equals(sym2)) {
\r
2197 errln("fail, date format symbols not equal");
\r
2200 Locale foo = new Locale("fu", "FU", "BAR");
\r
2202 sym = new DateFormatSymbols(GregorianCalendar.class, foo);
\r
2205 sym = new ChineseDateFormatSymbols();
\r
2206 sym = new ChineseDateFormatSymbols(new Locale("en_US"));
\r
2208 sym = new ChineseDateFormatSymbols(null, new Locale("en_US"));
\r
2209 errln("ChineseDateFormatSymbols(Calender, Locale) was suppose to return a null " +
\r
2210 "pointer exception for a null paramater.");
\r
2211 } catch(Exception e){}
\r
2212 sym = new ChineseDateFormatSymbols(new ChineseCalendar(), new Locale("en_US"));
\r
2214 sym = new ChineseDateFormatSymbols(null, new ULocale("en_US"));
\r
2215 errln("ChineseDateFormatSymbols(Calender, ULocale) was suppose to return a null " +
\r
2216 "pointer exception for a null paramater.");
\r
2217 } catch(Exception e){}
\r
2218 sym = new ChineseDateFormatSymbols(new ChineseCalendar(), foo);
\r
2219 // cover new ChineseDateFormatSymbols(Calendar, ULocale)
\r
2220 ChineseCalendar ccal = new ChineseCalendar();
\r
2221 sym = new ChineseDateFormatSymbols(ccal, ULocale.CHINA); //gclsh1 add
\r
2223 StringBuffer buf = new StringBuffer();
\r
2224 FieldPosition pos = new FieldPosition(0);
\r
2226 f.format((Object)cal, buf, pos);
\r
2227 f.format((Object)now, buf, pos);
\r
2228 f.format((Object)new Long(now.getTime()), buf, pos);
\r
2230 f.format((Object)"Howdy", buf, pos);
\r
2232 catch (Exception e) {
\r
2235 NumberFormat nf = f.getNumberFormat();
\r
2236 f.setNumberFormat(nf);
\r
2238 boolean lenient = f.isLenient();
\r
2239 f.setLenient(lenient);
\r
2241 ULocale uloc = f.getLocale(ULocale.ACTUAL_LOCALE);
\r
2243 DateFormat sdfmt = new SimpleDateFormat();
\r
2245 if (f.hashCode() != f.hashCode()) {
\r
2246 errln("hashCode is not stable");
\r
2248 if (!f.equals(f)) {
\r
2251 if (f.equals(null)) {
\r
2252 errln("f should not equal null");
\r
2254 if (f.equals(sdfmt)) {
\r
2255 errln("A time instance shouldn't equal a default date format");
\r
2260 ChineseDateFormat fmt = new ChineseDateFormat("yymm", Locale.US);
\r
2262 fmt.parse("2"); // fewer symbols than required 2
\r
2265 catch (ParseException e) {
\r
2270 fmt.parse("2255"); // should succeed with obeycount
\r
2273 catch (ParseException e) {
\r
2278 fmt.parse("ni hao"); // not a number, should fail
\r
2279 errln("whoops ni hao");
\r
2281 catch (ParseException e) {
\r
2282 logln("ok ni hao");
\r
2286 Calendar xcal = new GregorianCalendar();
\r
2287 xcal.set(Calendar.HOUR_OF_DAY, 0);
\r
2288 DateFormat fmt = new SimpleDateFormat("k");
\r
2289 StringBuffer xbuf = new StringBuffer();
\r
2290 FieldPosition fpos = new FieldPosition(Calendar.HOUR_OF_DAY);
\r
2291 fmt.format(xcal, xbuf, fpos);
\r
2293 fmt.parse(xbuf.toString());
\r
2296 xbuf.setLength(0);
\r
2297 xcal.set(Calendar.HOUR_OF_DAY, 25);
\r
2298 fmt.format(xcal, xbuf, fpos);
\r
2299 Date d2 = fmt.parse(xbuf.toString());
\r
2300 logln("ok again - d2=" + d2);
\r
2302 catch (ParseException e) {
\r
2308 // cover gmt+hh:mm
\r
2309 DateFormat fmt = new SimpleDateFormat("MM/dd/yy z");
\r
2311 d = fmt.parse("07/10/53 GMT+10:00");
\r
2312 logln("ok : d = " + d);
\r
2314 catch (ParseException e) {
\r
2315 errln("Parse of 07/10/53 GMT+10:00 for pattern MM/dd/yy z");
\r
2318 // cover invalid separator after GMT
\r
2320 ParsePosition pp = new ParsePosition(0);
\r
2321 String text = "07/10/53 GMT=10:00";
\r
2322 d = fmt.parse(text, pp);
\r
2323 if(pp.getIndex()!=12){
\r
2324 errln("Parse of 07/10/53 GMT=10:00 for pattern MM/dd/yy z");
\r
2326 logln("Parsing of the text stopped at pos: " + pp.getIndex() + " as expected and length is "+text.length());
\r
2329 // cover bad text after GMT+.
\r
2331 fmt.parse("07/10/53 GMT+blecch");
\r
2332 logln("ok GMT+blecch");
\r
2334 catch (ParseException e) {
\r
2335 errln("whoops GMT+blecch");
\r
2338 // cover bad text after GMT+hh:.
\r
2340 fmt.parse("07/10/53 GMT+07:blecch");
\r
2341 logln("ok GMT+xx:blecch");
\r
2343 catch (ParseException e) {
\r
2344 errln("whoops GMT+xx:blecch");
\r
2347 // cover no ':' GMT+#, # < 24 (hh)
\r
2349 d = fmt.parse("07/10/53 GMT+07");
\r
2350 logln("ok GMT+07");
\r
2352 catch (ParseException e) {
\r
2353 errln("Parse of 07/10/53 GMT+07 for pattern MM/dd/yy z");
\r
2356 // cover no ':' GMT+#, # > 24 (hhmm)
\r
2358 d = fmt.parse("07/10/53 GMT+0730");
\r
2361 catch (ParseException e) {
\r
2362 errln("Parse of 07/10/53 GMT+0730 for pattern MM/dd/yy z");
\r
2365 // cover GMT+#, # with second field
\r
2367 d = fmt.parse("07/10/53 GMT+07:30:15");
\r
2368 logln("ok GMT+07:30:15");
\r
2370 catch (ParseException e) {
\r
2371 errln("Parse of 07/10/53 GMT+07:30:15 for pattern MM/dd/yy z");
\r
2374 // cover no ':' GMT+#, # with second field, no leading zero
\r
2376 d = fmt.parse("07/10/53 GMT+73015");
\r
2377 logln("ok GMT+73015");
\r
2379 catch (ParseException e) {
\r
2380 errln("Parse of 07/10/53 GMT+73015 for pattern MM/dd/yy z");
\r
2383 // cover no ':' GMT+#, # with 1 digit second field
\r
2385 d = fmt.parse("07/10/53 GMT+07300");
\r
2386 logln("ok GMT+07300");
\r
2388 catch (ParseException e) {
\r
2389 errln("Parse of 07/10/53 GMT+07300 for pattern MM/dd/yy z");
\r
2392 // cover raw digits with no leading sign (bad RFC822)
\r
2394 d = fmt.parse("07/10/53 07");
\r
2395 errln("Parse of 07/10/53 07 for pattern MM/dd/yy z passed!");
\r
2397 catch (ParseException e) {
\r
2401 // cover raw digits (RFC822)
\r
2403 d = fmt.parse("07/10/53 +07");
\r
2406 catch (ParseException e) {
\r
2407 errln("Parse of 07/10/53 +07 for pattern MM/dd/yy z failed");
\r
2410 // cover raw digits (RFC822)
\r
2412 d = fmt.parse("07/10/53 -0730");
\r
2415 catch (ParseException e) {
\r
2416 errln("Parse of 07/10/53 -00730 for pattern MM/dd/yy z failed");
\r
2419 // cover raw digits (RFC822) in DST
\r
2421 fmt.setTimeZone(TimeZone.getTimeZone("PDT"));
\r
2422 d = fmt.parse("07/10/53 -0730");
\r
2425 catch (ParseException e) {
\r
2426 errln("Parse of 07/10/53 -0730 for pattern MM/dd/yy z failed");
\r
2430 // TODO: revisit toLocalizedPattern
\r
2432 SimpleDateFormat fmt = new SimpleDateFormat("aabbcc");
\r
2434 String pat = fmt.toLocalizedPattern();
\r
2435 errln("whoops, shouldn't have been able to localize aabbcc");
\r
2437 catch (IllegalArgumentException e) {
\r
2438 logln("aabbcc localize ok");
\r
2443 SimpleDateFormat fmt = new SimpleDateFormat("'aabbcc");
\r
2445 fmt.toLocalizedPattern();
\r
2446 errln("whoops, localize unclosed quote");
\r
2448 catch (IllegalArgumentException e) {
\r
2449 logln("localize unclosed quote ok");
\r
2453 SimpleDateFormat fmt = new SimpleDateFormat("MM/dd/yy z");
\r
2454 String text = "08/15/58 DBDY"; // bogus time zone
\r
2457 errln("recognized bogus time zone DBDY");
\r
2459 catch (ParseException e) {
\r
2460 logln("time zone ex ok");
\r
2465 // force fallback to default timezone when fmt timezone
\r
2467 SimpleDateFormat fmt = new SimpleDateFormat("MM/dd/yy z");
\r
2468 // force fallback to default time zone, still fails
\r
2469 fmt.setTimeZone(TimeZone.getTimeZone("GMT+0147")); // not in equivalency group
\r
2470 String text = "08/15/58 DBDY";
\r
2473 errln("Parse of 07/10/53 DBDY for pattern MM/dd/yy z passed");
\r
2475 catch (ParseException e) {
\r
2476 logln("time zone ex2 ok");
\r
2479 // force success on fallback
\r
2480 text = "08/15/58 " + TimeZone.getDefault().getID();
\r
2483 logln("found default tz");
\r
2485 catch (ParseException e) {
\r
2486 errln("whoops, got parse exception");
\r
2491 // force fallback to symbols list of timezones when neither
\r
2492 // fmt and default timezone is named
\r
2493 SimpleDateFormat fmt = new SimpleDateFormat("MM/dd/yy z");
\r
2494 TimeZone oldtz = TimeZone.getDefault();
\r
2495 TimeZone newtz = TimeZone.getTimeZone("GMT+0137"); // nonstandard tz
\r
2496 fmt.setTimeZone(newtz);
\r
2497 TimeZone.setDefault(newtz); // todo: fix security issue
\r
2499 // fallback to symbol list, but fail
\r
2500 String text = "08/15/58 DBDY"; // try to parse the bogus time zone
\r
2503 errln("Parse of 07/10/53 DBDY for pattern MM/dd/yy z passed");
\r
2505 catch (ParseException e) {
\r
2506 logln("time zone ex3 ok");
\r
2508 catch (Exception e) {
\r
2509 // hmmm... this shouldn't happen. don't want to exit this
\r
2510 // fn with timezone improperly set, so just in case
\r
2511 TimeZone.setDefault(oldtz);
\r
2512 throw new IllegalStateException(e.getMessage());
\r
2515 // create DFS that recognizes our bogus time zone, sortof
\r
2516 DateFormatSymbols xsym = new DateFormatSymbols();
\r
2517 String[][] tzids = xsym.getZoneStrings();
\r
2518 if (tzids.length > 0) { // let's hope!
\r
2519 tzids[0][1] = "DBDY"; // change a local name
\r
2520 logln("replaced '" + tzids[0][0] + "' with DBDY");
\r
2522 xsym.setZoneStrings(tzids);
\r
2523 fmt.setDateFormatSymbols(xsym);
\r
2527 logln("we parsed DBDY (as GMT, but still...)");
\r
2529 catch (ParseException e) {
\r
2530 errln("hey, still didn't recognize DBDY");
\r
2533 TimeZone.setDefault(oldtz);
\r
2539 //cover getAvailableULocales
\r
2540 final ULocale[] locales = DateFormat.getAvailableULocales();
\r
2541 long count = locales.length;
\r
2543 errln(" got a empty list for getAvailableULocales");
\r
2545 logln("" + count + " available ulocales");
\r
2550 //cover DateFormatSymbols.getDateFormatBundle
\r
2551 cal = new GregorianCalendar();
\r
2552 Locale loc = Locale.getDefault();
\r
2553 DateFormatSymbols mysym = new DateFormatSymbols(cal, loc);
\r
2554 if (mysym == null)
\r
2555 errln("FAIL: constructs DateFormatSymbols with calendar and locale failed");
\r
2557 uloc = ULocale.getDefault();
\r
2558 // These APIs are obsolete and return null
\r
2559 ResourceBundle resb = DateFormatSymbols.getDateFormatBundle(cal, loc);
\r
2560 ResourceBundle resb2 = DateFormatSymbols.getDateFormatBundle(cal, uloc);
\r
2561 ResourceBundle resb3 = DateFormatSymbols.getDateFormatBundle(cal.getClass(), loc);
\r
2562 ResourceBundle resb4 = DateFormatSymbols.getDateFormatBundle(cal.getClass(), uloc);
\r
2564 if (resb != null) {
\r
2565 logln("resb is not null");
\r
2567 if (resb2 != null) {
\r
2568 logln("resb2 is not null");
\r
2570 if (resb3 != null) {
\r
2571 logln("resb3 is not null");
\r
2573 if (resb4 != null) {
\r
2574 logln("resb4 is not null");
\r
2579 //cover DateFormatSymbols.getInstance
\r
2580 DateFormatSymbols datsym1 = DateFormatSymbols.getInstance();
\r
2581 DateFormatSymbols datsym2 = new DateFormatSymbols();
\r
2582 if (!datsym1.equals(datsym2)) {
\r
2583 errln("FAIL: DateFormatSymbols returned by getInstance()" +
\r
2584 "does not match new DateFormatSymbols().");
\r
2586 datsym1 = DateFormatSymbols.getInstance(Locale.JAPAN);
\r
2587 datsym2 = DateFormatSymbols.getInstance(ULocale.JAPAN);
\r
2588 if (!datsym1.equals(datsym2)) {
\r
2589 errln("FAIL: DateFormatSymbols returned by getInstance(Locale.JAPAN)" +
\r
2590 "does not match the one returned by getInstance(ULocale.JAPAN).");
\r
2594 //cover DateFormatSymbols.getAvailableLocales/getAvailableULocales
\r
2595 Locale[] allLocales = DateFormatSymbols.getAvailableLocales();
\r
2596 if (allLocales.length == 0) {
\r
2597 errln("FAIL: Got a empty list for DateFormatSymbols.getAvailableLocales");
\r
2599 logln("PASS: " + allLocales.length +
\r
2600 " available locales returned by DateFormatSymbols.getAvailableLocales");
\r
2603 ULocale[] allULocales = DateFormatSymbols.getAvailableULocales();
\r
2604 if (allULocales.length == 0) {
\r
2605 errln("FAIL: Got a empty list for DateFormatSymbols.getAvailableLocales");
\r
2607 logln("PASS: " + allULocales.length +
\r
2608 " available locales returned by DateFormatSymbols.getAvailableULocales");
\r
2613 public void TestStandAloneMonths()
\r
2615 String EN_DATA[] = {
\r
2616 "yyyy MM dd HH:mm:ss",
\r
2618 "yyyy LLLL dd H:mm:ss", "fp", "2004 03 10 16:36:31", "2004 March 10 16:36:31", "2004 03 10 16:36:31",
\r
2619 "yyyy LLL dd H:mm:ss", "fp", "2004 03 10 16:36:31", "2004 Mar 10 16:36:31", "2004 03 10 16:36:31",
\r
2620 "yyyy LLLL dd H:mm:ss", "F", "2004 03 10 16:36:31", "2004 March 10 16:36:31",
\r
2621 "yyyy LLL dd H:mm:ss", "pf", "2004 Mar 10 16:36:31", "2004 03 10 16:36:31", "2004 Mar 10 16:36:31",
\r
2623 "LLLL", "fp", "1970 01 01 0:00:00", "January", "1970 01 01 0:00:00",
\r
2624 "LLLL", "fp", "1970 02 01 0:00:00", "February", "1970 02 01 0:00:00",
\r
2625 "LLLL", "fp", "1970 03 01 0:00:00", "March", "1970 03 01 0:00:00",
\r
2626 "LLLL", "fp", "1970 04 01 0:00:00", "April", "1970 04 01 0:00:00",
\r
2627 "LLLL", "fp", "1970 05 01 0:00:00", "May", "1970 05 01 0:00:00",
\r
2628 "LLLL", "fp", "1970 06 01 0:00:00", "June", "1970 06 01 0:00:00",
\r
2629 "LLLL", "fp", "1970 07 01 0:00:00", "July", "1970 07 01 0:00:00",
\r
2630 "LLLL", "fp", "1970 08 01 0:00:00", "August", "1970 08 01 0:00:00",
\r
2631 "LLLL", "fp", "1970 09 01 0:00:00", "September", "1970 09 01 0:00:00",
\r
2632 "LLLL", "fp", "1970 10 01 0:00:00", "October", "1970 10 01 0:00:00",
\r
2633 "LLLL", "fp", "1970 11 01 0:00:00", "November", "1970 11 01 0:00:00",
\r
2634 "LLLL", "fp", "1970 12 01 0:00:00", "December", "1970 12 01 0:00:00",
\r
2636 "LLL", "fp", "1970 01 01 0:00:00", "Jan", "1970 01 01 0:00:00",
\r
2637 "LLL", "fp", "1970 02 01 0:00:00", "Feb", "1970 02 01 0:00:00",
\r
2638 "LLL", "fp", "1970 03 01 0:00:00", "Mar", "1970 03 01 0:00:00",
\r
2639 "LLL", "fp", "1970 04 01 0:00:00", "Apr", "1970 04 01 0:00:00",
\r
2640 "LLL", "fp", "1970 05 01 0:00:00", "May", "1970 05 01 0:00:00",
\r
2641 "LLL", "fp", "1970 06 01 0:00:00", "Jun", "1970 06 01 0:00:00",
\r
2642 "LLL", "fp", "1970 07 01 0:00:00", "Jul", "1970 07 01 0:00:00",
\r
2643 "LLL", "fp", "1970 08 01 0:00:00", "Aug", "1970 08 01 0:00:00",
\r
2644 "LLL", "fp", "1970 09 01 0:00:00", "Sep", "1970 09 01 0:00:00",
\r
2645 "LLL", "fp", "1970 10 01 0:00:00", "Oct", "1970 10 01 0:00:00",
\r
2646 "LLL", "fp", "1970 11 01 0:00:00", "Nov", "1970 11 01 0:00:00",
\r
2647 "LLL", "fp", "1970 12 01 0:00:00", "Dec", "1970 12 01 0:00:00",
\r
2650 String CS_DATA[] = {
\r
2651 "yyyy MM dd HH:mm:ss",
\r
2653 "yyyy LLLL dd H:mm:ss", "fp", "2004 04 10 16:36:31", "2004 duben 10 16:36:31", "2004 04 10 16:36:31",
\r
2654 "yyyy MMMM dd H:mm:ss", "fp", "2004 04 10 16:36:31", "2004 dubna 10 16:36:31", "2004 04 10 16:36:31",
\r
2655 "yyyy LLL dd H:mm:ss", "fp", "2004 04 10 16:36:31", "2004 4. 10 16:36:31", "2004 04 10 16:36:31",
\r
2656 "yyyy LLLL dd H:mm:ss", "F", "2004 04 10 16:36:31", "2004 duben 10 16:36:31",
\r
2657 "yyyy MMMM dd H:mm:ss", "F", "2004 04 10 16:36:31", "2004 dubna 10 16:36:31",
\r
2658 "yyyy LLLL dd H:mm:ss", "pf", "2004 duben 10 16:36:31", "2004 04 10 16:36:31", "2004 duben 10 16:36:31",
\r
2659 "yyyy MMMM dd H:mm:ss", "pf", "2004 dubna 10 16:36:31", "2004 04 10 16:36:31", "2004 dubna 10 16:36:31",
\r
2661 "LLLL", "fp", "1970 01 01 0:00:00", "leden", "1970 01 01 0:00:00",
\r
2662 "LLLL", "fp", "1970 02 01 0:00:00", "\u00FAnor", "1970 02 01 0:00:00",
\r
2663 "LLLL", "fp", "1970 03 01 0:00:00", "b\u0159ezen", "1970 03 01 0:00:00",
\r
2664 "LLLL", "fp", "1970 04 01 0:00:00", "duben", "1970 04 01 0:00:00",
\r
2665 "LLLL", "fp", "1970 05 01 0:00:00", "kv\u011Bten", "1970 05 01 0:00:00",
\r
2666 "LLLL", "fp", "1970 06 01 0:00:00", "\u010Derven", "1970 06 01 0:00:00",
\r
2667 "LLLL", "fp", "1970 07 01 0:00:00", "\u010Dervenec", "1970 07 01 0:00:00",
\r
2668 "LLLL", "fp", "1970 08 01 0:00:00", "srpen", "1970 08 01 0:00:00",
\r
2669 "LLLL", "fp", "1970 09 01 0:00:00", "z\u00E1\u0159\u00ED", "1970 09 01 0:00:00",
\r
2670 "LLLL", "fp", "1970 10 01 0:00:00", "\u0159\u00EDjen", "1970 10 01 0:00:00",
\r
2671 "LLLL", "fp", "1970 11 01 0:00:00", "listopad", "1970 11 01 0:00:00",
\r
2672 "LLLL", "fp", "1970 12 01 0:00:00", "prosinec", "1970 12 01 0:00:00",
\r
2674 "LLL", "fp", "1970 01 01 0:00:00", "1.", "1970 01 01 0:00:00",
\r
2675 "LLL", "fp", "1970 02 01 0:00:00", "2.", "1970 02 01 0:00:00",
\r
2676 "LLL", "fp", "1970 03 01 0:00:00", "3.", "1970 03 01 0:00:00",
\r
2677 "LLL", "fp", "1970 04 01 0:00:00", "4.", "1970 04 01 0:00:00",
\r
2678 "LLL", "fp", "1970 05 01 0:00:00", "5.", "1970 05 01 0:00:00",
\r
2679 "LLL", "fp", "1970 06 01 0:00:00", "6.", "1970 06 01 0:00:00",
\r
2680 "LLL", "fp", "1970 07 01 0:00:00", "7.", "1970 07 01 0:00:00",
\r
2681 "LLL", "fp", "1970 08 01 0:00:00", "8.", "1970 08 01 0:00:00",
\r
2682 "LLL", "fp", "1970 09 01 0:00:00", "9.", "1970 09 01 0:00:00",
\r
2683 "LLL", "fp", "1970 10 01 0:00:00", "10.", "1970 10 01 0:00:00",
\r
2684 "LLL", "fp", "1970 11 01 0:00:00", "11.", "1970 11 01 0:00:00",
\r
2685 "LLL", "fp", "1970 12 01 0:00:00", "12.", "1970 12 01 0:00:00",
\r
2688 expect(EN_DATA, new Locale("en", "", ""));
\r
2689 expect(CS_DATA, new Locale("cs", "", ""));
\r
2692 public void TestStandAloneDays()
\r
2694 String EN_DATA[] = {
\r
2695 "yyyy MM dd HH:mm:ss",
\r
2697 "cccc", "fp", "1970 01 04 0:00:00", "Sunday", "1970 01 04 0:00:00",
\r
2698 "cccc", "fp", "1970 01 05 0:00:00", "Monday", "1970 01 05 0:00:00",
\r
2699 "cccc", "fp", "1970 01 06 0:00:00", "Tuesday", "1970 01 06 0:00:00",
\r
2700 "cccc", "fp", "1970 01 07 0:00:00", "Wednesday", "1970 01 07 0:00:00",
\r
2701 "cccc", "fp", "1970 01 01 0:00:00", "Thursday", "1970 01 01 0:00:00",
\r
2702 "cccc", "fp", "1970 01 02 0:00:00", "Friday", "1970 01 02 0:00:00",
\r
2703 "cccc", "fp", "1970 01 03 0:00:00", "Saturday", "1970 01 03 0:00:00",
\r
2705 "ccc", "fp", "1970 01 04 0:00:00", "Sun", "1970 01 04 0:00:00",
\r
2706 "ccc", "fp", "1970 01 05 0:00:00", "Mon", "1970 01 05 0:00:00",
\r
2707 "ccc", "fp", "1970 01 06 0:00:00", "Tue", "1970 01 06 0:00:00",
\r
2708 "ccc", "fp", "1970 01 07 0:00:00", "Wed", "1970 01 07 0:00:00",
\r
2709 "ccc", "fp", "1970 01 01 0:00:00", "Thu", "1970 01 01 0:00:00",
\r
2710 "ccc", "fp", "1970 01 02 0:00:00", "Fri", "1970 01 02 0:00:00",
\r
2711 "ccc", "fp", "1970 01 03 0:00:00", "Sat", "1970 01 03 0:00:00",
\r
2714 String CS_DATA[] = {
\r
2715 "yyyy MM dd HH:mm:ss",
\r
2717 "cccc", "fp", "1970 01 04 0:00:00", "ned\u011Ble", "1970 01 04 0:00:00",
\r
2718 "cccc", "fp", "1970 01 05 0:00:00", "pond\u011Bl\u00ED", "1970 01 05 0:00:00",
\r
2719 "cccc", "fp", "1970 01 06 0:00:00", "\u00FAter\u00FD", "1970 01 06 0:00:00",
\r
2720 "cccc", "fp", "1970 01 07 0:00:00", "st\u0159eda", "1970 01 07 0:00:00",
\r
2721 "cccc", "fp", "1970 01 01 0:00:00", "\u010Dtvrtek", "1970 01 01 0:00:00",
\r
2722 "cccc", "fp", "1970 01 02 0:00:00", "p\u00E1tek", "1970 01 02 0:00:00",
\r
2723 "cccc", "fp", "1970 01 03 0:00:00", "sobota", "1970 01 03 0:00:00",
\r
2725 "ccc", "fp", "1970 01 04 0:00:00", "ne", "1970 01 04 0:00:00",
\r
2726 "ccc", "fp", "1970 01 05 0:00:00", "po", "1970 01 05 0:00:00",
\r
2727 "ccc", "fp", "1970 01 06 0:00:00", "\u00FAt", "1970 01 06 0:00:00",
\r
2728 "ccc", "fp", "1970 01 07 0:00:00", "st", "1970 01 07 0:00:00",
\r
2729 "ccc", "fp", "1970 01 01 0:00:00", "\u010Dt", "1970 01 01 0:00:00",
\r
2730 "ccc", "fp", "1970 01 02 0:00:00", "p\u00E1", "1970 01 02 0:00:00",
\r
2731 "ccc", "fp", "1970 01 03 0:00:00", "so", "1970 01 03 0:00:00",
\r
2734 expect(EN_DATA, new Locale("en", "", ""));
\r
2735 expect(CS_DATA, new Locale("cs", "", ""));
\r
2738 public void TestNarrowNames()
\r
2740 String EN_DATA[] = {
\r
2741 "yyyy MM dd HH:mm:ss",
\r
2743 "yyyy MMMMM dd H:mm:ss", "2004 03 10 16:36:31", "2004 M 10 16:36:31",
\r
2744 "yyyy LLLLL dd H:mm:ss", "2004 03 10 16:36:31", "2004 M 10 16:36:31",
\r
2746 "MMMMM", "1970 01 01 0:00:00", "J",
\r
2747 "MMMMM", "1970 02 01 0:00:00", "F",
\r
2748 "MMMMM", "1970 03 01 0:00:00", "M",
\r
2749 "MMMMM", "1970 04 01 0:00:00", "A",
\r
2750 "MMMMM", "1970 05 01 0:00:00", "M",
\r
2751 "MMMMM", "1970 06 01 0:00:00", "J",
\r
2752 "MMMMM", "1970 07 01 0:00:00", "J",
\r
2753 "MMMMM", "1970 08 01 0:00:00", "A",
\r
2754 "MMMMM", "1970 09 01 0:00:00", "S",
\r
2755 "MMMMM", "1970 10 01 0:00:00", "O",
\r
2756 "MMMMM", "1970 11 01 0:00:00", "N",
\r
2757 "MMMMM", "1970 12 01 0:00:00", "D",
\r
2759 "LLLLL", "1970 01 01 0:00:00", "J",
\r
2760 "LLLLL", "1970 02 01 0:00:00", "F",
\r
2761 "LLLLL", "1970 03 01 0:00:00", "M",
\r
2762 "LLLLL", "1970 04 01 0:00:00", "A",
\r
2763 "LLLLL", "1970 05 01 0:00:00", "M",
\r
2764 "LLLLL", "1970 06 01 0:00:00", "J",
\r
2765 "LLLLL", "1970 07 01 0:00:00", "J",
\r
2766 "LLLLL", "1970 08 01 0:00:00", "A",
\r
2767 "LLLLL", "1970 09 01 0:00:00", "S",
\r
2768 "LLLLL", "1970 10 01 0:00:00", "O",
\r
2769 "LLLLL", "1970 11 01 0:00:00", "N",
\r
2770 "LLLLL", "1970 12 01 0:00:00", "D",
\r
2772 "EEEEE", "1970 01 04 0:00:00", "S",
\r
2773 "EEEEE", "1970 01 05 0:00:00", "M",
\r
2774 "EEEEE", "1970 01 06 0:00:00", "T",
\r
2775 "EEEEE", "1970 01 07 0:00:00", "W",
\r
2776 "EEEEE", "1970 01 01 0:00:00", "T",
\r
2777 "EEEEE", "1970 01 02 0:00:00", "F",
\r
2778 "EEEEE", "1970 01 03 0:00:00", "S",
\r
2780 "ccccc", "1970 01 04 0:00:00", "S",
\r
2781 "ccccc", "1970 01 05 0:00:00", "M",
\r
2782 "ccccc", "1970 01 06 0:00:00", "T",
\r
2783 "ccccc", "1970 01 07 0:00:00", "W",
\r
2784 "ccccc", "1970 01 01 0:00:00", "T",
\r
2785 "ccccc", "1970 01 02 0:00:00", "F",
\r
2786 "ccccc", "1970 01 03 0:00:00", "S",
\r
2789 String CS_DATA[] = {
\r
2790 "yyyy MM dd HH:mm:ss",
\r
2792 "yyyy LLLLL dd H:mm:ss", "2004 04 10 16:36:31", "2004 d 10 16:36:31",
\r
2793 "yyyy MMMMM dd H:mm:ss", "2004 04 10 16:36:31", "2004 d 10 16:36:31",
\r
2795 "MMMMM", "1970 01 01 0:00:00", "l",
\r
2796 "MMMMM", "1970 02 01 0:00:00", "\u00FA",
\r
2797 "MMMMM", "1970 03 01 0:00:00", "b",
\r
2798 "MMMMM", "1970 04 01 0:00:00", "d",
\r
2799 "MMMMM", "1970 05 01 0:00:00", "k",
\r
2800 "MMMMM", "1970 06 01 0:00:00", "\u010D",
\r
2801 "MMMMM", "1970 07 01 0:00:00", "\u010D",
\r
2802 "MMMMM", "1970 08 01 0:00:00", "s",
\r
2803 "MMMMM", "1970 09 01 0:00:00", "z",
\r
2804 "MMMMM", "1970 10 01 0:00:00", "\u0159",
\r
2805 "MMMMM", "1970 11 01 0:00:00", "l",
\r
2806 "MMMMM", "1970 12 01 0:00:00", "p",
\r
2808 "LLLLL", "1970 01 01 0:00:00", "l",
\r
2809 "LLLLL", "1970 02 01 0:00:00", "\u00FA",
\r
2810 "LLLLL", "1970 03 01 0:00:00", "b",
\r
2811 "LLLLL", "1970 04 01 0:00:00", "d",
\r
2812 "LLLLL", "1970 05 01 0:00:00", "k",
\r
2813 "LLLLL", "1970 06 01 0:00:00", "\u010D",
\r
2814 "LLLLL", "1970 07 01 0:00:00", "\u010D",
\r
2815 "LLLLL", "1970 08 01 0:00:00", "s",
\r
2816 "LLLLL", "1970 09 01 0:00:00", "z",
\r
2817 "LLLLL", "1970 10 01 0:00:00", "\u0159",
\r
2818 "LLLLL", "1970 11 01 0:00:00", "l",
\r
2819 "LLLLL", "1970 12 01 0:00:00", "p",
\r
2821 "EEEEE", "1970 01 04 0:00:00", "N",
\r
2822 "EEEEE", "1970 01 05 0:00:00", "P",
\r
2823 "EEEEE", "1970 01 06 0:00:00", "\u00DA",
\r
2824 "EEEEE", "1970 01 07 0:00:00", "S",
\r
2825 "EEEEE", "1970 01 01 0:00:00", "\u010C",
\r
2826 "EEEEE", "1970 01 02 0:00:00", "P",
\r
2827 "EEEEE", "1970 01 03 0:00:00", "S",
\r
2829 "ccccc", "1970 01 04 0:00:00", "N",
\r
2830 "ccccc", "1970 01 05 0:00:00", "P",
\r
2831 "ccccc", "1970 01 06 0:00:00", "\u00DA",
\r
2832 "ccccc", "1970 01 07 0:00:00", "S",
\r
2833 "ccccc", "1970 01 01 0:00:00", "\u010C",
\r
2834 "ccccc", "1970 01 02 0:00:00", "P",
\r
2835 "ccccc", "1970 01 03 0:00:00", "S",
\r
2838 expectFormat(EN_DATA, new Locale("en", "", ""));
\r
2839 expectFormat(CS_DATA, new Locale("cs", "", ""));
\r
2842 public void TestEras()
\r
2844 String EN_DATA[] = {
\r
2847 "MMMM dd yyyy G", "fp", "1951 07 17", "July 17 1951 AD", "1951 07 17",
\r
2848 "MMMM dd yyyy GG", "fp", "1951 07 17", "July 17 1951 AD", "1951 07 17",
\r
2849 "MMMM dd yyyy GGG", "fp", "1951 07 17", "July 17 1951 AD", "1951 07 17",
\r
2850 "MMMM dd yyyy GGGG", "fp", "1951 07 17", "July 17 1951 Anno Domini", "1951 07 17",
\r
2852 "MMMM dd yyyy G", "fp", "-438 07 17", "July 17 0439 BC", "-438 07 17",
\r
2853 "MMMM dd yyyy GG", "fp", "-438 07 17", "July 17 0439 BC", "-438 07 17",
\r
2854 "MMMM dd yyyy GGG", "fp", "-438 07 17", "July 17 0439 BC", "-438 07 17",
\r
2855 "MMMM dd yyyy GGGG", "fp", "-438 07 17", "July 17 0439 Before Christ", "-438 07 17",
\r
2858 expect(EN_DATA, new Locale("en", "", ""));
\r
2861 public void TestQuarters()
\r
2863 String EN_DATA[] = {
\r
2866 "Q", "fp", "1970 01 01", "1", "1970 01 01",
\r
2867 "QQ", "fp", "1970 04 01", "02", "1970 04 01",
\r
2868 "QQQ", "fp", "1970 07 01", "Q3", "1970 07 01",
\r
2869 "QQQQ", "fp", "1970 10 01", "4th quarter", "1970 10 01",
\r
2871 "q", "fp", "1970 01 01", "1", "1970 01 01",
\r
2872 "qq", "fp", "1970 04 01", "02", "1970 04 01",
\r
2873 "qqq", "fp", "1970 07 01", "Q3", "1970 07 01",
\r
2874 "qqqq", "fp", "1970 10 01", "4th quarter", "1970 10 01",
\r
2877 expect(EN_DATA, new Locale("en", "", ""));
\r
2882 * Test DateFormat's parsing of default GMT variants. See ticket#6135
\r
2884 public void TestGMTParsing() {
\r
2888 // pattern, input, expected output (in quotes)
\r
2889 "HH:mm:ss Z", "10:20:30 GMT+03:00", "10:20:30 +0300",
\r
2890 "HH:mm:ss Z", "10:20:30 UT-02:00", "10:20:30 -0200",
\r
2891 "HH:mm:ss Z", "10:20:30 GMT", "10:20:30 +0000",
\r
2892 "HH:mm:ss vvvv", "10:20:30 UT+10:00", "10:20:30 +1000",
\r
2893 "HH:mm:ss zzzz", "10:20:30 UTC", "10:20:30 +0000", // standalone "UTC"
\r
2894 "ZZZZ HH:mm:ss", "UT 10:20:30", "10:20:30 +0000",
\r
2895 "V HH:mm:ss", "UT+0130 10:20:30", "10:20:30 +0130",
\r
2896 "V HH:mm:ss", "UTC+0130 10:20:30", null, // UTC+0130 is not a supported pattern
\r
2897 "HH mm Z ss", "10 20 GMT-1100 30", "10:20:30 -1100",
\r
2899 expectParse(DATA, new Locale("en", "", ""));
\r
2903 * Test parsing. Input is an array that starts with the following
\r
2906 * [0] = pattern string to parse [i+2] with
\r
2908 * followed by test cases, each of which is 3 array elements:
\r
2910 * [i] = pattern, or null to reuse prior pattern
\r
2911 * [i+1] = input string
\r
2912 * [i+2] = expected parse result (parsed with pattern [0])
\r
2914 * If expect parse failure, then [i+2] should be null.
\r
2916 void expectParse(String[] data, Locale loc) {
\r
2918 String FAIL_STR = "parse failure";
\r
2921 SimpleDateFormat fmt = new SimpleDateFormat("", loc);
\r
2922 SimpleDateFormat ref = new SimpleDateFormat(data[i++], loc);
\r
2923 SimpleDateFormat gotfmt = new SimpleDateFormat("G yyyy MM dd HH:mm:ss z", loc);
\r
2925 String currentPat = null;
\r
2926 while (i<data.length) {
\r
2927 String pattern = data[i++];
\r
2928 String input = data[i++];
\r
2929 String expected = data[i++];
\r
2931 if (pattern != null) {
\r
2932 fmt.applyPattern(pattern);
\r
2933 currentPat = pattern;
\r
2935 String gotstr = FAIL_STR;
\r
2938 got = fmt.parse(input);
\r
2939 gotstr = gotfmt.format(got);
\r
2940 } catch (ParseException e1) {
\r
2945 String expstr = FAIL_STR;
\r
2946 if (expected != null) {
\r
2947 expstr = expected;
\r
2949 exp = ref.parse(expstr);
\r
2950 } catch (ParseException e2) {
\r
2951 errln("FAIL: Internal test error");
\r
2955 if (got == exp || (got != null && got.equals(exp))) {
\r
2956 logln("Ok: " + input + " x " +
\r
2957 currentPat + " => " + gotstr);
\r
2959 errln("FAIL: " + input + " x " +
\r
2960 currentPat + " => " + gotstr + ", expected " +
\r
2967 * Test formatting. Input is an array of String that starts
\r
2968 * with a single 'header' element
\r
2970 * [0] = reference dateformat pattern string (ref)
\r
2972 * followed by test cases, each of which is 4 or 5 elements:
\r
2974 * [i] = test dateformat pattern string (test), or null to reuse prior test pattern
\r
2975 * [i+1] = data string A
\r
2976 * [i+2] = data string B
\r
2978 * Formats a date, checks the result.
\r
2981 * "y/M/d H:mm:ss.SSS", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.567"
\r
2982 * -- ref.parse A, get t0
\r
2983 * -- test.format t0, get r0
\r
2984 * -- compare r0 to B, fail if not equal
\r
2986 void expectFormat(String[] data, Locale loc)
\r
2989 String currentPat = null;
\r
2990 SimpleDateFormat ref = new SimpleDateFormat(data[0], loc);
\r
2992 while (i<data.length) {
\r
2993 SimpleDateFormat fmt = new SimpleDateFormat("", loc);
\r
2994 String pattern = data[i++];
\r
2995 if (pattern != null) {
\r
2996 fmt.applyPattern(pattern);
\r
2997 currentPat = pattern;
\r
3000 String datestr = data[i++];
\r
3001 String string = data[i++];
\r
3005 date = ref.parse(datestr);
\r
3006 } catch (ParseException e) {
\r
3007 errln("FAIL: Internal test error; can't parse " + datestr);
\r
3011 assertEquals("\"" + currentPat + "\".format(" + datestr + ")",
\r
3013 fmt.format(date));
\r
3018 * Test formatting and parsing. Input is an array of String that starts
\r
3019 * with a single 'header' element
\r
3021 * [0] = reference dateformat pattern string (ref)
\r
3023 * followed by test cases, each of which is 4 or 5 elements:
\r
3025 * [i] = test dateformat pattern string (test), or null to reuse prior test pattern
\r
3026 * [i+1] = control string, either "fp", "pf", or "F".
\r
3027 * [i+2] = data string A
\r
3028 * [i+3] = data string B
\r
3029 * [i+4] = data string C (not present for 'F' control string)
\r
3031 * Note: the number of data strings depends on the control string.
\r
3033 * fp formats a date, checks the result, then parses the result and checks against a (possibly different) date
\r
3034 * pf parses a string, checks the result, then formats the result and checks against a (possibly different) string
\r
3035 * F is a shorthand for fp when the second date is the same as the first
\r
3036 * P is a shorthand for pf when the second string is the same as the first
\r
3039 * (fp) "y/M/d H:mm:ss.SS", "fp", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.56", "2004 03 10 16:36:31.560",
\r
3040 * -- ref.parse A, get t0
\r
3041 * -- test.format t0, get r0
\r
3042 * -- compare r0 to B, fail if not equal
\r
3043 * -- test.parse B, get t1
\r
3044 * -- ref.parse C, get t2
\r
3045 * -- compare t1 and t2, fail if not equal
\r
3047 * (F) "y/M/d H:mm:ss.SSS", "F", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.567"
\r
3048 * -- ref.parse A, get t0
\r
3049 * -- test.format t0, get r0
\r
3050 * -- compare r0 to B, fail if not equal
\r
3051 * -- test.parse B, get t1
\r
3052 * -- compare t1 and t0, fail if not equal
\r
3054 * (pf) "y/M/d H:mm:ss.SSSS", "pf", "2004/3/10 16:36:31.5679", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.5670",
\r
3055 * -- test.parse A, get t0
\r
3056 * -- ref.parse B, get t1
\r
3057 * -- compare t0 to t1, fail if not equal
\r
3058 * -- test.format t1, get r0
\r
3059 * -- compare r0 and C, fail if not equal
\r
3061 * (P) "y/M/d H:mm:ss.SSSS", "P", "2004/3/10 16:36:31.5679", "2004 03 10 16:36:31.567"",
\r
3062 * -- test.parse A, get t0
\r
3063 * -- ref.parse B, get t1
\r
3064 * -- compare t0 to t1, fail if not equal
\r
3065 * -- test.format t1, get r0
\r
3066 * -- compare r0 and A, fail if not equal
\r
3068 void expect(String[] data, Locale loc) {
\r
3070 SimpleDateFormat univ = new SimpleDateFormat("EE G yyyy MM dd HH:mm:ss.SSS zzz", loc);
\r
3071 String currentPat = null;
\r
3072 SimpleDateFormat ref = new SimpleDateFormat(data[0], loc);
\r
3074 while (i<data.length) {
\r
3075 SimpleDateFormat fmt = new SimpleDateFormat("", loc);
\r
3076 String pattern = data[i++];
\r
3077 if (pattern != null) {
\r
3078 fmt.applyPattern(pattern);
\r
3079 currentPat = pattern;
\r
3082 String control = data[i++];
\r
3084 if (control.equals("fp") || control.equals("F")) {
\r
3086 String datestr = data[i++];
\r
3087 String string = data[i++];
\r
3088 String datestr2 = datestr;
\r
3089 if (control.length() == 2) {
\r
3090 datestr2 = data[i++];
\r
3094 date = ref.parse(datestr);
\r
3095 } catch (ParseException e) {
\r
3096 errln("FAIL: Internal test error; can't parse " + datestr);
\r
3099 assertEquals("\"" + currentPat + "\".format(" + datestr + ")",
\r
3101 fmt.format(date));
\r
3103 if (!datestr2.equals(datestr)) {
\r
3105 date = ref.parse(datestr2);
\r
3106 } catch (ParseException e2) {
\r
3107 errln("FAIL: Internal test error; can't parse " + datestr2);
\r
3112 Date parsedate = fmt.parse(string);
\r
3113 assertEquals("\"" + currentPat + "\".parse(" + string + ")",
\r
3114 univ.format(date),
\r
3115 univ.format(parsedate));
\r
3116 } catch (ParseException e3) {
\r
3117 errln("FAIL: \"" + currentPat + "\".parse(" + string + ") => " +
\r
3122 else if (control.equals("pf") || control.equals("P")) {
\r
3124 String string = data[i++];
\r
3125 String datestr = data[i++];
\r
3126 String string2 = string;
\r
3127 if (control.length() == 2) {
\r
3128 string2 = data[i++];
\r
3133 date = ref.parse(datestr);
\r
3134 } catch (ParseException e) {
\r
3135 errln("FAIL: Internal test error; can't parse " + datestr);
\r
3139 Date parsedate = fmt.parse(string);
\r
3140 assertEquals("\"" + currentPat + "\".parse(" + string + ")",
\r
3141 univ.format(date),
\r
3142 univ.format(parsedate));
\r
3143 } catch (ParseException e2) {
\r
3144 errln("FAIL: \"" + currentPat + "\".parse(" + string + ") => " +
\r
3149 assertEquals("\"" + currentPat + "\".format(" + datestr + ")",
\r
3151 fmt.format(date));
\r
3154 errln("FAIL: Invalid control string " + control);
\r
3160 public void TestJB4757(){
\r
3161 DateFormat dfmt = DateFormat.getDateInstance(DateFormat.FULL, ULocale.ROOT);
\r
3166 * Test case for formatToCharacterIterator
\r
3168 public void TestFormatToCharacterIterator() {
\r
3169 // Generate pattern string including all pattern letters with various length
\r
3170 AttributedCharacterIterator acit;
\r
3171 final char SEPCHAR = '~';
\r
3172 String[] patterns = new String[5];
\r
3173 StringBuffer sb = new StringBuffer();
\r
3174 for (int i = 0; i < patterns.length; i++) {
\r
3176 for (int j = 0; j < PATTERN_CHARS.length(); j++) {
\r
3178 for (int k = 0; k <= i; k++) {
\r
3179 sb.append(SEPCHAR);
\r
3182 char letter = PATTERN_CHARS.charAt(j);
\r
3183 for (int k = 0; k <= i; k++) {
\r
3184 sb.append(letter);
\r
3187 patterns[i] = sb.toString();
\r
3189 if (isVerbose()) {
\r
3190 for (int i = 0; i < patterns.length; i++) {
\r
3191 logln("patterns[" + i + "] = " + patterns[i]);
\r
3195 Calendar cal = Calendar.getInstance();
\r
3196 cal.set(2007, Calendar.JULY, 16, 8, 20, 25);
\r
3197 cal.set(Calendar.MILLISECOND, 567);
\r
3198 final Date d = cal.getTime();
\r
3200 // Test AttributedCharacterIterator returned by SimpleDateFormat
\r
3201 for (int i = 0; i < patterns.length; i++) {
\r
3202 SimpleDateFormat sdf = new SimpleDateFormat(patterns[i]);
\r
3203 acit = sdf.formatToCharacterIterator(d);
\r
3207 Map map = acit.getAttributes();
\r
3208 int limit = acit.getRunLimit();
\r
3209 if (map.isEmpty()) {
\r
3210 // Must be pattern literal - '~'
\r
3211 while (acit.getIndex() < limit) {
\r
3212 if (acit.current() != SEPCHAR) {
\r
3213 errln("FAIL: Invalid pattern literal at " + acit.current() + " in patterns[" + i + "]");
\r
3218 Set keySet = map.keySet();
\r
3219 if (keySet.size() == 1) {
\r
3220 // Check the attribute
\r
3221 Iterator keyIterator = keySet.iterator();
\r
3222 DateFormat.Field attr = (DateFormat.Field)keyIterator.next();
\r
3223 if (!DATEFORMAT_FIELDS[patidx].equals(attr)) {
\r
3224 errln("FAIL: The attribute at " + acit.getIndex() + " in patterns[" + i + "" +
\r
3225 "] is " + attr + " - Expected: " + DATEFORMAT_FIELDS[patidx]);
\r
3228 // SimpleDateFormat#formatToCharacterIterator never set multiple
\r
3229 // attributes to a single text run.
\r
3230 errln("FAIL: Multiple attributes were set");
\r
3233 // Move to the run limit
\r
3234 acit.setIndex(limit);
\r
3236 if (acit.current() == CharacterIterator.DONE) {
\r
3242 // ChineseDateFormat has pattern letter 'l' for leap month marker in addition to regular DateFormat
\r
3244 cal.set(2009, Calendar.JUNE, 22); // 26x78-5-30
\r
3245 Date nonLeapMonthDate = cal.getTime(); // non-leap month
\r
3246 cal.set(2009, Calendar.JUNE, 23); // 26x78-5*-1
\r
3247 Date leapMonthDate = cal.getTime(); // leap month
\r
3249 ChineseDateFormat cdf = new ChineseDateFormat("y'x'G-Ml-d", ULocale.US);
\r
3250 acit = cdf.formatToCharacterIterator(nonLeapMonthDate);
\r
3251 Set keys = acit.getAllAttributeKeys();
\r
3252 if (keys.contains(ChineseDateFormat.Field.IS_LEAP_MONTH)) {
\r
3253 errln("FAIL: IS_LEAP_MONTH attribute must not present for Chinese calendar date "
\r
3254 + cdf.format(nonLeapMonthDate));
\r
3256 acit = cdf.formatToCharacterIterator(leapMonthDate);
\r
3257 keys = acit.getAllAttributeKeys();
\r
3258 if (!keys.contains(ChineseDateFormat.Field.IS_LEAP_MONTH)) {
\r
3259 errln("FAIL: IS_LEAP_MONTH attribute must present for Chinese calendar date "
\r
3260 + cdf.format(leapMonthDate));
\r
3265 * API coverage test case for formatToCharacterIterator
\r
3267 public void TestFormatToCharacterIteratorCoverage() {
\r
3268 // Calling formatToCharacterIterator, using various argument types
\r
3269 DateFormat df = DateFormat.getDateTimeInstance();
\r
3270 AttributedCharacterIterator acit = null;
\r
3272 Calendar cal = Calendar.getInstance();
\r
3274 acit = df.formatToCharacterIterator(cal);
\r
3275 if (acit == null) {
\r
3276 errln("FAIL: null AttributedCharacterIterator returned by formatToCharacterIterator(Calendar)");
\r
3278 } catch (IllegalArgumentException iae) {
\r
3279 errln("FAIL: Calendar must be accepted by formatToCharacterIterator");
\r
3282 Date d = cal.getTime();
\r
3284 acit = df.formatToCharacterIterator(d);
\r
3285 if (acit == null) {
\r
3286 errln("FAIL: null AttributedCharacterIterator returned by formatToCharacterIterator(Date)");
\r
3288 } catch (IllegalArgumentException iae) {
\r
3289 errln("FAIL: Date must be accepted by formatToCharacterIterator");
\r
3292 Number num = new Long(d.getTime());
\r
3294 acit = df.formatToCharacterIterator(num);
\r
3295 if (acit == null) {
\r
3296 errln("FAIL: null AttributedCharacterIterator returned by formatToCharacterIterator(Number)");
\r
3298 } catch (IllegalArgumentException iae) {
\r
3299 errln("FAIL: Number must be accepted by formatToCharacterIterator");
\r
3302 boolean isException = false;
\r
3303 String str = df.format(d);
\r
3305 acit = df.formatToCharacterIterator(str);
\r
3306 if (acit == null) {
\r
3307 errln("FAIL: null AttributedCharacterIterator returned by formatToCharacterIterator(String)");
\r
3309 } catch (IllegalArgumentException iae) {
\r
3310 logln("IllegalArgumentException is thrown by formatToCharacterIterator");
\r
3311 isException = true;
\r
3313 if (!isException) {
\r
3314 errln("FAIL: String must not be accepted by formatToCharacterIterator");
\r
3317 // DateFormat.Field#ofCalendarField and getCalendarField
\r
3318 for (int i = 0; i < DATEFORMAT_FIELDS.length; i++) {
\r
3319 int calField = DATEFORMAT_FIELDS[i].getCalendarField();
\r
3320 if (calField != -1) {
\r
3321 DateFormat.Field field = DateFormat.Field.ofCalendarField(calField);
\r
3322 if (field != DATEFORMAT_FIELDS[i]) {
\r
3323 errln("FAIL: " + field + " is returned for a Calendar field " + calField
\r
3324 + " - Expected: " + DATEFORMAT_FIELDS[i]);
\r
3329 // IllegalArgument for ofCalendarField
\r
3330 isException = false;
\r
3332 DateFormat.Field.ofCalendarField(-1);
\r
3333 } catch (IllegalArgumentException iae) {
\r
3334 logln("IllegalArgumentException is thrown by ofCalendarField");
\r
3335 isException = true;
\r
3337 if (!isException) {
\r
3338 errln("FAIL: IllegalArgumentException must be thrown by ofCalendarField for calendar field value -1");
\r
3341 // ChineseDateFormat.Field#ofCalendarField and getCalendarField
\r
3342 int ccalField = ChineseDateFormat.Field.IS_LEAP_MONTH.getCalendarField();
\r
3343 if (ccalField != Calendar.IS_LEAP_MONTH) {
\r
3344 errln("FAIL: ChineseCalendar field " + ccalField + " is returned for ChineseDateFormat.Field.IS_LEAP_MONTH.getCalendarField()");
\r
3346 DateFormat.Field cfield = ChineseDateFormat.Field.ofCalendarField(ccalField);
\r
3347 if (cfield != ChineseDateFormat.Field.IS_LEAP_MONTH) {
\r
3348 errln("FAIL: " + cfield + " is returned for a ChineseCalendar field " + ccalField
\r
3349 + " - Expected: " + ChineseDateFormat.Field.IS_LEAP_MONTH);
\r
3355 * Test for checking SimpleDateFormat/DateFormatSymbols creation
\r
3356 * honor the calendar keyword in the given locale. See ticket#6100
\r
3358 public void TestCalendarType() {
\r
3359 final String testPattern = "GGGG y MMMM d EEEE";
\r
3361 final ULocale[] testLocales = {
\r
3362 new ULocale("de"),
\r
3363 new ULocale("fr_FR@calendar=gregorian"),
\r
3364 new ULocale("en@calendar=islamic"),
\r
3365 new ULocale("ja_JP@calendar=japanese"),
\r
3366 new ULocale("zh_Hans_CN@calendar=bogus"),
\r
3369 SimpleDateFormat[] formatters = new SimpleDateFormat[5];
\r
3370 for (int i = 0; i < testLocales.length; i++) {
\r
3371 // Create a locale with no keywords
\r
3372 StringBuffer locStrBuf = new StringBuffer();
\r
3373 if (testLocales[i].getLanguage().length() > 0) {
\r
3374 locStrBuf.append(testLocales[i].getLanguage());
\r
3376 if (testLocales[i].getScript().length() > 0) {
\r
3377 locStrBuf.append('_');
\r
3378 locStrBuf.append(testLocales[i].getScript());
\r
3380 if (testLocales[i].getCountry().length() > 0) {
\r
3381 locStrBuf.append('_');
\r
3382 locStrBuf.append(testLocales[i].getCountry());
\r
3384 ULocale locNoKeywords = new ULocale(locStrBuf.toString());
\r
3386 Calendar cal = Calendar.getInstance(testLocales[i]);
\r
3388 // Calendar getDateFormat method
\r
3389 DateFormat df = cal.getDateTimeFormat(DateFormat.MEDIUM, DateFormat.MEDIUM, locNoKeywords);
\r
3390 if (df instanceof SimpleDateFormat) {
\r
3391 formatters[0] = (SimpleDateFormat)df;
\r
3392 formatters[0].applyPattern(testPattern);
\r
3394 formatters[0] = null;
\r
3397 // DateFormat constructor with locale
\r
3398 df = DateFormat.getDateInstance(DateFormat.MEDIUM, testLocales[i]);
\r
3399 if (df instanceof SimpleDateFormat) {
\r
3400 formatters[1] = (SimpleDateFormat)df;
\r
3401 formatters[1].applyPattern(testPattern);
\r
3403 formatters[1] = null;
\r
3406 // DateFormat constructor with Calendar
\r
3407 df = DateFormat.getDateInstance(cal, DateFormat.MEDIUM, locNoKeywords);
\r
3408 if (df instanceof SimpleDateFormat) {
\r
3409 formatters[2] = (SimpleDateFormat)df;
\r
3410 formatters[2].applyPattern(testPattern);
\r
3412 formatters[2] = null;
\r
3415 // SimpleDateFormat constructor
\r
3416 formatters[3] = new SimpleDateFormat(testPattern, testLocales[i]);
\r
3418 // SimpleDateFormat with DateFormatSymbols
\r
3419 DateFormatSymbols dfs = new DateFormatSymbols(testLocales[i]);
\r
3420 formatters[4] = new SimpleDateFormat(testPattern, dfs, testLocales[i]);
\r
3422 // All SimpleDateFormat instances should produce the exact
\r
3424 String expected = null;
\r
3425 Date d = new Date();
\r
3426 for (int j = 0; j < formatters.length; j++) {
\r
3427 if (formatters[j] != null) {
\r
3428 String tmp = formatters[j].format(d);
\r
3429 if (expected == null) {
\r
3431 } else if (!expected.equals(tmp)) {
\r
3432 errln("FAIL: formatter[" + j + "] returned \"" + tmp + "\" in locale " +
\r
3433 testLocales[i] + " - expected: " + expected);
\r
3441 * Test for format/parse method with calendar which is different
\r
3442 * from what DateFormat instance internally use. See ticket#6420.
\r
3444 public void TestRoundtripWithCalendar() {
\r
3445 TimeZone tz = TimeZone.getTimeZone("Europe/Paris");
\r
3446 TimeZone gmt = TimeZone.getTimeZone("Etc/GMT");
\r
3448 final Calendar[] calendars = {
\r
3449 new GregorianCalendar(tz),
\r
3450 new BuddhistCalendar(tz),
\r
3451 new HebrewCalendar(tz),
\r
3452 new IslamicCalendar(tz),
\r
3453 new JapaneseCalendar(tz),
\r
3456 final String pattern = "GyMMMMdEEEEHHmmssVVVV";
\r
3458 //FIXME The formatters commented out below are currently failing because of
\r
3459 // the calendar calculation problem reported by #6691
\r
3461 // The order of test formatters mus match the order of calendars above.
\r
3462 final DateFormat[] formatters = {
\r
3463 DateFormat.getPatternInstance(pattern, new ULocale("en_US")), //calendar=gregorian
\r
3464 DateFormat.getPatternInstance(pattern, new ULocale("th_TH")), //calendar=buddhist
\r
3465 DateFormat.getPatternInstance(pattern, new ULocale("he_IL@calendar=hebrew")),
\r
3466 // DateFormat.getPatternInstance(pattern, new ULocale("ar_EG@calendar=islamic")),
\r
3467 // DateFormat.getPatternInstance(pattern, new ULocale("ja_JP@calendar=japanese")),
\r
3470 Date d = new Date();
\r
3471 StringBuffer buf = new StringBuffer();
\r
3472 FieldPosition fpos = new FieldPosition(0);
\r
3473 ParsePosition ppos = new ParsePosition(0);
\r
3475 for (int i = 0; i < formatters.length; i++) {
\r
3477 fpos.setBeginIndex(0);
\r
3478 fpos.setEndIndex(0);
\r
3479 calendars[i].setTime(d);
\r
3481 // Normal case output - the given calendar matches the calendar
\r
3482 // used by the formatter
\r
3483 formatters[i].format(calendars[i], buf, fpos);
\r
3484 String refStr = buf.toString();
\r
3486 for (int j = 0; j < calendars.length; j++) {
\r
3491 fpos.setBeginIndex(0);
\r
3492 fpos.setEndIndex(0);
\r
3493 calendars[j].setTime(d);
\r
3495 // Even the different calendar type is specified,
\r
3496 // we should get the same result.
\r
3497 formatters[i].format(calendars[j], buf, fpos);
\r
3498 if (!refStr.equals(buf.toString())) {
\r
3499 errln("FAIL: Different format result with a different calendar for the same time -"
\r
3500 + "\n Reference calendar type=" + calendars[i].getType()
\r
3501 + "\n Another calendar type=" + calendars[j].getType()
\r
3502 + "\n Expected result=" + refStr
\r
3503 + "\n Actual result=" + buf.toString());
\r
3507 calendars[i].setTimeZone(gmt);
\r
3508 calendars[i].clear();
\r
3509 ppos.setErrorIndex(-1);
\r
3512 // Normal case parse result - the given calendar matches the calendar
\r
3513 // used by the formatter
\r
3514 formatters[i].parse(refStr, calendars[i], ppos);
\r
3516 for (int j = 0; j < calendars.length; j++) {
\r
3520 calendars[j].setTimeZone(gmt);
\r
3521 calendars[j].clear();
\r
3522 ppos.setErrorIndex(-1);
\r
3525 // Even the different calendar type is specified,
\r
3526 // we should get the same time and time zone.
\r
3527 formatters[i].parse(refStr, calendars[j], ppos);
\r
3528 if (calendars[i].getTimeInMillis() != calendars[j].getTimeInMillis()
\r
3529 || !calendars[i].getTimeZone().equals(calendars[j].getTimeZone())) {
\r
3530 errln("FAIL: Different parse result with a different calendar for the same string -"
\r
3531 + "\n Reference calendar type=" + calendars[i].getType()
\r
3532 + "\n Another calendar type=" + calendars[j].getType()
\r
3533 + "\n Date string=" + refStr
\r
3534 + "\n Expected time=" + calendars[i].getTimeInMillis()
\r
3535 + "\n Expected time zone=" + calendars[i].getTimeZone().getID()
\r
3536 + "\n Actual time=" + calendars[j].getTimeInMillis()
\r
3537 + "\n Actual time zone=" + calendars[j].getTimeZone().getID());
\r
3543 // based on TestRelativeDateFormat() in icu/trunk/source/test/cintltst/cdattst.c
\r
3544 public void TestRelativeDateFormat() {
\r
3545 ULocale loc = ULocale.US;
\r
3546 TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
\r
3547 Calendar cal = new GregorianCalendar(tz, loc);
\r
3548 Date now = new Date();
\r
3550 cal.set(Calendar.HOUR_OF_DAY, 18);
\r
3551 cal.set(Calendar.MINUTE, 49);
\r
3552 cal.set(Calendar.SECOND, 0);
\r
3553 Date today = cal.getTime();
\r
3554 String minutesStr = "49"; // minutes string to search for in formatted result
\r
3555 int[] dateStylesList = { DateFormat.RELATIVE_FULL, DateFormat.RELATIVE_LONG, DateFormat.RELATIVE_MEDIUM, DateFormat.RELATIVE_SHORT };
\r
3557 for (int i = 0; i < dateStylesList.length; i++) {
\r
3558 int dateStyle = dateStylesList[i];
\r
3559 DateFormat fmtRelDateTime = DateFormat.getDateTimeInstance(dateStyle, DateFormat.SHORT, loc);
\r
3560 DateFormat fmtRelDate = DateFormat.getDateInstance(dateStyle, loc);
\r
3561 DateFormat fmtTime = DateFormat.getTimeInstance(DateFormat.SHORT, loc);
\r
3563 for (int dayOffset = -2; dayOffset <= 2; dayOffset++ ) {
\r
3564 StringBuffer dateTimeStr = new StringBuffer(64);
\r
3565 StringBuffer dateStr = new StringBuffer(64);
\r
3566 StringBuffer timeStr = new StringBuffer(64);
\r
3567 FieldPosition fp = new FieldPosition(DateFormat.MINUTE_FIELD);
\r
3568 cal.setTime(today);
\r
3569 cal.add(Calendar.DATE, dayOffset);
\r
3571 fmtRelDateTime.format(cal, dateTimeStr, fp);
\r
3572 fmtRelDate.format(cal, dateStr, new FieldPosition(0) );
\r
3573 fmtTime.format(cal, timeStr, new FieldPosition(0) );
\r
3575 // check that dateStr is in dateTimeStr
\r
3576 if ( dateTimeStr.toString().indexOf( dateStr.toString() ) < 0 ) {
\r
3577 errln("relative date string not found in datetime format with timeStyle SHORT, dateStyle " +
\r
3578 dateStyle + " for dayOffset " + dayOffset );
\r
3579 errln("datetime format is " + dateTimeStr.toString() + ", date string is " + dateStr.toString() );
\r
3581 // check that timeStr is in dateTimeStr
\r
3582 if ( dateTimeStr.toString().indexOf( timeStr.toString() ) < 0 ) {
\r
3583 errln("short time string not found in datetime format with timeStyle SHORT, dateStyle " +
\r
3584 dateStyle + " for dayOffset " + dayOffset );
\r
3585 errln("datetime format is " + dateTimeStr.toString() + ", time string is " + timeStr.toString() );
\r
3587 // check index of minutesStr
\r
3588 int minutesStrIndex = dateTimeStr.toString().indexOf( minutesStr );
\r
3589 if ( fp.getBeginIndex() != minutesStrIndex ) {
\r
3590 errln("FieldPosition beginIndex " + fp.getBeginIndex() + " instead of " + minutesStrIndex + " for datetime format with timeStyle SHORT, dateStyle " +
\r
3591 dateStyle + " for dayOffset " + dayOffset );
\r
3592 errln("datetime format is " + dateTimeStr.toString() );
\r
3598 public void Test6880() {
\r
3599 Date d1, d2, dp1, dp2, dexp1, dexp2;
\r
3602 TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
\r
3603 GregorianCalendar gcal = new GregorianCalendar(tz);
\r
3606 gcal.set(1910, Calendar.JANUARY, 1, 12, 00); // offset 8:05:52
\r
3607 d1 = gcal.getTime();
\r
3610 gcal.set(1950, Calendar.JANUARY, 1, 12, 00); // offset 8:00
\r
3611 d2 = gcal.getTime();
\r
3614 gcal.set(1970, Calendar.JANUARY, 1, 12, 00);
\r
3615 dexp2 = gcal.getTime();
\r
3616 dexp1 = new Date(dexp2.getTime() - (5*60 + 52)*1000); // subtract 5m52s
\r
3618 DateFormat fmt = DateFormat.getTimeInstance(DateFormat.FULL, new ULocale("zh"));
\r
3619 fmt.setTimeZone(tz);
\r
3621 s1 = fmt.format(d1);
\r
3622 s2 = fmt.format(d2);
\r
3625 dp1 = fmt.parse(s1);
\r
3626 dp2 = fmt.parse(s2);
\r
3628 if (!dp1.equals(dexp1)) {
\r
3629 errln("FAIL: Failed to parse " + s1 + " parsed: " + dp1 + " expected: " + dexp1);
\r
3631 if (!dp2.equals(dexp2)) {
\r
3632 errln("FAIL: Failed to parse " + s2 + " parsed: " + dp2 + " expected: " + dexp2);
\r
3634 } catch (ParseException pe) {
\r
3635 errln("FAIL: Parse failure");
\r
3640 * Tests the constructor public SimpleDateFormat(String pattern, String override, ULocale loc)
\r
3642 public void TestSimpleDateFormatConstructor_String_String_ULocale() {
\r
3644 SimpleDateFormat sdf = new SimpleDateFormat("", "", null);
\r
3645 sdf = (SimpleDateFormat) sdf.clone();
\r
3646 } catch (Exception e) {
\r
3647 errln("SimpleDateFormat(String pattern, String override, ULocale loc) "
\r
3648 + "was not suppose to return an exception when constructing a new " + "SimpleDateFormat object.");
\r
3653 * Tests the method public static DateFormat.Field ofCalendarField(int calendarField)
\r
3655 public void TestOfCalendarField() {
\r
3656 // Tests when if (calendarField == ChineseCalendar.IS_LEAP_MONTH) is false
\r
3657 int[] cases = { Calendar.IS_LEAP_MONTH - 1};
\r
3658 for (int i = 0; i < cases.length; i++) {
\r
3660 Field.ofCalendarField(cases[i]);
\r
3661 } catch (Exception e) {
\r
3662 errln("Field.ofCalendarField(int) is not suppose to " + "return an exception for parameter " + cases[i]);
\r
3667 /* Tests the method public final static DateFormat getPatternInstance */
\r
3668 public void TestGetPatternInstance(){
\r
3669 //public final static DateFormat getPatternInstance(String pattern)
\r
3671 @SuppressWarnings("unused")
\r
3672 DateFormat df = DateFormat.getPatternInstance("");
\r
3673 df = DateFormat.getPatternInstance("", new Locale("en_US"));
\r
3674 df = DateFormat.getPatternInstance(null, "", new Locale("en_US"));
\r
3675 } catch(Exception e) {
\r
3676 errln("DateFormat.getPatternInstance is not suppose to return an exception.");
\r
3681 * Test case for very long numeric field patterns (ticket#7595)
\r
3683 public void TestLongNumericPattern() {
\r
3687 "yyyy.MM.dd", "fp", "2010 04 01",
\r
3688 "2010.04.01", "2010 04 01",
\r
3690 "yyyyyyyyyy.MM.dd", "fp", "2010 04 01",
\r
3691 "0000002010.04.01", "2010 04 01",
\r
3693 "yyyyyyyyyyy.MM.dd", "fp", "2010 04 01",
\r
3694 "00000002010.04.01", "2010 04 01",
\r
3696 "yyyyyyyyyyy.M.dddddddddd", "fp", "2010 04 01",
\r
3697 "00000002010.4.0000000001", "2010 04 01",
\r
3699 "y.M.ddddddddddd", "fp", "2010 10 11",
\r
3700 "2010.10.00000000011", "2010 10 11",
\r
3702 expect(DATA, new Locale("en", "", ""));
\r