1 /********************************************************************
3 * Copyright (c) 1997-2013, International Business Machines
4 * Corporation and others. All Rights Reserved.
5 ********************************************************************/
7 #include "unicode/utypes.h"
9 #if !UCONFIG_NO_FORMATTING
12 #include "unicode/localpointer.h"
13 #include "unicode/timezone.h"
14 #include "unicode/gregocal.h"
15 #include "unicode/smpdtfmt.h"
16 #include "unicode/datefmt.h"
17 #include "unicode/dtptngen.h"
18 #include "unicode/simpletz.h"
19 #include "unicode/strenum.h"
20 #include "unicode/dtfmtsym.h"
23 #include "caltest.h" // for fieldName
24 #include <stdio.h> // for sprintf
26 #if U_PLATFORM_HAS_WIN32_API
30 #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
32 #define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
34 #define ASSERT_OK(status) if(U_FAILURE(status)) {errcheckln(status, #status " = %s @ %s:%d", u_errorName(status), __FILE__, __LINE__); return; }
36 // *****************************************************************************
37 // class DateFormatTest
38 // *****************************************************************************
40 void DateFormatTest::runIndexedTest( int32_t index
, UBool exec
, const char* &name
, char* /*par*/ )
43 logln("TestSuite DateFormatTest: ");
46 TESTCASE_AUTO(TestPatterns
);
47 TESTCASE_AUTO(TestEquals
);
48 TESTCASE_AUTO(TestTwoDigitYearDSTParse
);
49 TESTCASE_AUTO(TestFieldPosition
);
50 TESTCASE_AUTO(TestPartialParse994
);
51 TESTCASE_AUTO(TestRunTogetherPattern985
);
52 TESTCASE_AUTO(TestRunTogetherPattern917
);
53 TESTCASE_AUTO(TestCzechMonths459
);
54 TESTCASE_AUTO(TestLetterDPattern212
);
55 TESTCASE_AUTO(TestDayOfYearPattern195
);
56 TESTCASE_AUTO(TestQuotePattern161
);
57 TESTCASE_AUTO(TestBadInput135
);
58 TESTCASE_AUTO(TestBadInput135a
);
59 TESTCASE_AUTO(TestTwoDigitYear
);
60 TESTCASE_AUTO(TestDateFormatZone061
);
61 TESTCASE_AUTO(TestDateFormatZone146
);
62 TESTCASE_AUTO(TestLocaleDateFormat
);
63 TESTCASE_AUTO(TestWallyWedel
);
64 TESTCASE_AUTO(TestDateFormatCalendar
);
65 TESTCASE_AUTO(TestSpaceParsing
);
66 TESTCASE_AUTO(TestExactCountFormat
);
67 TESTCASE_AUTO(TestWhiteSpaceParsing
);
68 TESTCASE_AUTO(TestInvalidPattern
);
69 TESTCASE_AUTO(TestGeneral
);
70 TESTCASE_AUTO(TestGreekMay
);
71 TESTCASE_AUTO(TestGenericTime
);
72 TESTCASE_AUTO(TestGenericTimeZoneOrder
);
73 TESTCASE_AUTO(TestHost
);
74 TESTCASE_AUTO(TestEras
);
75 TESTCASE_AUTO(TestNarrowNames
);
76 TESTCASE_AUTO(TestShortDays
);
77 TESTCASE_AUTO(TestStandAloneDays
);
78 TESTCASE_AUTO(TestStandAloneMonths
);
79 TESTCASE_AUTO(TestQuarters
);
80 TESTCASE_AUTO(TestZTimeZoneParsing
);
81 TESTCASE_AUTO(TestRelative
);
82 TESTCASE_AUTO(TestRelativeClone
);
83 TESTCASE_AUTO(TestHostClone
);
84 TESTCASE_AUTO(TestTimeZoneDisplayName
);
85 TESTCASE_AUTO(TestRoundtripWithCalendar
);
86 TESTCASE_AUTO(Test6338
);
87 TESTCASE_AUTO(Test6726
);
88 TESTCASE_AUTO(TestGMTParsing
);
89 TESTCASE_AUTO(Test6880
);
90 TESTCASE_AUTO(TestISOEra
);
91 TESTCASE_AUTO(TestFormalChineseDate
);
92 TESTCASE_AUTO(TestNumberAsStringParsing
);
93 TESTCASE_AUTO(TestStandAloneGMTParse
);
94 TESTCASE_AUTO(TestParsePosition
);
95 TESTCASE_AUTO(TestMonthPatterns
);
96 TESTCASE_AUTO(TestContext
);
97 TESTCASE_AUTO(TestNonGregoFmtParse
);
99 TESTCASE_AUTO(TestRelativeError);
100 TESTCASE_AUTO(TestRelativeOther);
102 TESTCASE_AUTO(TestDotAndAtLeniency
);
106 void DateFormatTest::TestPatterns() {
107 static const struct {
108 const char *actualPattern
;
109 const char *expectedPattern
;
110 const char *localeID
;
111 const char *expectedLocalPattern
;
113 {UDAT_YEAR
, "y","en","y"},
115 {UDAT_QUARTER
, "QQQQ", "en", "QQQQ"},
116 {UDAT_ABBR_QUARTER
, "QQQ", "en", "QQQ"},
117 {UDAT_YEAR_QUARTER
, "yQQQQ", "en", "QQQQ y"},
118 {UDAT_YEAR_ABBR_QUARTER
, "yQQQ", "en", "QQQ y"},
120 {UDAT_NUM_MONTH
, "M", "en", "L"},
121 {UDAT_ABBR_MONTH
, "MMM", "en", "LLL"},
122 {UDAT_MONTH
, "MMMM", "en", "LLLL"},
123 {UDAT_YEAR_NUM_MONTH
, "yM","en","M/y"},
124 {UDAT_YEAR_ABBR_MONTH
, "yMMM","en","MMM y"},
125 {UDAT_YEAR_MONTH
, "yMMMM","en","MMMM y"},
127 {UDAT_DAY
, "d","en","d"},
128 {UDAT_YEAR_NUM_MONTH_DAY
, "yMd", "en", "M/d/y"},
129 {UDAT_YEAR_ABBR_MONTH_DAY
, "yMMMd", "en", "MMM d, y"},
130 {UDAT_YEAR_MONTH_DAY
, "yMMMMd", "en", "MMMM d, y"},
131 {UDAT_YEAR_NUM_MONTH_WEEKDAY_DAY
, "yMEd", "en", "EEE, M/d/y"},
132 {UDAT_YEAR_ABBR_MONTH_WEEKDAY_DAY
, "yMMMEd", "en", "EEE, MMM d, y"},
133 {UDAT_YEAR_MONTH_WEEKDAY_DAY
, "yMMMMEEEEd", "en", "EEEE, MMMM d, y"},
135 {UDAT_NUM_MONTH_DAY
, "Md","en","M/d"},
136 {UDAT_ABBR_MONTH_DAY
, "MMMd","en","MMM d"},
137 {UDAT_MONTH_DAY
, "MMMMd","en","MMMM d"},
138 {UDAT_NUM_MONTH_WEEKDAY_DAY
, "MEd","en","EEE, M/d"},
139 {UDAT_ABBR_MONTH_WEEKDAY_DAY
, "MMMEd","en","EEE, MMM d"},
140 {UDAT_MONTH_WEEKDAY_DAY
, "MMMMEEEEd","en","EEEE, MMMM d"},
142 {UDAT_HOUR
, "j", "en", "h a"}, // (fixed expected result per ticket 6872<-6626)
143 {UDAT_HOUR24
, "H", "en", "HH"}, // (fixed expected result per ticket 6872<-6626
145 {UDAT_MINUTE
, "m", "en", "m"},
146 {UDAT_HOUR_MINUTE
, "jm","en","h:mm a"}, // (fixed expected result per ticket 6872<-7180)
147 {UDAT_HOUR24_MINUTE
, "Hm", "en", "HH:mm"}, // (fixed expected result per ticket 6872<-6626)
149 {UDAT_SECOND
, "s", "en", "s"},
150 {UDAT_HOUR_MINUTE_SECOND
, "jms","en","h:mm:ss a"}, // (fixed expected result per ticket 6872<-7180)
151 {UDAT_HOUR24_MINUTE_SECOND
, "Hms","en","HH:mm:ss"}, // (fixed expected result per ticket 6872<-6626)
152 {UDAT_MINUTE_SECOND
, "ms", "en", "mm:ss"}, // (fixed expected result per ticket 6872<-6626)
154 {UDAT_LOCATION_TZ
, "VVVV", "en", "VVVV"},
155 {UDAT_GENERIC_TZ
, "vvvv", "en", "vvvv"},
156 {UDAT_ABBR_GENERIC_TZ
, "v", "en", "v"},
157 {UDAT_SPECIFIC_TZ
, "zzzz", "en", "zzzz"},
158 {UDAT_ABBR_SPECIFIC_TZ
, "z", "en", "z"},
159 {UDAT_ABBR_UTC_TZ
, "ZZZZ", "en", "ZZZZ"},
161 {UDAT_YEAR_NUM_MONTH_DAY UDAT_ABBR_UTC_TZ
, "yMdZZZZ", "en", "M/d/y, ZZZZ"},
162 {UDAT_MONTH_DAY UDAT_LOCATION_TZ
, "MMMMdVVVV", "en", "MMMM d, VVVV"}
165 IcuTestErrorCode
errorCode(*this, "TestPatterns()");
166 for (int32_t i
= 0; i
< LENGTHOF(EXPECTED
); i
++) {
167 // Verify that patterns have the correct values
168 UnicodeString
actualPattern(EXPECTED
[i
].actualPattern
, -1, US_INV
);
169 UnicodeString
expectedPattern(EXPECTED
[i
].expectedPattern
, -1, US_INV
);
170 Locale
locale(EXPECTED
[i
].localeID
);
171 if (actualPattern
!= expectedPattern
) {
172 errln("FAILURE! Expected pattern: " + expectedPattern
+
173 " but was: " + actualPattern
);
176 // Verify that DataFormat instances produced contain the correct
177 // localized patterns
178 // TODO: use DateFormat::getInstanceForSkeleton(), ticket #9029
180 // DateFormat date1 = DateFormat.getPatternInstance(actualPattern,
182 // DateFormat date2 = DateFormat.getPatternInstance(Calendar.getInstance(locale),
183 // actualPattern, locale);
184 LocalPointer
<DateTimePatternGenerator
> generator(
185 DateTimePatternGenerator::createInstance(locale
, errorCode
));
186 if(errorCode
.logDataIfFailureAndReset("DateTimePatternGenerator::createInstance() failed for locale ID \"%s\"", EXPECTED
[i
].localeID
)) {
189 UnicodeString pattern
= generator
->getBestPattern(actualPattern
, errorCode
);
190 SimpleDateFormat
date1(pattern
, locale
, errorCode
);
191 SimpleDateFormat
date2(pattern
, locale
, errorCode
);
192 date2
.adoptCalendar(Calendar::createInstance(locale
, errorCode
));
193 if(errorCode
.logIfFailureAndReset("DateFormat::getInstanceForSkeleton() failed")) {
194 errln(" for actualPattern \"%s\" & locale ID \"%s\"",
195 EXPECTED
[i
].actualPattern
, EXPECTED
[i
].localeID
);
199 UnicodeString
expectedLocalPattern(EXPECTED
[i
].expectedLocalPattern
, -1, US_INV
);
200 UnicodeString actualLocalPattern1
;
201 UnicodeString actualLocalPattern2
;
202 date1
.toLocalizedPattern(actualLocalPattern1
, errorCode
);
203 date2
.toLocalizedPattern(actualLocalPattern2
, errorCode
);
204 if (actualLocalPattern1
!= expectedLocalPattern
) {
205 errln("FAILURE! Expected local pattern: " + expectedLocalPattern
206 + " but was: " + actualLocalPattern1
);
208 if (actualLocalPattern2
!= expectedLocalPattern
) {
209 errln("FAILURE! Expected local pattern: " + expectedLocalPattern
210 + " but was: " + actualLocalPattern2
);
215 // Test written by Wally Wedel and emailed to me.
216 void DateFormatTest::TestWallyWedel()
218 UErrorCode status
= U_ZERO_ERROR
;
220 * Instantiate a TimeZone so we can get the ids.
222 TimeZone
*tz
= new SimpleTimeZone(7,"");
224 * Computational variables.
226 int32_t offset
, hours
, minutes
, seconds
;
228 * Instantiate a SimpleDateFormat set up to produce a full time
231 SimpleDateFormat
*sdf
= new SimpleDateFormat((UnicodeString
)"zzzz", status
);
233 * A String array for the time zone ids.
236 StringEnumeration
* ids
= TimeZone::createEnumeration();
238 dataerrln("Unable to create TimeZone enumeration.");
244 ids_length
= ids
->count(status
);
246 * How many ids do we have?
248 logln("Time Zone IDs size: %d", ids_length
);
250 * Column headings (sort of)
252 logln("Ordinal ID offset(h:m) name");
254 * Loop through the tzs.
256 UDate today
= Calendar::getNow();
257 Calendar
*cal
= Calendar::createInstance(status
);
258 for (int32_t i
= 0; i
< ids_length
; i
++) {
259 // logln(i + " " + ids[i]);
260 const UnicodeString
* id
= ids
->snext(status
);
261 TimeZone
*ttz
= TimeZone::createTimeZone(*id
);
262 // offset = ttz.getRawOffset();
263 cal
->setTimeZone(*ttz
);
264 cal
->setTime(today
, status
);
265 offset
= cal
->get(UCAL_ZONE_OFFSET
, status
) + cal
->get(UCAL_DST_OFFSET
, status
);
266 // logln(i + " " + ids[i] + " offset " + offset);
267 const char* sign
= "+";
272 hours
= offset
/3600000;
273 minutes
= (offset%3600000
)/60000;
274 seconds
= (offset%60000
)/1000;
275 UnicodeString dstOffset
= (UnicodeString
)"" + sign
+ (hours
< 10 ? "0" : "") +
276 (int32_t)hours
+ ":" + (minutes
< 10 ? "0" : "") + (int32_t)minutes
;
278 dstOffset
= dstOffset
+ ":" + (seconds
< 10 ? "0" : "") + seconds
;
281 * Instantiate a date so we can display the time zone name.
283 sdf
->setTimeZone(*ttz
);
287 UnicodeString fmtOffset
;
288 FieldPosition
pos(0);
289 sdf
->format(today
,fmtOffset
, pos
);
290 // UnicodeString fmtOffset = tzS.toString();
291 UnicodeString
*fmtDstOffset
= 0;
292 if (fmtOffset
.startsWith("GMT") && fmtOffset
.length() != 3)
294 //fmtDstOffset = fmtOffset->substring(3);
295 fmtDstOffset
= new UnicodeString();
296 fmtOffset
.extract(3, fmtOffset
.length(), *fmtDstOffset
);
301 UBool ok
= fmtDstOffset
== 0 || *fmtDstOffset
== dstOffset
;
304 logln(UnicodeString() + i
+ " " + *id
+ " " + dstOffset
+
306 (fmtDstOffset
!= 0 ? " ok" : " ?"));
310 errln(UnicodeString() + i
+ " " + *id
+ " " + dstOffset
+
311 " " + fmtOffset
+ " *** FAIL ***");
317 // delete ids; // TODO: BAD API
323 // -------------------------------------
329 DateFormatTest::TestEquals()
331 DateFormat
* fmtA
= DateFormat::createDateTimeInstance(DateFormat::MEDIUM
, DateFormat::FULL
);
332 DateFormat
* fmtB
= DateFormat::createDateTimeInstance(DateFormat::MEDIUM
, DateFormat::FULL
);
333 if ( fmtA
== NULL
|| fmtB
== NULL
){
334 dataerrln("Error calling DateFormat::createDateTimeInstance");
340 if (!(*fmtA
== *fmtB
)) errln((UnicodeString
)"FAIL");
344 TimeZone
* test
= TimeZone::createTimeZone("PDT");
348 // -------------------------------------
351 * Test the parsing of 2-digit years.
354 DateFormatTest::TestTwoDigitYearDSTParse(void)
356 UErrorCode status
= U_ZERO_ERROR
;
357 SimpleDateFormat
* fullFmt
= new SimpleDateFormat((UnicodeString
)"EEE MMM dd HH:mm:ss.SSS zzz yyyy G", status
);
358 SimpleDateFormat
*fmt
= new SimpleDateFormat((UnicodeString
)"dd-MMM-yy h:mm:ss 'o''clock' a z", Locale::getEnglish(), status
);
359 //DateFormat* fmt = DateFormat::createDateTimeInstance(DateFormat::MEDIUM, DateFormat::FULL, Locale::ENGLISH);
360 UnicodeString
* s
= new UnicodeString("03-Apr-04 2:20:47 o'clock AM PST", "");
361 TimeZone
* defaultTZ
= TimeZone::createDefault();
362 TimeZone
* PST
= TimeZone::createTimeZone("PST");
363 int32_t defaultOffset
= defaultTZ
->getRawOffset();
364 int32_t PSTOffset
= PST
->getRawOffset();
365 int32_t hour
= 2 + (defaultOffset
- PSTOffset
) / (60*60*1000);
366 // hour is the expected hour of day, in units of seconds
367 hour
= ((hour
< 0) ? hour
+ 24 : hour
) * 60*60;
371 if(U_FAILURE(status
)) {
372 dataerrln("Could not set up test. exitting - %s", u_errorName(status
));
376 UDate d
= fmt
->parse(*s
, status
);
377 logln(*s
+ " P> " + ((DateFormat
*)fullFmt
)->format(d
, str
));
378 int32_t y
, m
, day
, hr
, min
, sec
;
379 dateToFields(d
, y
, m
, day
, hr
, min
, sec
);
380 hour
+= defaultTZ
->inDaylightTime(d
, status
) ? 1 : 0;
383 errln((UnicodeString
)"FAIL: Should parse to hour " + hour
+ " but got " + hr
);
385 if (U_FAILURE(status
))
386 errln((UnicodeString
)"FAIL: " + (int32_t)status
);
395 // -------------------------------------
397 UChar
toHexString(int32_t i
) { return (UChar
)(i
+ (i
< 10 ? 0x30 : (0x41 - 10))); }
400 DateFormatTest::escape(UnicodeString
& s
)
403 for (int32_t i
=0; i
<s
.length(); ++i
)
405 UChar c
= s
[(int32_t)i
];
406 if (c
<= (UChar
)0x7F) buf
+= c
;
408 buf
+= (UChar
)0x5c; buf
+= (UChar
)0x55;
409 buf
+= toHexString((c
& 0xF000) >> 12);
410 buf
+= toHexString((c
& 0x0F00) >> 8);
411 buf
+= toHexString((c
& 0x00F0) >> 4);
412 buf
+= toHexString(c
& 0x000F);
418 // -------------------------------------
421 * This MUST be kept in sync with DateFormatSymbols.gPatternChars.
423 static const char* PATTERN_CHARS
= "GyMdkHmsSEDFwWahKzYeugAZvcLQqVUOXx";
426 * A list of the names of all the fields in DateFormat.
427 * This MUST be kept in sync with DateFormat.
429 static const char* DATEFORMAT_FIELD_NAMES
[] = {
434 "HOUR_OF_DAY1_FIELD",
435 "HOUR_OF_DAY0_FIELD",
441 "DAY_OF_WEEK_IN_MONTH_FIELD",
442 "WEEK_OF_YEAR_FIELD",
443 "WEEK_OF_MONTH_FIELD",
450 "EXTENDED_YEAR_FIELD",
452 "MILLISECONDS_IN_DAY_FIELD",
453 "TIMEZONE_RFC_FIELD",
454 "GENERIC_TIMEZONE_FIELD",
455 "STAND_ALONE_DAY_FIELD",
456 "STAND_ALONE_MONTH_FIELD",
458 "STAND_ALONE_QUARTER_FIELD",
459 "TIMEZONE_SPECIAL_FIELD",
461 "TIMEZONE_LOCALIZED_GMT_OFFSET_FIELD",
462 "TIMEZONE_ISO_FIELD",
463 "TIMEZONE_ISO_LOCAL_FIELD",
466 static const int32_t DATEFORMAT_FIELD_NAMES_LENGTH
=
467 sizeof(DATEFORMAT_FIELD_NAMES
) / sizeof(DATEFORMAT_FIELD_NAMES
[0]);
470 * Verify that returned field position indices are correct.
472 void DateFormatTest::TestFieldPosition() {
473 UErrorCode ec
= U_ZERO_ERROR
;
478 DateFormatSymbols
rootSyms(Locale(""), ec
);
480 dataerrln("Unable to create DateFormatSymbols - %s", u_errorName(ec
));
484 // local pattern chars data is not longer loaded
485 // from icu locale bundle
486 assertEquals("patternChars", PATTERN_CHARS
, rootSyms
.getLocalPatternChars(buf
));
487 assertEquals("patternChars", PATTERN_CHARS
, DateFormatSymbols::getPatternUChars());
488 assertTrue("DATEFORMAT_FIELD_NAMES", DATEFORMAT_FIELD_NAMES_LENGTH
== UDAT_FIELD_COUNT
);
489 assertTrue("Data", UDAT_FIELD_COUNT
== uprv_strlen(PATTERN_CHARS
));
491 // Create test formatters
492 const int32_t COUNT
= 4;
493 DateFormat
* dateFormats
[COUNT
];
494 dateFormats
[0] = DateFormat::createDateTimeInstance(DateFormat::kFull
, DateFormat::kFull
, Locale::getUS());
495 dateFormats
[1] = DateFormat::createDateTimeInstance(DateFormat::kFull
, DateFormat::kFull
, Locale::getFrance());
496 // Make the pattern "G y M d..."
497 buf
.remove().append(PATTERN_CHARS
);
498 for (j
=buf
.length()-1; j
>=0; --j
) buf
.insert(j
, (UChar
)32/*' '*/);
499 dateFormats
[2] = new SimpleDateFormat(buf
, Locale::getUS(), ec
);
500 // Make the pattern "GGGG yyyy MMMM dddd..."
501 for (j
=buf
.length()-1; j
>=0; j
-=2) {
502 for (i
=0; i
<3; ++i
) {
503 buf
.insert(j
, buf
.charAt(j
));
506 dateFormats
[3] = new SimpleDateFormat(buf
, Locale::getUS(), ec
);
508 errln(UnicodeString("Could not create SimpleDateFormat object for locale en_US. Error: " )+ UnicodeString(u_errorName(ec
)));
511 UDate aug13
= 871508052513.0;
513 // Expected output field values for above DateFormats on aug13
514 // Fields are given in order of DateFormat field number
515 const char* EXPECTED
[] = {
516 "", "1997", "August", "13", "", "", "34", "12", "", "Wednesday",
517 "", "", "", "", "PM", "2", "", "Pacific Daylight Time", "", "",
518 "", "", "", "", "", "", "", "", "", "",
521 "", "1997", "ao\\u00FBt", "13", "", "14", "34", "12", "", "mercredi",
522 "", "", "", "", "", "", "", "heure avanc\\u00e9e du Pacifique", "", "",
523 "", "", "", "", "", "", "", "", "", "",
526 "AD", "1997", "8", "13", "14", "14", "34", "12", "5", "Wed",
527 "225", "2", "33", "3", "PM", "2", "2", "PDT", "1997", "4",
528 "1997", "2450674", "52452513", "-0700", "PT", "4", "8", "3", "3", "uslax",
529 "1997", "GMT-7", "-07", "-07",
531 "Anno Domini", "1997", "August", "0013", "0014", "0014", "0034", "0012", "5130", "Wednesday",
532 "0225", "0002", "0033", "0003", "PM", "0002", "0002", "Pacific Daylight Time", "1997", "Wednesday",
533 "1997", "2450674", "52452513", "GMT-07:00", "Pacific Time", "Wednesday", "August", "3rd quarter", "3rd quarter", "Los Angeles Time",
534 "1997", "GMT-07:00", "-0700", "-0700",
537 const int32_t EXPECTED_LENGTH
= sizeof(EXPECTED
)/sizeof(EXPECTED
[0]);
539 assertTrue("data size", EXPECTED_LENGTH
== COUNT
* UDAT_FIELD_COUNT
);
541 TimeZone
* PT
= TimeZone::createTimeZone("America/Los_Angeles");
542 for (j
= 0, exp
= 0; j
< COUNT
; ++j
) {
544 DateFormat
* df
= dateFormats
[j
];
545 df
->setTimeZone(*PT
);
546 SimpleDateFormat
* sdtfmt
= dynamic_cast<SimpleDateFormat
*>(df
);
547 if (sdtfmt
!= NULL
) {
548 logln(" Pattern = " + sdtfmt
->toPattern(buf
.remove()));
550 logln(" Pattern = ? (not a SimpleDateFormat)");
552 logln((UnicodeString
)" Result = " + df
->format(aug13
, buf
.remove()));
554 int32_t expBase
= exp
; // save for later
555 for (i
= 0; i
< UDAT_FIELD_COUNT
; ++i
, ++exp
) {
556 FieldPosition
pos(i
);
558 df
->format(aug13
, buf
, pos
);
560 buf
.extractBetween(pos
.getBeginIndex(), pos
.getEndIndex(), field
);
561 assertEquals((UnicodeString
)"field #" + i
+ " " + DATEFORMAT_FIELD_NAMES
[i
],
562 ctou(EXPECTED
[exp
]), field
);
565 // test FieldPositionIterator API
566 logln("FieldPositionIterator");
568 UErrorCode status
= U_ZERO_ERROR
;
569 FieldPositionIterator posIter
;
573 df
->format(aug13
, buf
, &posIter
, status
);
574 while (posIter
.next(fp
)) {
575 int32_t i
= fp
.getField();
577 buf
.extractBetween(fp
.getBeginIndex(), fp
.getEndIndex(), field
);
578 assertEquals((UnicodeString
)"field #" + i
+ " " + DATEFORMAT_FIELD_NAMES
[i
],
579 ctou(EXPECTED
[expBase
+ i
]), field
);
588 UErrorCode status
= U_ZERO_ERROR
;
589 dateFormats
[0]->format(aug13
, buf
, NULL
, status
);
590 // if we didn't crash, we succeeded.
592 for (i
=0; i
<COUNT
; ++i
) {
593 delete dateFormats
[i
];
598 // -------------------------------------
601 * General parse/format tests. Add test cases as needed.
603 void DateFormatTest::TestGeneral() {
604 const char* DATA
[] = {
605 "yyyy MM dd HH:mm:ss.SSS",
607 // Milliseconds are left-justified, since they format as fractions of a second
608 "y/M/d H:mm:ss.S", "fp", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.5", "2004 03 10 16:36:31.500",
609 "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",
610 "y/M/d H:mm:ss.SSS", "F", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.567",
611 "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",
613 expect(DATA
, ARRAY_SIZE(DATA
), Locale("en", "", ""));
616 // -------------------------------------
619 * Verify that strings which contain incomplete specifications are parsed
620 * correctly. In some instances, this means not being parsed at all, and
621 * returning an appropriate error.
624 DateFormatTest::TestPartialParse994()
626 UErrorCode status
= U_ZERO_ERROR
;
627 SimpleDateFormat
* f
= new SimpleDateFormat(status
);
628 if (U_FAILURE(status
)) {
629 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status
));
634 tryPat994(f
, "yy/MM/dd HH:mm:ss", "97/01/17 10:11:42", date(97, 1 - 1, 17, 10, 11, 42));
635 tryPat994(f
, "yy/MM/dd HH:mm:ss", "97/01/17 10:", null
);
636 tryPat994(f
, "yy/MM/dd HH:mm:ss", "97/01/17 10", null
);
637 tryPat994(f
, "yy/MM/dd HH:mm:ss", "97/01/17 ", null
);
638 tryPat994(f
, "yy/MM/dd HH:mm:ss", "97/01/17", null
);
639 if (U_FAILURE(status
)) errln((UnicodeString
)"FAIL: UErrorCode received during test: " + (int32_t)status
);
643 // -------------------------------------
646 DateFormatTest::tryPat994(SimpleDateFormat
* format
, const char* pat
, const char* str
, UDate expected
)
648 UErrorCode status
= U_ZERO_ERROR
;
650 logln(UnicodeString("Pattern \"") + pat
+ "\" String \"" + str
+ "\"");
652 format
->applyPattern(pat
);
653 UDate date
= format
->parse(str
, status
);
654 if (U_FAILURE(status
) || date
== null
)
656 logln((UnicodeString
)"ParseException: " + (int32_t)status
);
657 if (expected
!= null
) errln((UnicodeString
)"FAIL: Expected " + dateToString(expected
));
662 ((DateFormat
*)format
)->format(date
, f
);
663 logln(UnicodeString(" parse(") + str
+ ") -> " + dateToString(date
));
664 logln((UnicodeString
)" format -> " + f
);
665 if (expected
== null
||
666 !(date
== expected
)) errln((UnicodeString
)"FAIL: Expected null");//" + expected);
667 if (!(f
== str
)) errln(UnicodeString("FAIL: Expected ") + str
);
670 //catch(ParseException e) {
671 // logln((UnicodeString)"ParseException: " + e.getMessage());
672 // if (expected != null) errln((UnicodeString)"FAIL: Expected " + dateToString(expected));
674 //catch(Exception e) {
675 // errln((UnicodeString)"*** Exception:");
676 // e.printStackTrace();
680 // -------------------------------------
683 * Verify the behavior of patterns in which digits for different fields run together
684 * without intervening separators.
687 DateFormatTest::TestRunTogetherPattern985()
689 UErrorCode status
= U_ZERO_ERROR
;
690 UnicodeString
format("yyyyMMddHHmmssSSS");
691 UnicodeString now
, then
;
693 SimpleDateFormat
*formatter
= new SimpleDateFormat(format
, status
);
694 if (U_FAILURE(status
)) {
695 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status
));
699 UDate date1
= Calendar::getNow();
700 ((DateFormat
*)formatter
)->format(date1
, now
);
702 ParsePosition
pos(0);
703 UDate date2
= formatter
->parse(now
, pos
);
704 if (date2
== 0) then
= UnicodeString("Parse stopped at ") + pos
.getIndex();
705 else ((DateFormat
*)formatter
)->format(date2
, then
);
707 if (!(date2
== date1
)) errln((UnicodeString
)"FAIL");
709 if (U_FAILURE(status
)) errln((UnicodeString
)"FAIL: UErrorCode received during test: " + (int32_t)status
);
712 // -------------------------------------
715 * Verify the behavior of patterns in which digits for different fields run together
716 * without intervening separators.
719 DateFormatTest::TestRunTogetherPattern917()
721 UErrorCode status
= U_ZERO_ERROR
;
722 SimpleDateFormat
* fmt
;
723 UnicodeString myDate
;
724 fmt
= new SimpleDateFormat((UnicodeString
)"yyyy/MM/dd", status
);
725 if (U_FAILURE(status
)) {
726 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status
));
730 myDate
= "1997/02/03";
731 testIt917(fmt
, myDate
, date(97, 2 - 1, 3));
733 fmt
= new SimpleDateFormat((UnicodeString
)"yyyyMMdd", status
);
735 testIt917(fmt
, myDate
, date(97, 3 - 1, 4));
737 if (U_FAILURE(status
)) errln((UnicodeString
)"FAIL: UErrorCode received during test: " + (int32_t)status
);
740 // -------------------------------------
743 DateFormatTest::testIt917(SimpleDateFormat
* fmt
, UnicodeString
& str
, UDate expected
)
745 UErrorCode status
= U_ZERO_ERROR
;
746 UnicodeString pattern
;
747 logln((UnicodeString
)"pattern=" + fmt
->toPattern(pattern
) + " string=" + str
);
750 ((Format
*)fmt
)->parseObject(str
, o
, status
);
752 if (U_FAILURE(status
)) return;
753 //catch(ParseException e) {
754 // e.printStackTrace();
757 logln((UnicodeString
)"Parsed object: " + dateToString(o
.getDate()));
758 if (!(o
.getDate() == expected
)) errln((UnicodeString
)"FAIL: Expected " + dateToString(expected
));
759 UnicodeString formatted
; ((Format
*)fmt
)->format(o
, formatted
, status
);
760 logln((UnicodeString
)"Formatted string: " + formatted
);
761 if (!(formatted
== str
)) errln((UnicodeString
)"FAIL: Expected " + str
);
762 if (U_FAILURE(status
)) errln((UnicodeString
)"FAIL: UErrorCode received during test: " + (int32_t)status
);
765 // -------------------------------------
768 * Verify the handling of Czech June and July, which have the unique attribute that
769 * one is a proper prefix substring of the other.
772 DateFormatTest::TestCzechMonths459()
774 UErrorCode status
= U_ZERO_ERROR
;
775 DateFormat
* fmt
= DateFormat::createDateInstance(DateFormat::FULL
, Locale("cs", "", ""));
777 dataerrln("Error calling DateFormat::createDateInstance()");
781 UnicodeString pattern
;
782 logln((UnicodeString
)"Pattern " + ((SimpleDateFormat
*) fmt
)->toPattern(pattern
));
783 UDate june
= date(97, UCAL_JUNE
, 15);
784 UDate july
= date(97, UCAL_JULY
, 15);
785 UnicodeString juneStr
; fmt
->format(june
, juneStr
);
786 UnicodeString julyStr
; fmt
->format(july
, julyStr
);
788 logln((UnicodeString
)"format(June 15 1997) = " + juneStr
);
789 UDate d
= fmt
->parse(juneStr
, status
);
790 UnicodeString s
; fmt
->format(d
, s
);
791 int32_t month
,yr
,day
,hr
,min
,sec
; dateToFields(d
,yr
,month
,day
,hr
,min
,sec
);
792 logln((UnicodeString
)" -> parse -> " + s
+ " (month = " + month
+ ")");
793 if (month
!= UCAL_JUNE
) errln((UnicodeString
)"FAIL: Month should be June");
794 logln((UnicodeString
)"format(July 15 1997) = " + julyStr
);
795 d
= fmt
->parse(julyStr
, status
);
797 dateToFields(d
,yr
,month
,day
,hr
,min
,sec
);
798 logln((UnicodeString
)" -> parse -> " + s
+ " (month = " + month
+ ")");
799 if (month
!= UCAL_JULY
) errln((UnicodeString
)"FAIL: Month should be July");
801 //catch(ParseException e) {
802 if (U_FAILURE(status
))
803 errln((UnicodeString
)"Exception: " + (int32_t)status
);
808 // -------------------------------------
811 * Test the handling of 'D' in patterns.
814 DateFormatTest::TestLetterDPattern212()
816 UErrorCode status
= U_ZERO_ERROR
;
817 UnicodeString
dateString("1995-040.05:01:29");
818 UnicodeString
bigD("yyyy-DDD.hh:mm:ss");
819 UnicodeString
littleD("yyyy-ddd.hh:mm:ss");
820 UDate expLittleD
= date(95, 0, 1, 5, 1, 29);
821 UDate expBigD
= expLittleD
+ 39 * 24 * 3600000.0;
822 expLittleD
= expBigD
; // Expect the same, with default lenient parsing
823 logln((UnicodeString
)"dateString= " + dateString
);
824 SimpleDateFormat
*formatter
= new SimpleDateFormat(bigD
, status
);
825 if (U_FAILURE(status
)) {
826 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status
));
830 ParsePosition
pos(0);
831 UDate myDate
= formatter
->parse(dateString
, pos
);
832 logln((UnicodeString
)"Using " + bigD
+ " -> " + myDate
);
833 if (myDate
!= expBigD
) errln((UnicodeString
)"FAIL: bigD - Expected " + dateToString(expBigD
));
835 formatter
= new SimpleDateFormat(littleD
, status
);
837 pos
= ParsePosition(0);
838 myDate
= formatter
->parse(dateString
, pos
);
839 logln((UnicodeString
)"Using " + littleD
+ " -> " + dateToString(myDate
));
840 if (myDate
!= expLittleD
) errln((UnicodeString
)"FAIL: littleD - Expected " + dateToString(expLittleD
));
842 if (U_FAILURE(status
)) errln((UnicodeString
)"FAIL: UErrorCode received during test: " + (int32_t)status
);
845 // -------------------------------------
848 * Test the day of year pattern.
851 DateFormatTest::TestDayOfYearPattern195()
853 UErrorCode status
= U_ZERO_ERROR
;
854 UDate today
= Calendar::getNow();
855 int32_t year
,month
,day
,hour
,min
,sec
; dateToFields(today
,year
,month
,day
,hour
,min
,sec
);
856 UDate expected
= date(year
, month
, day
);
857 logln((UnicodeString
)"Test Date: " + dateToString(today
));
858 SimpleDateFormat
* sdf
= (SimpleDateFormat
*)DateFormat::createDateInstance();
860 dataerrln("Error calling DateFormat::createDateInstance()");
863 tryPattern(*sdf
, today
, 0, expected
);
864 tryPattern(*sdf
, today
, "G yyyy DDD", expected
);
866 if (U_FAILURE(status
)) errln((UnicodeString
)"FAIL: UErrorCode received during test: " + (int32_t)status
);
869 // -------------------------------------
872 DateFormatTest::tryPattern(SimpleDateFormat
& sdf
, UDate d
, const char* pattern
, UDate expected
)
874 UErrorCode status
= U_ZERO_ERROR
;
875 if (pattern
!= 0) sdf
.applyPattern(pattern
);
876 UnicodeString thePat
;
877 logln((UnicodeString
)"pattern: " + sdf
.toPattern(thePat
));
878 UnicodeString formatResult
; (*(DateFormat
*)&sdf
).format(d
, formatResult
);
879 logln((UnicodeString
)" format -> " + formatResult
);
881 UDate d2
= sdf
.parse(formatResult
, status
);
882 logln((UnicodeString
)" parse(" + formatResult
+ ") -> " + dateToString(d2
));
883 if (d2
!= expected
) errln((UnicodeString
)"FAIL: Expected " + dateToString(expected
));
884 UnicodeString format2
; (*(DateFormat
*)&sdf
).format(d2
, format2
);
885 logln((UnicodeString
)" format -> " + format2
);
886 if (!(formatResult
== format2
)) errln((UnicodeString
)"FAIL: Round trip drift");
888 //catch(Exception e) {
889 if (U_FAILURE(status
))
890 errln((UnicodeString
)"Error: " + (int32_t)status
);
894 // -------------------------------------
897 * Test the handling of single quotes in patterns.
900 DateFormatTest::TestQuotePattern161()
902 UErrorCode status
= U_ZERO_ERROR
;
903 SimpleDateFormat
* formatter
= new SimpleDateFormat((UnicodeString
)"MM/dd/yyyy 'at' hh:mm:ss a zzz", status
);
904 if (U_FAILURE(status
)) {
905 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status
));
909 UDate currentTime_1
= date(97, UCAL_AUGUST
, 13, 10, 42, 28);
910 UnicodeString dateString
; ((DateFormat
*)formatter
)->format(currentTime_1
, dateString
);
911 UnicodeString
exp("08/13/1997 at 10:42:28 AM ");
912 logln((UnicodeString
)"format(" + dateToString(currentTime_1
) + ") = " + dateString
);
913 if (0 != dateString
.compareBetween(0, exp
.length(), exp
, 0, exp
.length())) errln((UnicodeString
)"FAIL: Expected " + exp
);
915 if (U_FAILURE(status
)) errln((UnicodeString
)"FAIL: UErrorCode received during test: " + (int32_t)status
);
918 // -------------------------------------
921 * Verify the correct behavior when handling invalid input strings.
924 DateFormatTest::TestBadInput135()
926 UErrorCode status
= U_ZERO_ERROR
;
927 DateFormat::EStyle looks
[] = {
928 DateFormat::SHORT
, DateFormat::MEDIUM
, DateFormat::LONG
, DateFormat::FULL
930 int32_t looks_length
= (int32_t)(sizeof(looks
) / sizeof(looks
[0]));
931 const char* strings
[] = {
932 "Mar 15", "Mar 15 1997", "asdf", "3/1/97 1:23:", "3/1/00 1:23:45 AM"
934 int32_t strings_length
= (int32_t)(sizeof(strings
) / sizeof(strings
[0]));
935 DateFormat
*full
= DateFormat::createDateTimeInstance(DateFormat::LONG
, DateFormat::LONG
);
937 dataerrln("could not create date time instance");
940 UnicodeString
expected("March 1, 2000 at 1:23:45 AM ");
941 for (int32_t i
= 0; i
< strings_length
;++i
) {
942 const char* text
= strings
[i
];
943 for (int32_t j
= 0; j
< looks_length
;++j
) {
944 DateFormat::EStyle dateLook
= looks
[j
];
945 for (int32_t k
= 0; k
< looks_length
;++k
) {
946 DateFormat::EStyle timeLook
= looks
[k
];
947 DateFormat
*df
= DateFormat::createDateTimeInstance(dateLook
, timeLook
);
949 dataerrln("Error calling DateFormat::createDateTimeInstance()");
952 UnicodeString prefix
= UnicodeString(text
) + ", " + dateLook
+ "/" + timeLook
+ ": ";
954 UDate when
= df
->parse(text
, status
);
955 if (when
== 0 && U_SUCCESS(status
)) {
956 errln(prefix
+ "SHOULD NOT HAPPEN: parse returned 0.");
959 if (U_SUCCESS(status
))
961 UnicodeString format
;
962 UnicodeString pattern
;
963 SimpleDateFormat
* sdtfmt
= dynamic_cast<SimpleDateFormat
*>(df
);
964 if (sdtfmt
!= NULL
) {
965 sdtfmt
->toPattern(pattern
);
967 full
->format(when
, format
);
968 logln(prefix
+ "OK: " + format
);
969 if (0!=format
.compareBetween(0, expected
.length(), expected
, 0, expected
.length()))
970 errln((UnicodeString
)"FAIL: Parse \"" + text
+ "\", pattern \"" + pattern
+ "\", expected " + expected
+ " got " + format
);
973 //catch(ParseException e) {
975 status
= U_ZERO_ERROR
;
977 //catch(StringIndexOutOfBoundsException e) {
978 // errln(prefix + "SHOULD NOT HAPPEN: " + (int)status);
985 if (U_FAILURE(status
))
986 errln((UnicodeString
)"FAIL: UErrorCode received during test: " + (int32_t)status
);
989 static const char* const parseFormats
[] = {
998 "h:mm a MMMM d, yyyy"
1002 // strict inputStrings
1003 static const char* const inputStrings
[] = {
1004 "bogus string", 0, 0, 0, 0, 0, 0, 0, 0, 0,
1005 "April 1, 1997", "April 1, 1997", 0, 0, 0, 0, 0, "April 1", 0, 0,
1006 "Jan 1, 1970", "January 1, 1970", 0, 0, 0, 0, 0, "January 1", 0, 0,
1007 "Jan 1 2037", 0, "January 1 2037", 0, 0, 0, 0, "January 1", 0, 0,
1008 "1/1/70", 0, 0, "1/1/70", 0, 0, 0, 0, "0001", 0,
1009 "5 May 1997", 0, 0, 0, 0, "5 May 1997", "5 May", 0, "0005", 0,
1010 "16 May", 0, 0, 0, 0, 0, "16 May", 0, "0016", 0,
1011 "April 30", 0, 0, 0, 0, 0, 0, "April 30", 0, 0,
1012 "1998", 0, 0, 0, 0, 0, 0, 0, "1998", 0,
1013 "1", 0, 0, 0, 0, 0, 0, 0, "0001", 0,
1014 "3:00 pm Jan 1, 1997", 0, 0, 0, 0, 0, 0, 0, "0003", "3:00 PM January 1, 1997",
1017 // lenient inputStrings
1018 static const char* const inputStrings
[] = {
1019 "bogus string", 0, 0, 0, 0, 0, 0, 0, 0, 0,
1020 "April 1, 1997", "April 1, 1997", "April 1 1997", "4/1/97", 0, 0, 0, "April 1", 0, 0,
1021 "Jan 1, 1970", "January 1, 1970", "January 1 1970", "1/1/70", 0, 0, 0, "January 1", 0, 0,
1022 "Jan 1 2037", "January 1, 2037", "January 1 2037", "1/1/37", 0, 0, 0, "January 1", 0, 0,
1023 "1/1/70", "January 1, 0070", "January 1 0070", "1/1/70", "1 January, 0070", "1 January 0070", "1 January", "January 1", "0001", 0,
1024 "5 May 1997", 0, 0, 0, "5 May, 1997", "5 May 1997", "5 May", 0, "0005", 0,
1025 "16 May", 0, 0, 0, 0, 0, "16 May", 0, "0016", 0,
1026 "April 30", 0, 0, 0, 0, 0, 0, "April 30", 0, 0,
1027 "1998", 0, 0, 0, 0, 0, 0, 0, "1998", 0,
1028 "1", 0, 0, 0, 0, 0, 0, 0, "0001", 0,
1029 "3:00 pm Jan 1, 1997", 0, 0, 0, 0, 0, 0, 0, "0003", "3:00 PM January 1, 1997",
1033 // -------------------------------------
1036 * Verify the correct behavior when parsing an array of inputs against an
1037 * array of patterns, with known results. The results are encoded after
1038 * the input strings in each row.
1041 DateFormatTest::TestBadInput135a()
1043 UErrorCode status
= U_ZERO_ERROR
;
1044 SimpleDateFormat
* dateParse
= new SimpleDateFormat(status
);
1045 if(U_FAILURE(status
)) {
1046 dataerrln("Failed creating SimpleDateFormat with %s. Quitting test", u_errorName(status
));
1052 const uint32_t PF_LENGTH
= (int32_t)(sizeof(parseFormats
)/sizeof(parseFormats
[0]));
1053 const uint32_t INPUT_LENGTH
= (int32_t)(sizeof(inputStrings
)/sizeof(inputStrings
[0]));
1055 dateParse
->applyPattern("d MMMM, yyyy");
1056 dateParse
->adoptTimeZone(TimeZone::createDefault());
1057 s
= "not parseable";
1058 UnicodeString thePat
;
1059 logln(UnicodeString("Trying to parse \"") + s
+ "\" with " + dateParse
->toPattern(thePat
));
1061 date
= dateParse
->parse(s
, status
);
1062 if (U_SUCCESS(status
))
1063 errln((UnicodeString
)"FAIL: Expected exception during parse");
1065 //catch(Exception ex) {
1067 logln((UnicodeString
)"Exception during parse: " + (int32_t)status
);
1068 status
= U_ZERO_ERROR
;
1070 for (uint32_t i
= 0; i
< INPUT_LENGTH
; i
+= (PF_LENGTH
+ 1)) {
1071 ParsePosition
parsePosition(0);
1072 UnicodeString
s( inputStrings
[i
]);
1073 for (uint32_t index
= 0; index
< PF_LENGTH
;++index
) {
1074 const char* expected
= inputStrings
[i
+ 1 + index
];
1075 dateParse
->applyPattern(parseFormats
[index
]);
1076 dateParse
->adoptTimeZone(TimeZone::createDefault());
1078 parsePosition
.setIndex(0);
1079 date
= dateParse
->parse(s
, parsePosition
);
1080 if (parsePosition
.getIndex() != 0) {
1081 UnicodeString s1
, s2
;
1082 s
.extract(0, parsePosition
.getIndex(), s1
);
1083 s
.extract(parsePosition
.getIndex(), s
.length(), s2
);
1085 errln((UnicodeString
)"ERROR: null result fmt=\"" +
1086 parseFormats
[index
] +
1087 "\" pos=" + parsePosition
.getIndex() + " " +
1091 UnicodeString result
;
1092 ((DateFormat
*)dateParse
)->format(date
, result
);
1093 logln((UnicodeString
)"Parsed \"" + s
+ "\" using \"" + dateParse
->toPattern(thePat
) + "\" to: " + result
);
1095 errln((UnicodeString
)"FAIL: Expected parse failure, got " + result
);
1096 else if (!(result
== expected
))
1097 errln(UnicodeString("FAIL: Parse \"") + s
+ UnicodeString("\", expected ") + expected
+ UnicodeString(", got ") + result
);
1100 else if (expected
!= 0) {
1101 errln(UnicodeString("FAIL: Expected ") + expected
+ " from \"" +
1102 s
+ "\" with \"" + dateParse
->toPattern(thePat
) + "\"");
1105 //catch(Exception ex) {
1106 if (U_FAILURE(status
))
1107 errln((UnicodeString
)"An exception was thrown during parse: " + (int32_t)status
);
1112 if (U_FAILURE(status
))
1113 errln((UnicodeString
)"FAIL: UErrorCode received during test: " + (int32_t)status
);
1116 // -------------------------------------
1119 * Test the parsing of two-digit years.
1122 DateFormatTest::TestTwoDigitYear()
1124 UErrorCode ec
= U_ZERO_ERROR
;
1125 SimpleDateFormat
fmt("dd/MM/yy", Locale::getUK(), ec
);
1126 if (U_FAILURE(ec
)) {
1127 dataerrln("FAIL: SimpleDateFormat constructor - %s", u_errorName(ec
));
1130 parse2DigitYear(fmt
, "5/6/17", date(117, UCAL_JUNE
, 5));
1131 parse2DigitYear(fmt
, "4/6/34", date(34, UCAL_JUNE
, 4));
1134 // -------------------------------------
1137 DateFormatTest::parse2DigitYear(DateFormat
& fmt
, const char* str
, UDate expected
)
1139 UErrorCode status
= U_ZERO_ERROR
;
1141 UDate d
= fmt
.parse(str
, status
);
1142 UnicodeString thePat
;
1143 logln(UnicodeString("Parsing \"") + str
+ "\" with " + ((SimpleDateFormat
*)&fmt
)->toPattern(thePat
) +
1144 " => " + dateToString(d
));
1145 if (d
!= expected
) errln((UnicodeString
)"FAIL: Expected " + expected
);
1147 //catch(ParseException e) {
1148 if (U_FAILURE(status
))
1149 errln((UnicodeString
)"FAIL: Got exception");
1153 // -------------------------------------
1156 * Test the formatting of time zones.
1159 DateFormatTest::TestDateFormatZone061()
1161 UErrorCode status
= U_ZERO_ERROR
;
1163 DateFormat
*formatter
;
1164 date
= 859248000000.0;
1165 logln((UnicodeString
)"Date 1997/3/25 00:00 GMT: " + date
);
1166 formatter
= new SimpleDateFormat((UnicodeString
)"dd-MMM-yyyyy HH:mm", Locale::getUK(), status
);
1167 if(U_FAILURE(status
)) {
1168 dataerrln("Failed creating SimpleDateFormat with %s. Quitting test", u_errorName(status
));
1172 formatter
->adoptTimeZone(TimeZone::createTimeZone("GMT"));
1173 UnicodeString temp
; formatter
->format(date
, temp
);
1174 logln((UnicodeString
)"Formatted in GMT to: " + temp
);
1176 UDate tempDate
= formatter
->parse(temp
, status
);
1177 logln((UnicodeString
)"Parsed to: " + dateToString(tempDate
));
1178 if (tempDate
!= date
) errln((UnicodeString
)"FAIL: Expected " + dateToString(date
));
1180 //catch(Throwable t) {
1181 if (U_FAILURE(status
))
1182 errln((UnicodeString
)"Date Formatter throws: " + (int32_t)status
);
1187 // -------------------------------------
1190 * Test the formatting of time zones.
1193 DateFormatTest::TestDateFormatZone146()
1195 TimeZone
*saveDefault
= TimeZone::createDefault();
1198 TimeZone
*thedefault
= TimeZone::createTimeZone("GMT");
1199 TimeZone::setDefault(*thedefault
);
1200 // java.util.Locale.setDefault(new java.util.Locale("ar", "", ""));
1202 // check to be sure... its GMT all right
1203 TimeZone
*testdefault
= TimeZone::createDefault();
1204 UnicodeString testtimezone
;
1205 testdefault
->getID(testtimezone
);
1206 if (testtimezone
== "GMT")
1207 logln("Test timezone = " + testtimezone
);
1209 dataerrln("Test timezone should be GMT, not " + testtimezone
);
1211 UErrorCode status
= U_ZERO_ERROR
;
1212 // now try to use the default GMT time zone
1213 GregorianCalendar
*greenwichcalendar
=
1214 new GregorianCalendar(1997, 3, 4, 23, 0, status
);
1215 if (U_FAILURE(status
)) {
1216 dataerrln("Fail new GregorianCalendar: %s", u_errorName(status
));
1218 //*****************************greenwichcalendar.setTimeZone(TimeZone.getDefault());
1219 //greenwichcalendar.set(1997, 3, 4, 23, 0);
1220 // try anything to set hour to 23:00 !!!
1221 greenwichcalendar
->set(UCAL_HOUR_OF_DAY
, 23);
1223 UDate greenwichdate
= greenwichcalendar
->getTime(status
);
1225 UnicodeString DATA
[] = {
1226 UnicodeString("simple format: "), UnicodeString("04/04/97 23:00 GMT"),
1227 UnicodeString("MM/dd/yy HH:mm z"),
1228 UnicodeString("full format: "), UnicodeString("Friday, April 4, 1997 11:00:00 o'clock PM GMT"),
1229 UnicodeString("EEEE, MMMM d, yyyy h:mm:ss 'o''clock' a z"),
1230 UnicodeString("long format: "), UnicodeString("April 4, 1997 11:00:00 PM GMT"),
1231 UnicodeString("MMMM d, yyyy h:mm:ss a z"),
1232 UnicodeString("default format: "), UnicodeString("04-Apr-97 11:00:00 PM"),
1233 UnicodeString("dd-MMM-yy h:mm:ss a"),
1234 UnicodeString("short format: "), UnicodeString("4/4/97 11:00 PM"),
1235 UnicodeString("M/d/yy h:mm a")
1237 int32_t DATA_length
= (int32_t)(sizeof(DATA
) / sizeof(DATA
[0]));
1239 for (int32_t i
=0; i
<DATA_length
; i
+=3) {
1240 DateFormat
*fmt
= new SimpleDateFormat(DATA
[i
+2], Locale::getEnglish(), status
);
1241 if (U_FAILURE(status
)) {
1242 dataerrln("Unable to create SimpleDateFormat - %s", u_errorName(status
));
1245 fmt
->setCalendar(*greenwichcalendar
);
1246 UnicodeString result
;
1247 result
= fmt
->format(greenwichdate
, result
);
1248 logln(DATA
[i
] + result
);
1249 if (result
!= DATA
[i
+1])
1250 errln("FAIL: Expected " + DATA
[i
+1] + ", got " + result
);
1256 TimeZone::adoptDefault(saveDefault
);
1259 delete greenwichcalendar
;
1265 // -------------------------------------
1268 * Test the formatting of dates in different locales.
1271 DateFormatTest::TestLocaleDateFormat() // Bug 495
1273 UDate testDate
= date(97, UCAL_SEPTEMBER
, 15);
1274 DateFormat
*dfFrench
= DateFormat::createDateTimeInstance(DateFormat::FULL
,
1275 DateFormat::FULL
, Locale::getFrench());
1276 DateFormat
*dfUS
= DateFormat::createDateTimeInstance(DateFormat::FULL
,
1277 DateFormat::FULL
, Locale::getUS());
1278 UnicodeString
expectedFRENCH ( "lundi 15 septembre 1997 00:00:00 heure avanc\\u00E9e du Pacifique", -1, US_INV
);
1279 expectedFRENCH
= expectedFRENCH
.unescape();
1280 UnicodeString
expectedUS ( "Monday, September 15, 1997 at 12:00:00 AM Pacific Daylight Time" );
1281 logln((UnicodeString
)"Date set to : " + dateToString(testDate
));
1283 if (dfUS
== NULL
|| dfFrench
== NULL
){
1284 dataerrln("Error calling DateFormat::createDateTimeInstance)");
1290 dfFrench
->format(testDate
, out
);
1291 logln((UnicodeString
)"Date Formated with French Locale " + out
);
1292 if (!(out
== expectedFRENCH
))
1293 errln((UnicodeString
)"FAIL: Expected " + expectedFRENCH
);
1295 dfUS
->format(testDate
, out
);
1296 logln((UnicodeString
)"Date Formated with US Locale " + out
);
1297 if (!(out
== expectedUS
))
1298 errln((UnicodeString
)"FAIL: Expected " + expectedUS
);
1304 * Test DateFormat(Calendar) API
1306 void DateFormatTest::TestDateFormatCalendar() {
1307 DateFormat
*date
=0, *time
=0, *full
=0;
1312 UErrorCode ec
= U_ZERO_ERROR
;
1314 /* Create a formatter for date fields. */
1315 date
= DateFormat::createDateInstance(DateFormat::kShort
, Locale::getUS());
1317 dataerrln("FAIL: createDateInstance failed");
1321 /* Create a formatter for time fields. */
1322 time
= DateFormat::createTimeInstance(DateFormat::kShort
, Locale::getUS());
1324 errln("FAIL: createTimeInstance failed");
1328 /* Create a full format for output */
1329 full
= DateFormat::createDateTimeInstance(DateFormat::kFull
, DateFormat::kFull
,
1332 errln("FAIL: createInstance failed");
1336 /* Create a calendar */
1337 cal
= Calendar::createInstance(Locale::getUS(), ec
);
1338 if (cal
== NULL
|| U_FAILURE(ec
)) {
1339 errln((UnicodeString
)"FAIL: Calendar::createInstance failed with " +
1344 /* Parse the date */
1346 str
= UnicodeString("4/5/2001", "");
1348 date
->parse(str
, *cal
, pos
);
1349 if (pos
.getIndex() != str
.length()) {
1350 errln((UnicodeString
)"FAIL: DateFormat::parse(4/5/2001) failed at " +
1355 /* Parse the time */
1356 str
= UnicodeString("5:45 PM", "");
1358 time
->parse(str
, *cal
, pos
);
1359 if (pos
.getIndex() != str
.length()) {
1360 errln((UnicodeString
)"FAIL: DateFormat::parse(17:45) failed at " +
1366 when
= cal
->getTime(ec
);
1367 if (U_FAILURE(ec
)) {
1368 errln((UnicodeString
)"FAIL: cal->getTime() failed with " + u_errorName(ec
));
1372 full
->format(when
, str
);
1373 // Thursday, April 5, 2001 5:45:00 PM PDT 986517900000
1374 if (when
== 986517900000.0) {
1375 logln("Ok: Parsed result: " + str
);
1377 errln("FAIL: Parsed result: " + str
+ ", exp 4/5/2001 5:45 PM");
1388 * Test DateFormat's parsing of space characters. See jitterbug 1916.
1390 void DateFormatTest::TestSpaceParsing() {
1391 const char* DATA
[] = {
1392 "yyyy MM dd HH:mm:ss",
1394 // pattern, input, expected parse or NULL if expect parse failure
1395 "MMMM d yy", " 04 05 06", "2006 04 05 00:00:00",
1396 NULL
, "04 05 06", "2006 04 05 00:00:00",
1398 "MM d yy", " 04 05 06", "2006 04 05 00:00:00",
1399 NULL
, "04 05 06", "2006 04 05 00:00:00",
1400 NULL
, "04/05/06", "2006 04 05 00:00:00",
1401 NULL
, "04-05-06", "2006 04 05 00:00:00",
1402 NULL
, "04.05.06", "2006 04 05 00:00:00",
1403 NULL
, "04 / 05 / 06", "2006 04 05 00:00:00",
1404 NULL
, "Apr / 05/ 06", "2006 04 05 00:00:00",
1405 NULL
, "Apr-05-06", "2006 04 05 00:00:00",
1406 NULL
, "Apr 05, 2006", "2006 04 05 00:00:00",
1408 "MMMM d yy", " Apr 05 06", "2006 04 05 00:00:00",
1409 NULL
, "Apr 05 06", "2006 04 05 00:00:00",
1410 NULL
, "Apr05 06", "2006 04 05 00:00:00",
1412 "hh:mm:ss a", "12:34:56 PM", "1970 01 01 12:34:56",
1413 NULL
, "12:34:56PM", "1970 01 01 12:34:56",
1414 NULL
, "12.34.56PM", "1970 01 01 12:34:56",
1415 NULL
, "12-34-56 PM", "1970 01 01 12:34:56",
1416 NULL
, "12 : 34 : 56 PM", "1970 01 01 12:34:56",
1418 "MM d yy 'at' hh:mm:ss a", "04/05/06 12:34:56 PM", "2006 04 05 12:34:56",
1420 "MMMM dd yyyy hh:mm a", "September 27, 1964 21:56 PM", "1964 09 28 09:56:00",
1421 NULL
, "November 4, 2008 0:13 AM", "2008 11 04 00:13:00",
1423 "HH'h'mm'min'ss's'", "12h34min56s", "1970 01 01 12:34:56",
1424 NULL
, "12h34mi56s", "1970 01 01 12:34:56",
1425 NULL
, "12h34m56s", "1970 01 01 12:34:56",
1426 NULL
, "12:34:56", "1970 01 01 12:34:56"
1428 const int32_t DATA_len
= sizeof(DATA
)/sizeof(DATA
[0]);
1430 expectParse(DATA
, DATA_len
, Locale("en"));
1434 * Test handling of "HHmmss" pattern.
1436 void DateFormatTest::TestExactCountFormat() {
1437 const char* DATA
[] = {
1438 "yyyy MM dd HH:mm:ss",
1440 // pattern, input, expected parse or NULL if expect parse failure
1441 "HHmmss", "123456", "1970 01 01 12:34:56",
1442 NULL
, "12345", "1970 01 01 01:23:45",
1444 NULL
, "00-05", NULL
,
1445 NULL
, "12-34", NULL
,
1446 NULL
, "00+05", NULL
,
1447 "ahhmm", "PM730", "1970 01 01 19:30:00",
1449 const int32_t DATA_len
= sizeof(DATA
)/sizeof(DATA
[0]);
1451 expectParse(DATA
, DATA_len
, Locale("en"));
1455 * Test handling of white space.
1457 void DateFormatTest::TestWhiteSpaceParsing() {
1458 const char* DATA
[] = {
1461 // pattern, input, expected parse or null if expect parse failure
1463 // Pattern space run should parse input text space run
1464 "MM d yy", " 04 01 03", "2003 04 01",
1465 NULL
, " 04 01 03 ", "2003 04 01",
1467 const int32_t DATA_len
= sizeof(DATA
)/sizeof(DATA
[0]);
1469 expectParse(DATA
, DATA_len
, Locale("en"));
1473 void DateFormatTest::TestInvalidPattern() {
1474 UErrorCode ec
= U_ZERO_ERROR
;
1475 SimpleDateFormat
f(UnicodeString("Yesterday"), ec
);
1476 if (U_FAILURE(ec
)) {
1477 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(ec
));
1482 f
.format((UDate
)0, out
, pos
);
1484 // The bug is that the call to format() will crash. By not
1485 // crashing, the test passes.
1488 void DateFormatTest::TestGreekMay() {
1489 UErrorCode ec
= U_ZERO_ERROR
;
1490 UDate date
= -9896080848000.0;
1491 SimpleDateFormat
fmt("EEEE, dd MMMM yyyy h:mm:ss a", Locale("el", "", ""), ec
);
1492 if (U_FAILURE(ec
)) {
1493 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(ec
));
1497 fmt
.format(date
, str
);
1498 ParsePosition
pos(0);
1499 UDate d2
= fmt
.parse(str
, pos
);
1501 errln("FAIL: unable to parse strings where case-folding changes length");
1505 void DateFormatTest::TestStandAloneMonths()
1507 const char *EN_DATA
[] = {
1508 "yyyy MM dd HH:mm:ss",
1510 "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",
1511 "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",
1512 "yyyy LLLL dd H:mm:ss", "F", "2004 03 10 16:36:31", "2004 March 10 16:36:31",
1513 "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",
1515 "LLLL", "fp", "1970 01 01 0:00:00", "January", "1970 01 01 0:00:00",
1516 "LLLL", "fp", "1970 02 01 0:00:00", "February", "1970 02 01 0:00:00",
1517 "LLLL", "fp", "1970 03 01 0:00:00", "March", "1970 03 01 0:00:00",
1518 "LLLL", "fp", "1970 04 01 0:00:00", "April", "1970 04 01 0:00:00",
1519 "LLLL", "fp", "1970 05 01 0:00:00", "May", "1970 05 01 0:00:00",
1520 "LLLL", "fp", "1970 06 01 0:00:00", "June", "1970 06 01 0:00:00",
1521 "LLLL", "fp", "1970 07 01 0:00:00", "July", "1970 07 01 0:00:00",
1522 "LLLL", "fp", "1970 08 01 0:00:00", "August", "1970 08 01 0:00:00",
1523 "LLLL", "fp", "1970 09 01 0:00:00", "September", "1970 09 01 0:00:00",
1524 "LLLL", "fp", "1970 10 01 0:00:00", "October", "1970 10 01 0:00:00",
1525 "LLLL", "fp", "1970 11 01 0:00:00", "November", "1970 11 01 0:00:00",
1526 "LLLL", "fp", "1970 12 01 0:00:00", "December", "1970 12 01 0:00:00",
1528 "LLL", "fp", "1970 01 01 0:00:00", "Jan", "1970 01 01 0:00:00",
1529 "LLL", "fp", "1970 02 01 0:00:00", "Feb", "1970 02 01 0:00:00",
1530 "LLL", "fp", "1970 03 01 0:00:00", "Mar", "1970 03 01 0:00:00",
1531 "LLL", "fp", "1970 04 01 0:00:00", "Apr", "1970 04 01 0:00:00",
1532 "LLL", "fp", "1970 05 01 0:00:00", "May", "1970 05 01 0:00:00",
1533 "LLL", "fp", "1970 06 01 0:00:00", "Jun", "1970 06 01 0:00:00",
1534 "LLL", "fp", "1970 07 01 0:00:00", "Jul", "1970 07 01 0:00:00",
1535 "LLL", "fp", "1970 08 01 0:00:00", "Aug", "1970 08 01 0:00:00",
1536 "LLL", "fp", "1970 09 01 0:00:00", "Sep", "1970 09 01 0:00:00",
1537 "LLL", "fp", "1970 10 01 0:00:00", "Oct", "1970 10 01 0:00:00",
1538 "LLL", "fp", "1970 11 01 0:00:00", "Nov", "1970 11 01 0:00:00",
1539 "LLL", "fp", "1970 12 01 0:00:00", "Dec", "1970 12 01 0:00:00",
1542 const char *CS_DATA
[] = {
1543 "yyyy MM dd HH:mm:ss",
1545 "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",
1546 "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",
1547 "yyyy LLL dd H:mm:ss", "fp", "2004 04 10 16:36:31", "2004 dub 10 16:36:31", "2004 04 10 16:36:31",
1548 "yyyy LLLL dd H:mm:ss", "F", "2004 04 10 16:36:31", "2004 duben 10 16:36:31",
1549 "yyyy MMMM dd H:mm:ss", "F", "2004 04 10 16:36:31", "2004 dubna 10 16:36:31",
1550 "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",
1551 "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",
1553 "LLLL", "fp", "1970 01 01 0:00:00", "leden", "1970 01 01 0:00:00",
1554 "LLLL", "fp", "1970 02 01 0:00:00", "\\u00FAnor", "1970 02 01 0:00:00",
1555 "LLLL", "fp", "1970 03 01 0:00:00", "b\\u0159ezen", "1970 03 01 0:00:00",
1556 "LLLL", "fp", "1970 04 01 0:00:00", "duben", "1970 04 01 0:00:00",
1557 "LLLL", "fp", "1970 05 01 0:00:00", "kv\\u011Bten", "1970 05 01 0:00:00",
1558 "LLLL", "fp", "1970 06 01 0:00:00", "\\u010Derven", "1970 06 01 0:00:00",
1559 "LLLL", "fp", "1970 07 01 0:00:00", "\\u010Dervenec", "1970 07 01 0:00:00",
1560 "LLLL", "fp", "1970 08 01 0:00:00", "srpen", "1970 08 01 0:00:00",
1561 "LLLL", "fp", "1970 09 01 0:00:00", "z\\u00E1\\u0159\\u00ED", "1970 09 01 0:00:00",
1562 "LLLL", "fp", "1970 10 01 0:00:00", "\\u0159\\u00EDjen", "1970 10 01 0:00:00",
1563 "LLLL", "fp", "1970 11 01 0:00:00", "listopad", "1970 11 01 0:00:00",
1564 "LLLL", "fp", "1970 12 01 0:00:00", "prosinec", "1970 12 01 0:00:00",
1566 "LLL", "fp", "1970 01 01 0:00:00", "led", "1970 01 01 0:00:00",
1567 "LLL", "fp", "1970 02 01 0:00:00", "\\u00FAno", "1970 02 01 0:00:00",
1568 "LLL", "fp", "1970 03 01 0:00:00", "b\\u0159e", "1970 03 01 0:00:00",
1569 "LLL", "fp", "1970 04 01 0:00:00", "dub", "1970 04 01 0:00:00",
1570 "LLL", "fp", "1970 05 01 0:00:00", "kv\\u011B", "1970 05 01 0:00:00",
1571 "LLL", "fp", "1970 06 01 0:00:00", "\\u010Dvn", "1970 06 01 0:00:00",
1572 "LLL", "fp", "1970 07 01 0:00:00", "\\u010Dvc", "1970 07 01 0:00:00",
1573 "LLL", "fp", "1970 08 01 0:00:00", "srp", "1970 08 01 0:00:00",
1574 "LLL", "fp", "1970 09 01 0:00:00", "z\\u00E1\\u0159", "1970 09 01 0:00:00",
1575 "LLL", "fp", "1970 10 01 0:00:00", "\\u0159\\u00EDj", "1970 10 01 0:00:00",
1576 "LLL", "fp", "1970 11 01 0:00:00", "lis", "1970 11 01 0:00:00",
1577 "LLL", "fp", "1970 12 01 0:00:00", "pro", "1970 12 01 0:00:00",
1580 expect(EN_DATA
, ARRAY_SIZE(EN_DATA
), Locale("en", "", ""));
1581 expect(CS_DATA
, ARRAY_SIZE(CS_DATA
), Locale("cs", "", ""));
1584 void DateFormatTest::TestStandAloneDays()
1586 const char *EN_DATA
[] = {
1587 "yyyy MM dd HH:mm:ss",
1589 "cccc", "fp", "1970 01 04 0:00:00", "Sunday", "1970 01 04 0:00:00",
1590 "cccc", "fp", "1970 01 05 0:00:00", "Monday", "1970 01 05 0:00:00",
1591 "cccc", "fp", "1970 01 06 0:00:00", "Tuesday", "1970 01 06 0:00:00",
1592 "cccc", "fp", "1970 01 07 0:00:00", "Wednesday", "1970 01 07 0:00:00",
1593 "cccc", "fp", "1970 01 01 0:00:00", "Thursday", "1970 01 01 0:00:00",
1594 "cccc", "fp", "1970 01 02 0:00:00", "Friday", "1970 01 02 0:00:00",
1595 "cccc", "fp", "1970 01 03 0:00:00", "Saturday", "1970 01 03 0:00:00",
1597 "ccc", "fp", "1970 01 04 0:00:00", "Sun", "1970 01 04 0:00:00",
1598 "ccc", "fp", "1970 01 05 0:00:00", "Mon", "1970 01 05 0:00:00",
1599 "ccc", "fp", "1970 01 06 0:00:00", "Tue", "1970 01 06 0:00:00",
1600 "ccc", "fp", "1970 01 07 0:00:00", "Wed", "1970 01 07 0:00:00",
1601 "ccc", "fp", "1970 01 01 0:00:00", "Thu", "1970 01 01 0:00:00",
1602 "ccc", "fp", "1970 01 02 0:00:00", "Fri", "1970 01 02 0:00:00",
1603 "ccc", "fp", "1970 01 03 0:00:00", "Sat", "1970 01 03 0:00:00",
1606 const char *CS_DATA
[] = {
1607 "yyyy MM dd HH:mm:ss",
1609 "cccc", "fp", "1970 01 04 0:00:00", "ned\\u011Ble", "1970 01 04 0:00:00",
1610 "cccc", "fp", "1970 01 05 0:00:00", "pond\\u011Bl\\u00ED", "1970 01 05 0:00:00",
1611 "cccc", "fp", "1970 01 06 0:00:00", "\\u00FAter\\u00FD", "1970 01 06 0:00:00",
1612 "cccc", "fp", "1970 01 07 0:00:00", "st\\u0159eda", "1970 01 07 0:00:00",
1613 "cccc", "fp", "1970 01 01 0:00:00", "\\u010Dtvrtek", "1970 01 01 0:00:00",
1614 "cccc", "fp", "1970 01 02 0:00:00", "p\\u00E1tek", "1970 01 02 0:00:00",
1615 "cccc", "fp", "1970 01 03 0:00:00", "sobota", "1970 01 03 0:00:00",
1617 "ccc", "fp", "1970 01 04 0:00:00", "ne", "1970 01 04 0:00:00",
1618 "ccc", "fp", "1970 01 05 0:00:00", "po", "1970 01 05 0:00:00",
1619 "ccc", "fp", "1970 01 06 0:00:00", "\\u00FAt", "1970 01 06 0:00:00",
1620 "ccc", "fp", "1970 01 07 0:00:00", "st", "1970 01 07 0:00:00",
1621 "ccc", "fp", "1970 01 01 0:00:00", "\\u010Dt", "1970 01 01 0:00:00",
1622 "ccc", "fp", "1970 01 02 0:00:00", "p\\u00E1", "1970 01 02 0:00:00",
1623 "ccc", "fp", "1970 01 03 0:00:00", "so", "1970 01 03 0:00:00",
1626 expect(EN_DATA
, ARRAY_SIZE(EN_DATA
), Locale("en", "", ""));
1627 expect(CS_DATA
, ARRAY_SIZE(CS_DATA
), Locale("cs", "", ""));
1630 void DateFormatTest::TestShortDays()
1632 const char *EN_DATA
[] = {
1633 "yyyy MM dd HH:mm:ss",
1635 "EEEEEE, MMM d y", "fp", "2013 01 13 0:00:00", "Su, Jan 13 2013", "2013 01 13 0:00:00",
1636 "EEEEEE, MMM d y", "fp", "2013 01 16 0:00:00", "We, Jan 16 2013", "2013 01 16 0:00:00",
1637 "EEEEEE d", "fp", "1970 01 17 0:00:00", "Sa 17", "1970 01 17 0:00:00",
1638 "cccccc d", "fp", "1970 01 17 0:00:00", "Sa 17", "1970 01 17 0:00:00",
1639 "cccccc", "fp", "1970 01 03 0:00:00", "Sa", "1970 01 03 0:00:00",
1641 const char *SV_DATA
[] = {
1642 "yyyy MM dd HH:mm:ss",
1644 "EEEEEE d MMM y", "fp", "2013 01 13 0:00:00", "s\\u00F6 13 jan 2013", "2013 01 13 0:00:00",
1645 "EEEEEE d MMM y", "fp", "2013 01 16 0:00:00", "on 16 jan 2013", "2013 01 16 0:00:00",
1646 "EEEEEE d", "fp", "1970 01 17 0:00:00", "l\\u00F6 17", "1970 01 17 0:00:00",
1647 "cccccc d", "fp", "1970 01 17 0:00:00", "L\\u00F6 17", "1970 01 17 0:00:00",
1648 "cccccc", "fp", "1970 01 03 0:00:00", "L\\u00F6", "1970 01 03 0:00:00",
1650 expect(EN_DATA
, ARRAY_SIZE(EN_DATA
), Locale("en", "", ""));
1651 expect(SV_DATA
, ARRAY_SIZE(SV_DATA
), Locale("sv", "", ""));
1654 void DateFormatTest::TestNarrowNames()
1656 const char *EN_DATA
[] = {
1657 "yyyy MM dd HH:mm:ss",
1659 "yyyy MMMMM dd H:mm:ss", "2004 03 10 16:36:31", "2004 M 10 16:36:31",
1660 "yyyy LLLLL dd H:mm:ss", "2004 03 10 16:36:31", "2004 M 10 16:36:31",
1662 "MMMMM", "1970 01 01 0:00:00", "J",
1663 "MMMMM", "1970 02 01 0:00:00", "F",
1664 "MMMMM", "1970 03 01 0:00:00", "M",
1665 "MMMMM", "1970 04 01 0:00:00", "A",
1666 "MMMMM", "1970 05 01 0:00:00", "M",
1667 "MMMMM", "1970 06 01 0:00:00", "J",
1668 "MMMMM", "1970 07 01 0:00:00", "J",
1669 "MMMMM", "1970 08 01 0:00:00", "A",
1670 "MMMMM", "1970 09 01 0:00:00", "S",
1671 "MMMMM", "1970 10 01 0:00:00", "O",
1672 "MMMMM", "1970 11 01 0:00:00", "N",
1673 "MMMMM", "1970 12 01 0:00:00", "D",
1675 "LLLLL", "1970 01 01 0:00:00", "J",
1676 "LLLLL", "1970 02 01 0:00:00", "F",
1677 "LLLLL", "1970 03 01 0:00:00", "M",
1678 "LLLLL", "1970 04 01 0:00:00", "A",
1679 "LLLLL", "1970 05 01 0:00:00", "M",
1680 "LLLLL", "1970 06 01 0:00:00", "J",
1681 "LLLLL", "1970 07 01 0:00:00", "J",
1682 "LLLLL", "1970 08 01 0:00:00", "A",
1683 "LLLLL", "1970 09 01 0:00:00", "S",
1684 "LLLLL", "1970 10 01 0:00:00", "O",
1685 "LLLLL", "1970 11 01 0:00:00", "N",
1686 "LLLLL", "1970 12 01 0:00:00", "D",
1688 "EEEEE", "1970 01 04 0:00:00", "S",
1689 "EEEEE", "1970 01 05 0:00:00", "M",
1690 "EEEEE", "1970 01 06 0:00:00", "T",
1691 "EEEEE", "1970 01 07 0:00:00", "W",
1692 "EEEEE", "1970 01 01 0:00:00", "T",
1693 "EEEEE", "1970 01 02 0:00:00", "F",
1694 "EEEEE", "1970 01 03 0:00:00", "S",
1696 "ccccc", "1970 01 04 0:00:00", "S",
1697 "ccccc", "1970 01 05 0:00:00", "M",
1698 "ccccc", "1970 01 06 0:00:00", "T",
1699 "ccccc", "1970 01 07 0:00:00", "W",
1700 "ccccc", "1970 01 01 0:00:00", "T",
1701 "ccccc", "1970 01 02 0:00:00", "F",
1702 "ccccc", "1970 01 03 0:00:00", "S",
1705 const char *CS_DATA
[] = {
1706 "yyyy MM dd HH:mm:ss",
1708 "yyyy LLLLL dd H:mm:ss", "2004 04 10 16:36:31", "2004 d 10 16:36:31",
1709 "yyyy MMMMM dd H:mm:ss", "2004 04 10 16:36:31", "2004 4 10 16:36:31",
1711 "MMMMM", "1970 01 01 0:00:00", "1",
1712 "MMMMM", "1970 02 01 0:00:00", "2",
1713 "MMMMM", "1970 03 01 0:00:00", "3",
1714 "MMMMM", "1970 04 01 0:00:00", "4",
1715 "MMMMM", "1970 05 01 0:00:00", "5",
1716 "MMMMM", "1970 06 01 0:00:00", "6",
1717 "MMMMM", "1970 07 01 0:00:00", "7",
1718 "MMMMM", "1970 08 01 0:00:00", "8",
1719 "MMMMM", "1970 09 01 0:00:00", "9",
1720 "MMMMM", "1970 10 01 0:00:00", "10",
1721 "MMMMM", "1970 11 01 0:00:00", "11",
1722 "MMMMM", "1970 12 01 0:00:00", "12",
1724 "LLLLL", "1970 01 01 0:00:00", "l",
1725 "LLLLL", "1970 02 01 0:00:00", "\\u00FA",
1726 "LLLLL", "1970 03 01 0:00:00", "b",
1727 "LLLLL", "1970 04 01 0:00:00", "d",
1728 "LLLLL", "1970 05 01 0:00:00", "k",
1729 "LLLLL", "1970 06 01 0:00:00", "\\u010D",
1730 "LLLLL", "1970 07 01 0:00:00", "\\u010D",
1731 "LLLLL", "1970 08 01 0:00:00", "s",
1732 "LLLLL", "1970 09 01 0:00:00", "z",
1733 "LLLLL", "1970 10 01 0:00:00", "\\u0159",
1734 "LLLLL", "1970 11 01 0:00:00", "l",
1735 "LLLLL", "1970 12 01 0:00:00", "p",
1737 "EEEEE", "1970 01 04 0:00:00", "N",
1738 "EEEEE", "1970 01 05 0:00:00", "P",
1739 "EEEEE", "1970 01 06 0:00:00", "\\u00DA",
1740 "EEEEE", "1970 01 07 0:00:00", "S",
1741 "EEEEE", "1970 01 01 0:00:00", "\\u010C",
1742 "EEEEE", "1970 01 02 0:00:00", "P",
1743 "EEEEE", "1970 01 03 0:00:00", "S",
1745 "ccccc", "1970 01 04 0:00:00", "N",
1746 "ccccc", "1970 01 05 0:00:00", "P",
1747 "ccccc", "1970 01 06 0:00:00", "\\u00DA",
1748 "ccccc", "1970 01 07 0:00:00", "S",
1749 "ccccc", "1970 01 01 0:00:00", "\\u010C",
1750 "ccccc", "1970 01 02 0:00:00", "P",
1751 "ccccc", "1970 01 03 0:00:00", "S",
1754 expectFormat(EN_DATA
, ARRAY_SIZE(EN_DATA
), Locale("en", "", ""));
1755 expectFormat(CS_DATA
, ARRAY_SIZE(CS_DATA
), Locale("cs", "", ""));
1758 void DateFormatTest::TestEras()
1760 const char *EN_DATA
[] = {
1763 "MMMM dd yyyy G", "fp", "1951 07 17", "July 17 1951 AD", "1951 07 17",
1764 "MMMM dd yyyy GG", "fp", "1951 07 17", "July 17 1951 AD", "1951 07 17",
1765 "MMMM dd yyyy GGG", "fp", "1951 07 17", "July 17 1951 AD", "1951 07 17",
1766 "MMMM dd yyyy GGGG", "fp", "1951 07 17", "July 17 1951 Anno Domini", "1951 07 17",
1768 "MMMM dd yyyy G", "fp", "-438 07 17", "July 17 0439 BC", "-438 07 17",
1769 "MMMM dd yyyy GG", "fp", "-438 07 17", "July 17 0439 BC", "-438 07 17",
1770 "MMMM dd yyyy GGG", "fp", "-438 07 17", "July 17 0439 BC", "-438 07 17",
1771 "MMMM dd yyyy GGGG", "fp", "-438 07 17", "July 17 0439 Before Christ", "-438 07 17",
1774 expect(EN_DATA
, ARRAY_SIZE(EN_DATA
), Locale("en", "", ""));
1777 void DateFormatTest::TestQuarters()
1779 const char *EN_DATA
[] = {
1782 "Q", "fp", "1970 01 01", "1", "1970 01 01",
1783 "QQ", "fp", "1970 04 01", "02", "1970 04 01",
1784 "QQQ", "fp", "1970 07 01", "Q3", "1970 07 01",
1785 "QQQQ", "fp", "1970 10 01", "4th quarter", "1970 10 01",
1787 "q", "fp", "1970 01 01", "1", "1970 01 01",
1788 "qq", "fp", "1970 04 01", "02", "1970 04 01",
1789 "qqq", "fp", "1970 07 01", "Q3", "1970 07 01",
1790 "qqqq", "fp", "1970 10 01", "4th quarter", "1970 10 01",
1793 expect(EN_DATA
, ARRAY_SIZE(EN_DATA
), Locale("en", "", ""));
1797 * Test parsing. Input is an array that starts with the following
1800 * [0] = pattern string to parse [i+2] with
1802 * followed by test cases, each of which is 3 array elements:
1804 * [i] = pattern, or NULL to reuse prior pattern
1805 * [i+1] = input string
1806 * [i+2] = expected parse result (parsed with pattern [0])
1808 * If expect parse failure, then [i+2] should be NULL.
1810 void DateFormatTest::expectParse(const char** data
, int32_t data_length
,
1811 const Locale
& loc
) {
1812 const UDate FAIL
= (UDate
) -1;
1813 const UnicodeString
FAIL_STR("parse failure");
1816 UErrorCode ec
= U_ZERO_ERROR
;
1817 SimpleDateFormat
fmt("", loc
, ec
);
1818 SimpleDateFormat
ref(data
[i
++], loc
, ec
);
1819 SimpleDateFormat
gotfmt("G yyyy MM dd HH:mm:ss z", loc
, ec
);
1820 if (U_FAILURE(ec
)) {
1821 dataerrln("FAIL: SimpleDateFormat constructor - %s", u_errorName(ec
));
1825 const char* currentPat
= NULL
;
1826 while (i
<data_length
) {
1827 const char* pattern
= data
[i
++];
1828 const char* input
= data
[i
++];
1829 const char* expected
= data
[i
++];
1832 if (pattern
!= NULL
) {
1833 fmt
.applyPattern(pattern
);
1834 currentPat
= pattern
;
1836 UDate got
= fmt
.parse(input
, ec
);
1837 UnicodeString
gotstr(FAIL_STR
);
1838 if (U_FAILURE(ec
)) {
1842 gotfmt
.format(got
, gotstr
);
1845 UErrorCode ec2
= U_ZERO_ERROR
;
1847 UnicodeString
expstr(FAIL_STR
);
1848 if (expected
!= NULL
) {
1850 exp
= ref
.parse(expstr
, ec2
);
1851 if (U_FAILURE(ec2
)) {
1852 // This only happens if expected is in wrong format --
1853 // should never happen once test is debugged.
1854 errln("FAIL: Internal test error");
1860 logln((UnicodeString
)"Ok: " + input
+ " x " +
1861 currentPat
+ " => " + gotstr
);
1863 errln((UnicodeString
)"FAIL: " + input
+ " x " +
1864 currentPat
+ " => " + gotstr
+ ", expected " +
1871 * Test formatting and parsing. Input is an array that starts
1872 * with the following header:
1874 * [0] = pattern string to parse [i+2] with
1876 * followed by test cases, each of which is 3 array elements:
1878 * [i] = pattern, or null to reuse prior pattern
1879 * [i+1] = control string, either "fp", "pf", or "F".
1880 * [i+2..] = data strings
1882 * The number of data strings depends on the control string.
1884 * 1. "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",
1885 * 'f': Format date [i+2] (as parsed using pattern [0]) and expect string [i+3].
1886 * 'p': Parse string [i+3] and expect date [i+4].
1888 * 2. "y/M/d H:mm:ss.SSS", "F", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.567"
1889 * 'F': Format date [i+2] and expect string [i+3],
1890 * then parse string [i+3] and expect date [i+2].
1892 * 3. "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",
1893 * 'p': Parse string [i+2] and expect date [i+3].
1894 * 'f': Format date [i+3] and expect string [i+4].
1896 void DateFormatTest::expect(const char** data
, int32_t data_length
,
1897 const Locale
& loc
) {
1899 UErrorCode ec
= U_ZERO_ERROR
;
1900 UnicodeString str
, str2
;
1901 SimpleDateFormat
fmt("", loc
, ec
);
1902 SimpleDateFormat
ref(data
[i
++], loc
, ec
);
1903 SimpleDateFormat
univ("EE G yyyy MM dd HH:mm:ss.SSS z", loc
, ec
);
1904 if (U_FAILURE(ec
)) {
1905 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(ec
));
1909 UnicodeString currentPat
;
1910 while (i
<data_length
) {
1911 const char* pattern
= data
[i
++];
1912 if (pattern
!= NULL
) {
1913 fmt
.applyPattern(pattern
);
1914 currentPat
= pattern
;
1917 const char* control
= data
[i
++];
1919 if (uprv_strcmp(control
, "fp") == 0) {
1921 const char* datestr
= data
[i
++];
1922 const char* string
= data
[i
++];
1923 UDate date
= ref
.parse(ctou(datestr
), ec
);
1924 if (!assertSuccess("parse", ec
)) return;
1925 assertEquals((UnicodeString
)"\"" + currentPat
+ "\".format(" + datestr
+ ")",
1927 fmt
.format(date
, str
.remove()));
1929 datestr
= data
[i
++];
1930 date
= ref
.parse(ctou(datestr
), ec
);
1931 if (!assertSuccess("parse", ec
)) return;
1932 UDate parsedate
= fmt
.parse(ctou(string
), ec
);
1933 if (assertSuccess((UnicodeString
)"\"" + currentPat
+ "\".parse(" + string
+ ")", ec
)) {
1934 assertEquals((UnicodeString
)"\"" + currentPat
+ "\".parse(" + string
+ ")",
1935 univ
.format(date
, str
.remove()),
1936 univ
.format(parsedate
, str2
.remove()));
1940 else if (uprv_strcmp(control
, "pf") == 0) {
1942 const char* string
= data
[i
++];
1943 const char* datestr
= data
[i
++];
1944 UDate date
= ref
.parse(ctou(datestr
), ec
);
1945 if (!assertSuccess("parse", ec
)) return;
1946 UDate parsedate
= fmt
.parse(ctou(string
), ec
);
1947 if (assertSuccess((UnicodeString
)"\"" + currentPat
+ "\".parse(" + string
+ ")", ec
)) {
1948 assertEquals((UnicodeString
)"\"" + currentPat
+ "\".parse(" + string
+ ")",
1949 univ
.format(date
, str
.remove()),
1950 univ
.format(parsedate
, str2
.remove()));
1954 assertEquals((UnicodeString
)"\"" + currentPat
+ "\".format(" + datestr
+ ")",
1956 fmt
.format(date
, str
.remove()));
1959 else if (uprv_strcmp(control
, "F") == 0) {
1960 const char* datestr
= data
[i
++];
1961 const char* string
= data
[i
++];
1962 UDate date
= ref
.parse(ctou(datestr
), ec
);
1963 if (!assertSuccess("parse", ec
)) return;
1964 assertEquals((UnicodeString
)"\"" + currentPat
+ "\".format(" + datestr
+ ")",
1966 fmt
.format(date
, str
.remove()));
1968 UDate parsedate
= fmt
.parse(string
, ec
);
1969 if (assertSuccess((UnicodeString
)"\"" + currentPat
+ "\".parse(" + string
+ ")", ec
)) {
1970 assertEquals((UnicodeString
)"\"" + currentPat
+ "\".parse(" + string
+ ")",
1971 univ
.format(date
, str
.remove()),
1972 univ
.format(parsedate
, str2
.remove()));
1977 errln((UnicodeString
)"FAIL: Invalid control string " + control
);
1984 * Test formatting. Input is an array that starts
1985 * with the following header:
1987 * [0] = pattern string to parse [i+2] with
1989 * followed by test cases, each of which is 3 array elements:
1991 * [i] = pattern, or null to reuse prior pattern
1992 * [i+1] = data string a
1993 * [i+2] = data string b
1996 * Format date [i+1] and expect string [i+2].
1998 * "y/M/d H:mm:ss.SSSS", "2004/3/10 16:36:31.5679", "2004 03 10 16:36:31.567"
2000 void DateFormatTest::expectFormat(const char** data
, int32_t data_length
,
2001 const Locale
& loc
) {
2003 UErrorCode ec
= U_ZERO_ERROR
;
2004 UnicodeString str
, str2
;
2005 SimpleDateFormat
fmt("", loc
, ec
);
2006 SimpleDateFormat
ref(data
[i
++], loc
, ec
);
2007 SimpleDateFormat
univ("EE G yyyy MM dd HH:mm:ss.SSS z", loc
, ec
);
2008 if (U_FAILURE(ec
)) {
2009 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(ec
));
2013 UnicodeString currentPat
;
2015 while (i
<data_length
) {
2016 const char* pattern
= data
[i
++];
2017 if (pattern
!= NULL
) {
2018 fmt
.applyPattern(pattern
);
2019 currentPat
= pattern
;
2022 const char* datestr
= data
[i
++];
2023 const char* string
= data
[i
++];
2024 UDate date
= ref
.parse(ctou(datestr
), ec
);
2025 if (!assertSuccess("parse", ec
)) return;
2026 assertEquals((UnicodeString
)"\"" + currentPat
+ "\".format(" + datestr
+ ")",
2028 fmt
.format(date
, str
.remove()));
2032 void DateFormatTest::TestGenericTime() {
2033 const Locale
en("en");
2034 // Note: We no longer parse strings in different styles.
2036 const char* ZDATA[] = {
2037 "yyyy MM dd HH:mm zzz",
2039 "y/M/d H:mm zzzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Standard Time",
2040 "y/M/d H:mm zzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PST",
2041 "y/M/d H:mm vvvv", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Time",
2042 "y/M/d H:mm v", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PT",
2043 // non-generic timezone string influences dst offset even if wrong for date/time
2044 "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",
2045 "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",
2046 "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",
2047 "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",
2048 // generic timezone generates dst offset appropriate for local time
2049 "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",
2050 "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",
2051 "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",
2052 "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",
2053 // daylight savings time transition edge cases.
2054 // time to parse does not really exist, PT interpreted as earlier time
2055 "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",
2056 "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",
2057 "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",
2058 "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",
2059 "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",
2060 "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",
2061 "y/M/d H:mm", "pf", "2005/4/3 2:30", "2005 04 03 03:30 PDT", "2005/4/3 3:30",
2062 // time to parse is ambiguous, PT interpreted as later time
2063 "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",
2064 "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",
2065 "y/M/d H:mm", "pf", "2005/10/30 1:30 PT", "2005 10 30 01:30 PST", "2005/10/30 1:30",
2067 "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",
2068 "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",
2069 "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",
2070 "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",
2071 "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",
2072 "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",
2073 "y/M/d H:mm", "pf", "2004/10/31 1:30", "2004 10 31 01:30 PST", "2004/10/31 1:30",
2076 const char* ZDATA
[] = {
2077 "yyyy MM dd HH:mm zzz",
2079 "y/M/d H:mm zzzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Standard Time",
2080 "y/M/d H:mm zzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PST",
2081 "y/M/d H:mm vvvv", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Time",
2082 "y/M/d H:mm v", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PT",
2083 // non-generic timezone string influences dst offset even if wrong for date/time
2084 "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",
2085 "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",
2086 // generic timezone generates dst offset appropriate for local time
2087 "y/M/d H:mm zzz", "pf", "2004/1/1 1:00 PST", "2004 01 01 01:00 PST", "2004/1/1 1:00 PST",
2088 "y/M/d H:mm vvvv", "pf", "2004/1/1 1:00 Pacific Time", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Time",
2089 "y/M/d H:mm zzz", "pf", "2004/7/1 1:00 PDT", "2004 07 01 01:00 PDT", "2004/7/1 1:00 PDT",
2090 "y/M/d H:mm vvvv", "pf", "2004/7/1 1:00 Pacific Time", "2004 07 01 01:00 PDT", "2004/7/1 1:00 Pacific Time",
2091 // daylight savings time transition edge cases.
2092 // time to parse does not really exist, PT interpreted as earlier time
2093 "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",
2094 "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",
2095 "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",
2096 "y/M/d H:mm", "pf", "2005/4/3 2:30", "2005 04 03 03:30 PDT", "2005/4/3 3:30",
2097 // time to parse is ambiguous, PT interpreted as later time
2098 "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",
2099 "y/M/d H:mm", "pf", "2005/10/30 1:30 PT", "2005 10 30 01:30 PST", "2005/10/30 1:30",
2101 "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",
2102 "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",
2103 "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",
2104 "y/M/d H:mm", "pf", "2004/10/31 1:30", "2004 10 31 01:30 PST", "2004/10/31 1:30",
2107 const int32_t ZDATA_length
= sizeof(ZDATA
)/ sizeof(ZDATA
[0]);
2108 expect(ZDATA
, ZDATA_length
, en
);
2110 UErrorCode status
= U_ZERO_ERROR
;
2112 logln("cross format/parse tests"); // Note: We no longer support cross format/parse
2113 UnicodeString
basepat("yy/MM/dd H:mm ");
2114 SimpleDateFormat formats
[] = {
2115 SimpleDateFormat(basepat
+ "vvv", en
, status
),
2116 SimpleDateFormat(basepat
+ "vvvv", en
, status
),
2117 SimpleDateFormat(basepat
+ "zzz", en
, status
),
2118 SimpleDateFormat(basepat
+ "zzzz", en
, status
)
2120 if (U_FAILURE(status
)) {
2121 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(status
));
2124 const int32_t formats_length
= sizeof(formats
)/sizeof(formats
[0]);
2127 SimpleDateFormat
univ("yyyy MM dd HH:mm zzz", en
, status
);
2129 const UnicodeString times
[] = {
2130 "2004 01 02 03:04 PST",
2131 "2004 07 08 09:10 PDT"
2133 int32_t times_length
= sizeof(times
)/sizeof(times
[0]);
2134 for (int i
= 0; i
< times_length
; ++i
) {
2135 UDate d
= univ
.parse(times
[i
], status
);
2136 logln(UnicodeString("\ntime: ") + d
);
2137 for (int j
= 0; j
< formats_length
; ++j
) {
2139 formats
[j
].format(d
, test
);
2140 logln("\ntest: '" + test
+ "'");
2141 for (int k
= 0; k
< formats_length
; ++k
) {
2142 UDate t
= formats
[k
].parse(test
, status
);
2143 if (U_SUCCESS(status
)) {
2145 errln((UnicodeString
)"FAIL: format " + k
+
2146 " incorrectly parsed output of format " + j
+
2147 " (" + test
+ "), returned " +
2148 dateToString(t
) + " instead of " + dateToString(d
));
2150 logln((UnicodeString
)"OK: format " + k
+ " parsed ok");
2152 } else if (status
== U_PARSE_ERROR
) {
2153 errln((UnicodeString
)"FAIL: format " + k
+
2154 " could not parse output of format " + j
+
2162 void DateFormatTest::TestGenericTimeZoneOrder() {
2163 // generic times should parse the same no matter what the placement of the time zone string
2165 // Note: We no longer support cross style format/parse
2167 //const char* XDATA[] = {
2168 // "yyyy MM dd HH:mm zzz",
2169 // // standard time, explicit daylight/standard
2170 // "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",
2171 // "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",
2172 // "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",
2174 // // standard time, generic
2175 // "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",
2176 // "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",
2177 // "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",
2179 // // dahylight time, explicit daylight/standard
2180 // "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",
2181 // "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",
2182 // "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",
2184 // // daylight time, generic
2185 // "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",
2186 // "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",
2187 // "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",
2189 const char* XDATA
[] = {
2190 "yyyy MM dd HH:mm zzz",
2191 // standard time, explicit daylight/standard
2192 "y/M/d H:mm zzz", "pf", "2004/1/1 1:00 PST", "2004 01 01 01:00 PST", "2004/1/1 1:00 PST",
2193 "y/M/d zzz H:mm", "pf", "2004/1/1 PST 1:00", "2004 01 01 01:00 PST", "2004/1/1 PST 1:00",
2194 "zzz y/M/d H:mm", "pf", "PST 2004/1/1 1:00", "2004 01 01 01:00 PST", "PST 2004/1/1 1:00",
2196 // standard time, generic
2197 "y/M/d H:mm vvvv", "pf", "2004/1/1 1:00 Pacific Time", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Time",
2198 "y/M/d vvvv H:mm", "pf", "2004/1/1 Pacific Time 1:00", "2004 01 01 01:00 PST", "2004/1/1 Pacific Time 1:00",
2199 "vvvv y/M/d H:mm", "pf", "Pacific Time 2004/1/1 1:00", "2004 01 01 01:00 PST", "Pacific Time 2004/1/1 1:00",
2201 // dahylight time, explicit daylight/standard
2202 "y/M/d H:mm zzz", "pf", "2004/7/1 1:00 PDT", "2004 07 01 01:00 PDT", "2004/7/1 1:00 PDT",
2203 "y/M/d zzz H:mm", "pf", "2004/7/1 PDT 1:00", "2004 07 01 01:00 PDT", "2004/7/1 PDT 1:00",
2204 "zzz y/M/d H:mm", "pf", "PDT 2004/7/1 1:00", "2004 07 01 01:00 PDT", "PDT 2004/7/1 1:00",
2206 // daylight time, generic
2207 "y/M/d H:mm v", "pf", "2004/7/1 1:00 PT", "2004 07 01 01:00 PDT", "2004/7/1 1:00 PT",
2208 "y/M/d v H:mm", "pf", "2004/7/1 PT 1:00", "2004 07 01 01:00 PDT", "2004/7/1 PT 1:00",
2209 "v y/M/d H:mm", "pf", "PT 2004/7/1 1:00", "2004 07 01 01:00 PDT", "PT 2004/7/1 1:00",
2211 const int32_t XDATA_length
= sizeof(XDATA
)/sizeof(XDATA
[0]);
2213 expect(XDATA
, XDATA_length
, en
);
2216 void DateFormatTest::TestZTimeZoneParsing(void) {
2217 UErrorCode status
= U_ZERO_ERROR
;
2218 const Locale
en("en");
2220 //SimpleDateFormat univ("yyyy-MM-dd'T'HH:mm Z", en, status);
2221 SimpleDateFormat
univ("HH:mm Z", en
, status
);
2222 if (failure(status
, "construct SimpleDateFormat", TRUE
)) return;
2223 const TimeZone
*t
= TimeZone::getGMT();
2224 univ
.setTimeZone(*t
);
2226 univ
.setLenient(false);
2227 ParsePosition
pp(0);
2229 UnicodeString input
;
2230 UnicodeString expected_result
;
2232 { "11:00 -0200", "13:00 +0000" },
2233 { "11:00 +0200", "09:00 +0000" },
2234 { "11:00 +0400", "07:00 +0000" },
2235 { "11:00 +0530", "05:30 +0000" }
2238 UnicodeString result
;
2239 int32_t tests_length
= sizeof(tests
)/sizeof(tests
[0]);
2240 for (int i
= 0; i
< tests_length
; ++i
) {
2242 UDate d
= univ
.parse(tests
[i
].input
, pp
);
2243 if(pp
.getIndex() != tests
[i
].input
.length()){
2244 errln("Test %i: setZoneString() did not succeed. Consumed: %i instead of %i",
2245 i
, pp
.getIndex(), tests
[i
].input
.length());
2249 univ
.format(d
, result
);
2250 if(result
!= tests
[i
].expected_result
) {
2251 errln("Expected " + tests
[i
].expected_result
2252 + " got " + result
);
2255 logln("SUCCESS: Parsed " + tests
[i
].input
2257 + " expected " + tests
[i
].expected_result
);
2261 void DateFormatTest::TestHost(void)
2263 #if U_PLATFORM_HAS_WIN32_API
2264 Win32DateTimeTest::testLocales(this);
2268 // Relative Date Tests
2270 void DateFormatTest::TestRelative(int daysdelta
,
2272 const char *expectChars
) {
2274 sprintf(banner
, "%d", daysdelta
);
2275 UnicodeString
bannerStr(banner
, "");
2277 UErrorCode status
= U_ZERO_ERROR
;
2279 FieldPosition
pos(0);
2282 DateFormat
*fullrelative
= DateFormat::createDateInstance(DateFormat::kFullRelative
, loc
);
2284 if (fullrelative
== NULL
) {
2285 dataerrln("DateFormat::createDateInstance(DateFormat::kFullRelative, %s) returned NULL", loc
.getName());
2289 DateFormat
*full
= DateFormat::createDateInstance(DateFormat::kFull
, loc
);
2292 errln("DateFormat::createDateInstance(DateFormat::kFull, %s) returned NULL", loc
.getName());
2296 DateFormat
*en_full
= DateFormat::createDateInstance(DateFormat::kFull
, en
);
2298 if (en_full
== NULL
) {
2299 errln("DateFormat::createDateInstance(DateFormat::kFull, en) returned NULL");
2303 DateFormat
*en_fulltime
= DateFormat::createDateTimeInstance(DateFormat::kFull
,DateFormat::kFull
,en
);
2305 if (en_fulltime
== NULL
) {
2306 errln("DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, en) returned NULL");
2310 UnicodeString result
;
2311 UnicodeString normalResult
;
2312 UnicodeString expect
;
2313 UnicodeString parseResult
;
2315 Calendar
*c
= Calendar::createInstance(status
);
2318 c
->setTime(Calendar::getNow(), status
);
2319 if(daysdelta
!= 0) {
2320 c
->add(Calendar::DATE
,daysdelta
,status
);
2324 // calculate the expected string
2325 if(expectChars
!= NULL
) {
2326 expect
= expectChars
;
2328 full
->format(*c
, expect
, pos
); // expected = normal full
2331 fullrelative
->format(*c
, result
, pos
);
2332 en_full
->format(*c
, normalResult
, pos
);
2334 if(result
!= expect
) {
2335 errln("FAIL: Relative Format ["+bannerStr
+"] of "+normalResult
+" failed, expected "+expect
+" but got " + result
);
2337 logln("PASS: Relative Format ["+bannerStr
+"] of "+normalResult
+" got " + result
);
2342 UDate d
= fullrelative
->parse(result
, status
);
2345 UnicodeString parseFormat
; // parse rel->format full
2346 en_full
->format(d
, parseFormat
, status
);
2348 UnicodeString origFormat
;
2349 en_full
->format(*c
, origFormat
, pos
);
2351 if(parseFormat
!=origFormat
) {
2352 errln("FAIL: Relative Parse ["+bannerStr
+"] of "+result
+" failed, expected "+parseFormat
+" but got "+origFormat
);
2354 logln("PASS: Relative Parse ["+bannerStr
+"] of "+result
+" passed, got "+parseFormat
);
2358 delete fullrelative
;
2365 void DateFormatTest::TestRelative(void)
2368 TestRelative( 0, en
, "Today");
2369 TestRelative(-1, en
, "Yesterday");
2370 TestRelative( 1, en
, "Tomorrow");
2371 TestRelative( 2, en
, NULL
);
2372 TestRelative( -2, en
, NULL
);
2373 TestRelative( 3, en
, NULL
);
2374 TestRelative( -3, en
, NULL
);
2375 TestRelative( 300, en
, NULL
);
2376 TestRelative( -300, en
, NULL
);
2379 void DateFormatTest::TestRelativeClone(void)
2382 Verify that a cloned formatter gives the same results
2383 and is useable after the original has been deleted.
2385 UErrorCode status
= U_ZERO_ERROR
;
2387 UDate now
= Calendar::getNow();
2388 DateFormat
*full
= DateFormat::createDateInstance(DateFormat::kFullRelative
, loc
);
2390 dataerrln("FAIL: Can't create Relative date instance");
2393 UnicodeString result1
;
2394 full
->format(now
, result1
, status
);
2395 Format
*fullClone
= full
->clone();
2399 UnicodeString result2
;
2400 fullClone
->format(now
, result2
, status
);
2402 if (result1
!= result2
) {
2403 errln("FAIL: Clone returned different result from non-clone.");
2408 void DateFormatTest::TestHostClone(void)
2411 Verify that a cloned formatter gives the same results
2412 and is useable after the original has been deleted.
2414 // This is mainly important on Windows.
2415 UErrorCode status
= U_ZERO_ERROR
;
2416 Locale
loc("en_US@compat=host");
2417 UDate now
= Calendar::getNow();
2418 DateFormat
*full
= DateFormat::createDateInstance(DateFormat::kFull
, loc
);
2420 dataerrln("FAIL: Can't create Relative date instance");
2423 UnicodeString result1
;
2424 full
->format(now
, result1
, status
);
2425 Format
*fullClone
= full
->clone();
2429 UnicodeString result2
;
2430 fullClone
->format(now
, result2
, status
);
2432 if (result1
!= result2
) {
2433 errln("FAIL: Clone returned different result from non-clone.");
2438 void DateFormatTest::TestTimeZoneDisplayName()
2440 // This test data was ported from ICU4J. Don't know why the 6th column in there because it's not being
2442 const char *fallbackTests
[][6] = {
2443 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
2444 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" },
2445 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZZ", "-08:00", "-8:00" },
2446 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "PST", "America/Los_Angeles" },
2447 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "Pacific Standard Time", "America/Los_Angeles" },
2448 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
2449 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
2450 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "PDT", "America/Los_Angeles" },
2451 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "Pacific Daylight Time", "America/Los_Angeles" },
2452 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "PT", "America/Los_Angeles" },
2453 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "Pacific Time", "America/Los_Angeles" },
2454 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "VVVV", "Los Angeles Time", "America/Los_Angeles" },
2455 { "en_GB", "America/Los_Angeles", "2004-01-15T12:00:00Z", "z", "GMT-8", "America/Los_Angeles" },
2456 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "Z", "-0700", "-7:00" },
2457 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
2458 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "z", "MST", "America/Phoenix" },
2459 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "zzzz", "Mountain Standard Time", "America/Phoenix" },
2460 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
2461 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
2462 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "z", "MST", "America/Phoenix" },
2463 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "zzzz", "Mountain Standard Time", "America/Phoenix" },
2464 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "v", "MST", "America/Phoenix" },
2465 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "vvvv", "Mountain Standard Time", "America/Phoenix" },
2466 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "VVVV", "Phoenix Time", "America/Phoenix" },
2468 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2469 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2470 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2471 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argentina Standard Time", "-3:00" },
2472 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2473 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2474 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2475 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argentina Standard Time", "-3:00" },
2476 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Aires Time", "America/Buenos_Aires" },
2477 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentina Standard Time", "America/Buenos_Aires" },
2478 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "VVVV", "Buenos Aires Time", "America/Buenos_Aires" },
2480 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2481 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2482 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2483 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argentina Standard Time", "-3:00" },
2484 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2485 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2486 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2487 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argentina Standard Time", "-3:00" },
2488 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Aires Time", "America/Buenos_Aires" },
2489 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentina Standard Time", "America/Buenos_Aires" },
2490 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "VVVV", "Buenos Aires Time", "America/Buenos_Aires" },
2492 { "en", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
2493 { "en", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" },
2494 { "en", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00" },
2495 { "en", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "Cuba Standard Time", "-5:00" },
2496 { "en", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
2497 { "en", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" },
2498 { "en", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00" },
2499 { "en", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "Cuba Daylight Time", "-4:00" },
2500 { "en", "America/Havana", "2004-07-15T00:00:00Z", "v", "Cuba Time", "America/Havana" },
2501 { "en", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "Cuba Time", "America/Havana" },
2502 { "en", "America/Havana", "2004-07-15T00:00:00Z", "VVVV", "Cuba Time", "America/Havana" },
2504 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
2505 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
2506 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
2507 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "Australian Eastern Daylight Time", "+11:00" },
2508 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
2509 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
2510 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
2511 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "Australian Eastern Standard Time", "+10:00" },
2512 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "Sydney Time", "Australia/Sydney" },
2513 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "Eastern Australia Time", "Australia/Sydney" },
2514 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "VVVV", "Sydney Time", "Australia/Sydney" },
2516 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
2517 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
2518 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
2519 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "Australian Eastern Daylight Time", "+11:00" },
2520 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
2521 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
2522 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
2523 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "Australian Eastern Standard Time", "+10:00" },
2524 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "Sydney Time", "Australia/Sydney" },
2525 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "Eastern Australia Time", "Australia/Sydney" },
2526 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "VVVV", "Sydney Time", "Australia/Sydney" },
2528 { "en", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
2529 { "en", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00" },
2530 { "en", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" },
2531 { "en", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "Greenwich Mean Time", "+0:00" },
2532 { "en", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
2533 { "en", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" },
2534 { "en", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "Europe/London" },
2535 { "en", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "British Summer Time", "Europe/London" },
2536 // icu en.txt has exemplar city for this time zone
2537 { "en", "Europe/London", "2004-07-15T00:00:00Z", "v", "United Kingdom Time", "Europe/London" },
2538 { "en", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "United Kingdom Time", "Europe/London" },
2539 { "en", "Europe/London", "2004-07-15T00:00:00Z", "VVVV", "United Kingdom Time", "Europe/London" },
2541 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2542 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2543 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2544 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
2545 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2546 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2547 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2548 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
2549 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" },
2550 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" },
2553 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
2554 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
2555 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+5:30", "+5:30" },
2556 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "India Standard Time", "+5:30" },
2557 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
2558 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
2559 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+5:30", "+05:30" },
2560 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "India Standard Time", "+5:30" },
2561 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "India Time", "Asia/Calcutta" },
2562 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "India Standard Time", "Asia/Calcutta" },
2564 // Proper CLDR primary zone support #9733
2565 { "en", "Asia/Shanghai", "2013-01-01T00:00:00Z", "VVVV", "China Time", "Asia/Shanghai" },
2566 { "en", "Asia/Harbin", "2013-01-01T00:00:00Z", "VVVV", "Harbin Time", "Asia/Harbin" },
2570 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
2571 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" },
2572 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-8", "-8:00" },
2573 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "Nordamerikanische Westk\\u00fcsten-Normalzeit", "-8:00" },
2574 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
2575 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
2576 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-7", "-7:00" },
2577 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "Nordamerikanische Westk\\u00fcsten-Sommerzeit", "-7:00" },
2578 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "Los Angeles Zeit", "America/Los_Angeles" },
2579 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "Nordamerikanische Westk\\u00fcstenzeit", "America/Los_Angeles" },
2581 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2582 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2583 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2584 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argentinische Normalzeit", "-3:00" },
2585 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2586 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2587 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2588 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argentinische Normalzeit", "-3:00" },
2589 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Aires Zeit", "America/Buenos_Aires" },
2590 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentinische Normalzeit", "America/Buenos_Aires" },
2592 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2593 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2594 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2595 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argentinische Normalzeit", "-3:00" },
2596 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2597 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2598 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2599 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argentinische Normalzeit", "-3:00" },
2600 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Aires Zeit", "America/Buenos_Aires" },
2601 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentinische Normalzeit", "America/Buenos_Aires" },
2603 { "de", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
2604 { "de", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" },
2605 { "de", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00" },
2606 { "de", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "Kubanische Normalzeit", "-5:00" },
2607 { "de", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
2608 { "de", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" },
2609 { "de", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00" },
2610 { "de", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "Kubanische Sommerzeit", "-4:00" },
2611 { "de", "America/Havana", "2004-07-15T00:00:00Z", "v", "Kuba Zeit", "America/Havana" },
2612 { "de", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "Kubanische Zeit", "America/Havana" },
2613 // added to test proper fallback of country name
2614 { "de_CH", "America/Havana", "2004-07-15T00:00:00Z", "v", "Kuba Zeit", "America/Havana" },
2615 { "de_CH", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "Kubanische Zeit", "America/Havana" },
2617 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
2618 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
2619 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
2620 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "Ostaustralische Sommerzeit", "+11:00" },
2621 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
2622 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
2623 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
2624 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "Ostaustralische Normalzeit", "+10:00" },
2625 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "Sydney Zeit", "Australia/Sydney" },
2626 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "Ostaustralische Zeit", "Australia/Sydney" },
2628 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
2629 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
2630 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
2631 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "Ostaustralische Sommerzeit", "+11:00" },
2632 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
2633 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
2634 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
2635 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "Ostaustralische Normalzeit", "+10:00" },
2636 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "Sydney Zeit", "Australia/Sydney" },
2637 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "Ostaustralische Zeit", "Australia/Sydney" },
2639 { "de", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
2640 { "de", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00" },
2641 { "de", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" },
2642 { "de", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "Mittlere Greenwich-Zeit", "+0:00" },
2643 { "de", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
2644 { "de", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" },
2645 { "de", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "+1:00" },
2646 { "de", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "Britische Sommerzeit", "+1:00" },
2647 { "de", "Europe/London", "2004-07-15T00:00:00Z", "v", "Vereinigtes K\\u00f6nigreich Zeit", "Europe/London" },
2648 { "de", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "Vereinigtes K\\u00f6nigreich Zeit", "Europe/London" },
2650 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2651 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2652 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2653 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
2654 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2655 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2656 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2657 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
2658 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" },
2659 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" },
2662 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
2663 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
2664 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+5:30", "+5:30" },
2665 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "Indische Zeit", "+5:30" },
2666 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
2667 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
2668 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+5:30", "+05:30" },
2669 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "Indische Zeit", "+5:30" },
2670 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "Indien Zeit", "Asia/Calcutta" },
2671 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "Indische Zeit", "Asia/Calcutta" },
2675 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
2676 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-0800", "-8:00" },
2677 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-8", "America/Los_Angeles" },
2678 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\\u5317\\u7f8e\\u592a\\u5e73\\u6d0b\\u6807\\u51c6\\u65f6\\u95f4", "America/Los_Angeles" },
2679 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
2680 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-0700", "-7:00" },
2681 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-7", "America/Los_Angeles" },
2682 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\\u5317\\u7f8e\\u592a\\u5e73\\u6d0b\\u590f\\u4ee4\\u65f6\\u95f4", "America/Los_Angeles" },
2683 // icu zh.txt has exemplar city for this time zone
2684 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\\u6D1B\\u6749\\u77F6\\u65F6\\u95F4", "America/Los_Angeles" },
2685 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\\u5317\\u7f8e\\u592a\\u5e73\\u6d0b\\u65f6\\u95f4", "America/Los_Angeles" },
2687 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2688 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-0300", "-3:00" },
2689 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2690 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "-3:00" },
2691 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2692 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-0300", "-3:00" },
2693 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2694 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "-3:00" },
2695 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u5E03\\u5B9C\\u8BFA\\u65AF\\u827E\\u5229\\u65AF\\u65F6\\u95F4", "America/Buenos_Aires" },
2696 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "America/Buenos_Aires" },
2698 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2699 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-0300", "-3:00" },
2700 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2701 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "-3:00" },
2702 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2703 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-0300", "-3:00" },
2704 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2705 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "-3:00" },
2706 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u5E03\\u5B9C\\u8BFA\\u65AF\\u827E\\u5229\\u65AF\\u65F6\\u95F4", "America/Buenos_Aires" },
2707 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "America/Buenos_Aires" },
2709 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
2710 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-0500", "-5:00" },
2711 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00" },
2712 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\\u53e4\\u5df4\\u6807\\u51c6\\u65f6\\u95f4", "-5:00" },
2713 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
2714 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-0400", "-4:00" },
2715 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00" },
2716 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\\u53e4\\u5df4\\u590f\\u4ee4\\u65f6\\u95f4", "-4:00" },
2717 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "v", "\\u53e4\\u5df4\\u65f6\\u95f4", "America/Havana" },
2718 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\\u53e4\\u5df4\\u65f6\\u95f4", "America/Havana" },
2720 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
2721 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+1100", "+11:00" },
2722 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
2723 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\\u6fb3\\u5927\\u5229\\u4e9a\\u4e1c\\u90e8\\u590f\\u4ee4\\u65f6\\u95f4", "+11:00" },
2724 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
2725 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+1000", "+10:00" },
2726 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
2727 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\\u6fb3\\u5927\\u5229\\u4e9a\\u4e1c\\u90e8\\u6807\\u51c6\\u65f6\\u95f4", "+10:00" },
2728 // icu zh.txt does not have info for this time zone
2729 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\\u6089\\u5C3C\\u65F6\\u95F4", "Australia/Sydney" },
2730 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\\u6fb3\\u5927\\u5229\\u4e9a\\u4e1c\\u90e8\\u65f6\\u95f4", "Australia/Sydney" },
2732 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
2733 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+1100", "+11:00" },
2734 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
2735 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\\u6fb3\\u5927\\u5229\\u4e9a\\u4e1c\\u90e8\\u590f\\u4ee4\\u65f6\\u95f4", "+11:00" },
2736 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
2737 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+1000", "+10:00" },
2738 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
2739 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\\u6fb3\\u5927\\u5229\\u4e9a\\u4e1c\\u90e8\\u6807\\u51c6\\u65f6\\u95f4", "+10:00" },
2740 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\\u6089\\u5C3C\\u65F6\\u95F4", "Australia/Sydney" },
2741 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\\u6fb3\\u5927\\u5229\\u4e9a\\u4e1c\\u90e8\\u65f6\\u95f4", "Australia/Sydney" },
2743 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
2744 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00" },
2745 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" },
2746 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00" },
2747 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" },
2748 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\\u683C\\u6797\\u5C3C\\u6CBB\\u6807\\u51C6\\u65F6\\u95F4", "+0:00" },
2749 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
2750 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+0100", "+1:00" },
2751 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "+1:00" },
2752 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "\\u82f1\\u56fd\\u590f\\u4ee4\\u65f6\\u95f4", "+1:00" },
2753 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "v", "\\u82f1\\u56fd\\u65f6\\u95f4", "Europe/London" },
2754 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\\u82f1\\u56fd\\u65f6\\u95f4", "Europe/London" },
2755 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "VVVV", "\\u82f1\\u56fd\\u65f6\\u95f4", "Europe/London" },
2757 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2758 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-0300", "-3:00" },
2759 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2760 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-0300", "-3:00" },
2761 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2762 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-0300", "-3:00" },
2763 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2764 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-0300", "-3:00" },
2765 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" },
2766 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-0300", "-3:00" },
2769 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
2770 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+0530", "+5:30" },
2771 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+530", "+5:30" },
2772 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\\u5370\\u5ea6\\u65f6\\u95f4", "+5:30" },
2773 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
2774 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+0530", "+5:30" },
2775 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+530", "+05:30" },
2776 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\\u5370\\u5ea6\\u65f6\\u95f4", "+5:30" },
2777 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "\\u5370\\u5ea6\\u65f6\\u95f4", "Asia/Calcutta" },
2778 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\\u5370\\u5ea6\\u65f6\\u95f4", "Asia/Calcutta" },
2780 // Proper CLDR primary zone support #9733
2781 { "zh", "Asia/Shanghai", "2013-01-01T00:00:00Z", "VVVV", "\\u4e2d\\u56fd\\u65f6\\u95f4", "Asia/Shanghai" },
2782 { "zh", "Asia/Harbin", "2013-01-01T00:00:00Z", "VVVV", "\\u54c8\\u5c14\\u6ee8\\u65f6\\u95f4", "Asia/Harbin" },
2786 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
2787 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" },
2788 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-8", "-8:00" },
2789 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\\u092a\\u094d\\u0930\\u0936\\u093e\\u0902\\u0924\\u0020\\u092e\\u093e\\u0928\\u0915\\u0020\\u0938\\u092e\\u092f", "-8:00" },
2790 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
2791 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
2792 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-7", "-7:00" },
2793 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\\u092A\\u094D\\u0930\\u0936\\u093E\\u0902\\u0924 \\u0926\\u093F\\u0935\\u093E\\u0935\\u0932\\u094B\\u0915 \\u0938\\u092E\\u092F", "-7:00" },
2794 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\\u0932\\u094B\\u0938 \\u090F\\u0902\\u091C\\u093F\\u0932\\u0947\\u0938 \\u0938\\u092E\\u092F", "America/Los_Angeles" },
2795 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\\u092A\\u094D\\u0930\\u0936\\u093E\\u0902\\u0924 \\u0938\\u092E\\u092F", "America/Los_Angeles" },
2797 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2798 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2799 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2800 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u092E\\u093E\\u0928\\u0915 \\u0938\\u092E\\u092F", "-3:00" },
2801 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2802 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2803 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2804 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u092E\\u093E\\u0928\\u0915 \\u0938\\u092E\\u092F", "-3:00" },
2805 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u092C\\u094D\\u092F\\u0942\\u0928\\u0938 \\u0906\\u092F\\u0930\\u0938 \\u0938\\u092E\\u092F", "America/Buenos_Aires" },
2806 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u092E\\u093E\\u0928\\u0915 \\u0938\\u092E\\u092F", "America/Buenos_Aires" },
2808 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2809 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2810 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2811 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u092E\\u093E\\u0928\\u0915 \\u0938\\u092E\\u092F", "-3:00" },
2812 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2813 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2814 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2815 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u092E\\u093E\\u0928\\u0915 \\u0938\\u092E\\u092F", "-3:00" },
2816 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u092C\\u094D\\u092F\\u0942\\u0928\\u0938 \\u0906\\u092F\\u0930\\u0938 \\u0938\\u092E\\u092F", "America/Buenos_Aires" },
2817 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u092E\\u093E\\u0928\\u0915 \\u0938\\u092E\\u092F", "America/Buenos_Aires" },
2819 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
2820 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" },
2821 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00" },
2822 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\\u0915\\u094d\\u092f\\u0942\\u092c\\u093e \\u0915\\u093e \\u092e\\u093e\\u0928\\u0915 \\u0938\\u092e\\u092f", "-5:00" },
2823 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
2824 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" },
2825 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00" },
2826 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\\u0915\\u094d\\u092f\\u0942\\u092c\\u093e \\u0915\\u093e \\u0921\\u0947\\u0932\\u093e\\u0907\\u091f \\u091f\\u093e\\u0907\\u092e", "-4:00" },
2827 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "v", "\\u0915\\u094d\\u092f\\u0942\\u092c\\u093e \\u0938\\u092E\\u092F", "America/Havana" },
2828 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\\u0915\\u094d\\u092f\\u0942\\u092c\\u093e \\u0915\\u093e \\u0938\\u092E\\u092F", "America/Havana" },
2830 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
2831 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
2832 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
2833 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\\u0911\\u0938\\u094D\\u200D\\u091F\\u094D\\u0930\\u0947\\u0932\\u093F\\u092F\\u093E\\u0908 \\u092A\\u0942\\u0930\\u094D\\u0935\\u0940 \\u0926\\u093F\\u0935\\u093E\\u0935\\u0932\\u094B\\u0915 \\u0938\\u092E\\u092F", "+11:00" },
2834 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
2835 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
2836 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
2837 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\\u0911\\u0938\\u094D\\u200D\\u091F\\u094D\\u0930\\u0947\\u0932\\u093F\\u092F\\u093E\\u0908 \\u092A\\u0942\\u0930\\u094D\\u0935\\u0940 \\u092E\\u093E\\u0928\\u0915 \\u0938\\u092E\\u092F", "+10:00" },
2838 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\\u0938\\u093F\\u0921\\u0928\\u0940 \\u0938\\u092E\\u092F", "Australia/Sydney" },
2839 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\\u092A\\u0942\\u0930\\u094D\\u0935\\u0940 \\u0911\\u0938\\u094D\\u091F\\u094D\\u0930\\u0947\\u0932\\u093F\\u092F\\u093E\\u0908 \\u0938\\u092E\\u092F", "Australia/Sydney" },
2841 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
2842 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
2843 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
2844 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\\u0911\\u0938\\u094D\\u200D\\u091F\\u094D\\u0930\\u0947\\u0932\\u093F\\u092F\\u093E\\u0908 \\u092A\\u0942\\u0930\\u094D\\u0935\\u0940 \\u0926\\u093F\\u0935\\u093E\\u0935\\u0932\\u094B\\u0915 \\u0938\\u092E\\u092F", "+11:00" },
2845 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
2846 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
2847 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
2848 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\\u0911\\u0938\\u094D\\u200D\\u091F\\u094D\\u0930\\u0947\\u0932\\u093F\\u092F\\u093E\\u0908 \\u092A\\u0942\\u0930\\u094D\\u0935\\u0940 \\u092E\\u093E\\u0928\\u0915 \\u0938\\u092E\\u092F", "+10:00" },
2849 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\\u0938\\u093F\\u0921\\u0928\\u0940 \\u0938\\u092E\\u092F", "Australia/Sydney" },
2850 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\\u092A\\u0942\\u0930\\u094D\\u0935\\u0940 \\u0911\\u0938\\u094D\\u091F\\u094D\\u0930\\u0947\\u0932\\u093F\\u092F\\u093E\\u0908 \\u0938\\u092E\\u092F", "Australia/Sydney" },
2852 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
2853 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00" },
2854 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" },
2855 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\\u0917\\u094d\\u0930\\u0940\\u0928\\u0935\\u093f\\u091a \\u092e\\u0940\\u0928 \\u091f\\u093e\\u0907\\u092e", "+0:00" },
2856 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
2857 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" },
2858 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "+1:00" },
2859 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "GMT+01:00", "+1:00" },
2860 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "v", "\\u092C\\u094D\\u0930\\u093F\\u091F\\u0947\\u0928 \\u0938\\u092E\\u092F", "Europe/London" },
2861 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\\u092C\\u094D\\u0930\\u093F\\u091F\\u0947\\u0928 \\u0938\\u092E\\u092F", "Europe/London" },
2863 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2864 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2865 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2866 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
2867 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2868 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
2869 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
2870 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
2871 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" },
2872 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" },
2874 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
2875 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
2876 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "IST", "+5:30" },
2877 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\\u092D\\u093E\\u0930\\u0924\\u0940\\u092F \\u0938\\u092E\\u092F", "+5:30" },
2878 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
2879 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
2880 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "IST", "+05:30" },
2881 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\\u092D\\u093E\\u0930\\u0924\\u0940\\u092F \\u0938\\u092E\\u092F", "+5:30" },
2882 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "IST", "Asia/Calcutta" },
2883 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\\u092D\\u093E\\u0930\\u0924\\u0940\\u092F \\u0938\\u092E\\u092F", "Asia/Calcutta" },
2887 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
2888 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0800", "-8:00" },
2889 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-8", "America/Los_Angeles" },
2890 { "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" },
2891 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
2892 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0700", "-7:00" },
2893 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-7", "America/Los_Angeles" },
2894 { "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" },
2895 // icu bg.txt has exemplar city for this time zone
2896 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\\u041B\\u043E\\u0441 \\u0410\\u043D\\u0436\\u0435\\u043B\\u0438\\u0441 \\u0432\\u0440\\u0435\\u043C\\u0435", "America/Los_Angeles" },
2897 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\\u0422\\u0438\\u0445\\u043E\\u043E\\u043A\\u0435\\u0430\\u043D\\u0441\\u043A\\u043E \\u0432\\u0440\\u0435\\u043C\\u0435", "America/Los_Angeles" },
2898 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "VVVV", "\\u041B\\u043E\\u0441 \\u0410\\u043D\\u0436\\u0435\\u043B\\u0438\\u0441 \\u0432\\u0440\\u0435\\u043C\\u0435", "America/Los_Angeles" },
2900 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2901 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" },
2902 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-3", "-3:00" },
2903 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0430 \\u2013 \\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435", "-3:00" },
2904 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2905 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" },
2906 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-3", "-3:00" },
2907 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0430 \\u2013 \\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435", "-3:00" },
2908 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u0411\\u0443\\u0435\\u043D\\u043E\\u0441 \\u0410\\u0439\\u0440\\u0435\\u0441 \\u0432\\u0440\\u0435\\u043C\\u0435", "America/Buenos_Aires" },
2909 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0430 \\u2013 \\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435", "America/Buenos_Aires" },
2911 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2912 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" },
2913 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-3", "-3:00" },
2914 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0430 \\u2013 \\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435", "-3:00" },
2915 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2916 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" },
2917 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-3", "-3:00" },
2918 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0430 \\u2013 \\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435", "-3:00" },
2919 // icu bg.txt does not have info for this time zone
2920 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u0411\\u0443\\u0435\\u043D\\u043E\\u0441 \\u0410\\u0439\\u0440\\u0435\\u0441 \\u0432\\u0440\\u0435\\u043C\\u0435", "America/Buenos_Aires" },
2921 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0430 \\u2013 \\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435", "America/Buenos_Aires" },
2923 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
2924 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0500", "-5:00" },
2925 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-5", "-5:00" },
2926 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\\u041a\\u0443\\u0431\\u0438\\u043d\\u0441\\u043a\\u043e \\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435", "-5:00" },
2927 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
2928 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0400", "-4:00" },
2929 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-4", "-4:00" },
2930 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\\u041a\\u0443\\u0431\\u0438\\u043d\\u0441\\u043a\\u043e \\u043b\\u044f\\u0442\\u043d\\u043e \\u0447\\u0430\\u0441\\u043e\\u0432\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435", "-4:00" },
2931 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "v", "\\u041a\\u0443\\u0431\\u0430 \\u0432\\u0440\\u0435\\u043C\\u0435", "America/Havana" },
2932 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\\u041a\\u0443\\u0431\\u0438\\u043d\\u0441\\u043a\\u043e \\u0432\\u0440\\u0435\\u043C\\u0435", "America/Havana" },
2934 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
2935 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+1100", "+11:00" },
2936 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+11", "+11:00" },
2937 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\\u0410\\u0432\\u0441\\u0442\\u0440\\u0430\\u043B\\u0438\\u044F \\u2013 \\u0438\\u0437\\u0442\\u043E\\u0447\\u043D\\u043E \\u043B\\u044F\\u0442\\u043D\\u043E \\u0447\\u0430\\u0441\\u043E\\u0432\\u043E \\u0432\\u0440\\u0435\\u043C\\u0435", "+11:00" },
2938 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
2939 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+1000", "+10:00" },
2940 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+10", "+10:00" },
2941 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\\u0410\\u0432\\u0441\\u0442\\u0440\\u0430\\u043B\\u0438\\u044F \\u2013 \\u0438\\u0437\\u0442\\u043E\\u0447\\u043D\\u043E \\u0441\\u0442\\u0430\\u043D\\u0434\\u0430\\u0440\\u0442\\u043D\\u043E \\u0432\\u0440\\u0435\\u043C\\u0435", "+10:00" },
2942 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\\u0421\\u0438\\u0434\\u043D\\u0438 \\u0432\\u0440\\u0435\\u043C\\u0435", "Australia/Sydney" },
2943 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\\u0410\\u0432\\u0441\\u0442\\u0440\\u0430\\u043B\\u0438\\u044F \\u2013 \\u0438\\u0437\\u0442\\u043E\\u0447\\u043D\\u043E \\u0432\\u0440\\u0435\\u043C\\u0435", "Australia/Sydney" },
2945 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
2946 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+1100", "+11:00" },
2947 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+11", "+11:00" },
2948 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\\u0410\\u0432\\u0441\\u0442\\u0440\\u0430\\u043B\\u0438\\u044F \\u2013 \\u0438\\u0437\\u0442\\u043E\\u0447\\u043D\\u043E \\u043B\\u044F\\u0442\\u043D\\u043E \\u0447\\u0430\\u0441\\u043E\\u0432\\u043E \\u0432\\u0440\\u0435\\u043C\\u0435", "+11:00" },
2949 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
2950 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+1000", "+10:00" },
2951 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+10", "+10:00" },
2952 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\\u0410\\u0432\\u0441\\u0442\\u0440\\u0430\\u043B\\u0438\\u044F \\u2013 \\u0438\\u0437\\u0442\\u043E\\u0447\\u043D\\u043E \\u0441\\u0442\\u0430\\u043D\\u0434\\u0430\\u0440\\u0442\\u043D\\u043E \\u0432\\u0440\\u0435\\u043C\\u0435", "+10:00" },
2953 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\\u0421\\u0438\\u0434\\u043D\\u0438 \\u0432\\u0440\\u0435\\u043C\\u0435", "Australia/Sydney" },
2954 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\\u0410\\u0432\\u0441\\u0442\\u0440\\u0430\\u043B\\u0438\\u044F \\u2013 \\u0438\\u0437\\u0442\\u043E\\u0447\\u043D\\u043E \\u0432\\u0440\\u0435\\u043C\\u0435", "Australia/Sydney" },
2956 { "bg", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
2957 { "bg", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447", "+0:00" },
2958 { "bg", "Europe/London", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447", "+0:00" },
2959 { "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" },
2960 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
2961 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+0100", "+1:00" },
2962 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+1", "+1:00" },
2963 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+0100", "+1:00" },
2964 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "v", "\\u041e\\u0431\\u0435\\u0434\\u0438\\u043d\\u0435\\u043d\\u043e \\u043a\\u0440\\u0430\\u043b\\u0441\\u0442\\u0432\\u043e \\u0432\\u0440\\u0435\\u043C\\u0435", "Europe/London" },
2965 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\\u041e\\u0431\\u0435\\u0434\\u0438\\u043d\\u0435\\u043d\\u043e \\u043a\\u0440\\u0430\\u043b\\u0441\\u0442\\u0432\\u043e \\u0432\\u0440\\u0435\\u043C\\u0435", "Europe/London" },
2967 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
2968 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" },
2969 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-3", "-3:00" },
2970 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" },
2971 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
2972 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" },
2973 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-3", "-3:00" },
2974 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" },
2975 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-3", "-3:00" },
2976 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" },
2979 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
2980 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+0530", "+5:30" },
2981 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+530", "+5:30" },
2982 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\\u0418\\u043d\\u0434\\u0438\\u0439\\u0441\\u043a\\u043e \\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435", "+5:30" },
2983 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
2984 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+0530", "+5:30" },
2985 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+530", "+05:30" },
2986 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\\u0418\\u043d\\u0434\\u0438\\u0439\\u0441\\u043a\\u043e \\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435", "+5:30" },
2987 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "\\u0418\\u043D\\u0434\\u0438\\u044F \\u0432\\u0440\\u0435\\u043C\\u0435", "Asia/Calcutta" },
2988 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\\u0418\\u043d\\u0434\\u0438\\u0439\\u0441\\u043a\\u043e \\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435", "Asia/Calcutta" },
2991 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
2992 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" },
2993 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-8", "America/Los_Angeles" },
2994 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\\u30a2\\u30e1\\u30ea\\u30ab\\u592a\\u5e73\\u6d0b\\u6a19\\u6e96\\u6642", "America/Los_Angeles" },
2995 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-700" },
2996 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
2997 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-7", "America/Los_Angeles" },
2998 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\\u30a2\\u30e1\\u30ea\\u30ab\\u592a\\u5e73\\u6d0b\\u590f\\u6642\\u9593", "America/Los_Angeles" },
2999 // icu ja.txt has exemplar city for this time zone
3000 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\\u30ED\\u30B5\\u30F3\\u30BC\\u30EB\\u30B9\\u6642\\u9593", "America/Los_Angeles" },
3001 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\\u30A2\\u30E1\\u30EA\\u30AB\\u592A\\u5e73\\u6D0B\\u6642\\u9593", "America/Los_Angeles" },
3002 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "VVVV", "\\u30ED\\u30B5\\u30F3\\u30BC\\u30EB\\u30B9\\u6642\\u9593", "America/Los_Angeles" },
3004 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
3005 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
3006 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
3007 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "-3:00" },
3008 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
3009 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
3010 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
3011 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "-3:00" },
3012 // icu ja.txt does not have info for this time zone
3013 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u30D6\\u30A8\\u30CE\\u30B9\\u30A2\\u30A4\\u30EC\\u30B9\\u6642\\u9593", "America/Buenos_Aires" },
3014 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "America/Buenos_Aires" },
3016 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
3017 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
3018 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
3019 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "-3:00" },
3020 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
3021 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
3022 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
3023 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "-3:00" },
3024 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u30D6\\u30A8\\u30CE\\u30B9\\u30A2\\u30A4\\u30EC\\u30B9\\u6642\\u9593", "America/Buenos_Aires" },
3025 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "America/Buenos_Aires" },
3027 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
3028 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" },
3029 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00" },
3030 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\\u30AD\\u30E5\\u30FC\\u30D0\\u6A19\\u6E96\\u6642", "-5:00" },
3031 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
3032 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" },
3033 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00" },
3034 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\\u30AD\\u30E5\\u30FC\\u30D0\\u590F\\u6642\\u9593", "-4:00" },
3035 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "v", "\\u30ad\\u30e5\\u30fc\\u30d0\\u6642\\u9593", "America/Havana" },
3036 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\\u30ad\\u30e5\\u30fc\\u30d0\\u6642\\u9593", "America/Havana" },
3038 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
3039 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
3040 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
3041 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\\u30AA\\u30FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u590F\\u6642\\u9593", "+11:00" },
3042 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
3043 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
3044 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
3045 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\\u30AA\\u30FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u6A19\\u6E96\\u6642", "+10:00" },
3046 // icu ja.txt does not have info for this time zone
3047 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\\u30B7\\u30C9\\u30CB\\u30FC\\u6642\\u9593", "Australia/Sydney" },
3048 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\\u30AA\\u30FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u6642\\u9593", "Australia/Sydney" },
3050 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
3051 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
3052 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
3053 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\\u30AA\\u30FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u590F\\u6642\\u9593", "+11:00" },
3054 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
3055 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
3056 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
3057 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\\u30AA\\u30FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u6A19\\u6E96\\u6642", "+10:00" },
3058 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\\u30B7\\u30C9\\u30CB\\u30FC\\u6642\\u9593", "Australia/Sydney" },
3059 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\\u30AA\\u30FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u6642\\u9593", "Australia/Sydney" },
3061 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
3062 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00" },
3063 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" },
3064 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\\u30B0\\u30EA\\u30CB\\u30C3\\u30B8\\u6A19\\u6E96\\u6642", "+0:00" },
3065 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
3066 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" },
3067 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "+1:00" },
3068 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "\\u82f1\\u56fd\\u590f\\u6642\\u9593", "+1:00" },
3069 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "v", "\\u30a4\\u30ae\\u30ea\\u30b9\\u6642\\u9593", "Europe/London" },
3070 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\\u30a4\\u30ae\\u30ea\\u30b9\\u6642\\u9593", "Europe/London" },
3071 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "VVVV", "\\u30a4\\u30ae\\u30ea\\u30b9\\u6642\\u9593", "Europe/London" },
3073 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
3074 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
3075 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
3076 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
3077 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
3078 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
3079 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
3080 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
3081 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" },
3082 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" },
3085 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
3086 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
3087 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+5:30", "+5:30" },
3088 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\\u30A4\\u30F3\\u30C9\\u6642\\u9593", "+5:30" },
3089 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
3090 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
3091 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+5:30", "+05:30" },
3092 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\\u30A4\\u30F3\\u30C9\\u6642\\u9593", "+5:30" },
3093 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "\\u30A4\\u30F3\\u30C9\\u6642\\u9593", "Asia/Calcutta" },
3094 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\\u30A4\\u30F3\\u30C9\\u6642\\u9593", "Asia/Calcutta" },
3098 { "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" },
3099 { "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" },
3100 { "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-8", "-8:00" },
3101 { "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "GMT-08:00", "-8:00" },
3102 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" },
3103 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" },
3104 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-7", "-7:00" },
3105 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "GMT-07:00", "-7:00" },
3106 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "Los Angeles", "America/Los_Angeles" },
3107 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "Los Angeles", "America/Los_Angeles" },
3109 { "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
3110 { "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
3111 { "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
3112 { "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
3113 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
3114 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
3115 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
3116 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
3117 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Aires", "America/Buenos_Aires" },
3118 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Buenos Aires", "America/Buenos_Aires" },
3120 { "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
3121 { "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
3122 { "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
3123 { "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
3124 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
3125 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
3126 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
3127 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
3128 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Aires", "America/Buenos_Aires" },
3129 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Buenos Aires", "America/Buenos_Aires" },
3131 { "ti", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" },
3132 { "ti", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" },
3133 { "ti", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00" },
3134 { "ti", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "GMT-05:00", "-5:00" },
3135 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" },
3136 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" },
3137 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00" },
3138 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "GMT-04:00", "-4:00" },
3139 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "v", "CU", "America/Havana" },
3140 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "CU", "America/Havana" },
3142 { "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
3143 { "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
3144 { "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
3145 { "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "GMT+11:00", "+11:00" },
3146 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
3147 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
3148 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
3149 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "GMT+10:00", "+10:00" },
3150 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "Sydney", "Australia/Sydney" },
3151 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "Sydney", "Australia/Sydney" },
3153 { "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" },
3154 { "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" },
3155 { "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00" },
3156 { "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "GMT+11:00", "+11:00" },
3157 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" },
3158 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" },
3159 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00" },
3160 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "GMT+10:00", "+10:00" },
3161 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "Sydney", "Australia/Sydney" },
3162 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "Sydney", "Australia/Sydney" },
3164 { "ti", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" },
3165 { "ti", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00" },
3166 { "ti", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" },
3167 { "ti", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "GMT", "+0:00" },
3168 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" },
3169 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" },
3170 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "+1:00" },
3171 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "GMT+01:00", "+1:00" },
3172 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "v", "GB", "Europe/London" },
3173 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "GB", "Europe/London" },
3175 { "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" },
3176 { "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
3177 { "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" },
3178 { "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
3179 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" },
3180 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" },
3181 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" },
3182 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" },
3183 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" },
3184 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" },
3187 { "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" },
3188 { "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
3189 { "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+5:30", "+5:30" },
3190 { "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "GMT+05:30", "+5:30" },
3191 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" },
3192 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" },
3193 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+5:30", "+05:30" },
3194 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "GMT+05:30", "+5:30" },
3195 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "IN", "Alna/Calcutta" },
3196 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "IN", "Asia/Calcutta" },
3198 // Ticket#8589 Partial location name to use country name if the zone is the golden
3199 // zone for the time zone's country.
3200 { "en_MX", "America/Chicago", "1995-07-15T00:00:00Z", "vvvv", "Central Time (United States)", "America/Chicago"},
3202 // Tests proper handling of time zones that should have empty sets when inherited from the parent.
3203 // For example, en_GB understands CET as Central European Time, but en_HK, which inherits from en_GB
3205 { "en_GB", "Europe/Paris", "2004-01-15T00:00:00Z", "zzzz", "Central European Standard Time", "+1:00"},
3206 { "en_GB", "Europe/Paris", "2004-07-15T00:00:00Z", "zzzz", "Central European Summer Time", "+2:00"},
3207 { "en_GB", "Europe/Paris", "2004-01-15T00:00:00Z", "z", "CET", "+1:00"},
3208 { "en_GB", "Europe/Paris", "2004-07-15T00:00:00Z", "z", "CEST", "+2:00"},
3209 { "en_HK", "Europe/Paris", "2004-01-15T00:00:00Z", "zzzz", "Central European Standard Time", "+1:00"},
3210 { "en_HK", "Europe/Paris", "2004-07-15T00:00:00Z", "zzzz", "Central European Summer Time", "+2:00"},
3211 { "en_HK", "Europe/Paris", "2004-01-15T00:00:00Z", "z", "GMT+1", "+1:00"},
3212 { "en_HK", "Europe/Paris", "2004-07-15T00:00:00Z", "z", "GMT+2", "+2:00"},
3214 { NULL
, NULL
, NULL
, NULL
, NULL
, NULL
},
3217 UErrorCode status
= U_ZERO_ERROR
;
3218 Calendar
*cal
= GregorianCalendar::createInstance(status
);
3219 if (failure(status
, "GregorianCalendar::createInstance", TRUE
)) return;
3220 SimpleDateFormat
testfmt(UnicodeString("yyyy-MM-dd'T'HH:mm:ss'Z'"), status
);
3221 if (failure(status
, "SimpleDateFormat constructor", TRUE
)) return;
3222 testfmt
.setTimeZone(*TimeZone::getGMT());
3224 for (int i
= 0; fallbackTests
[i
][0]; i
++) {
3225 const char **testLine
= fallbackTests
[i
];
3226 UnicodeString info
[5];
3227 for ( int j
= 0 ; j
< 5 ; j
++ ) {
3228 info
[j
] = UnicodeString(testLine
[j
], -1, US_INV
);
3230 info
[4] = info
[4].unescape();
3231 logln("%s;%s;%s;%s", testLine
[0], testLine
[1], testLine
[2], testLine
[3]);
3233 TimeZone
*tz
= TimeZone::createTimeZone(info
[1]);
3235 UDate d
= testfmt
.parse(testLine
[2], status
);
3236 cal
->setTime(d
, status
);
3237 if (U_FAILURE(status
)) {
3238 errln(UnicodeString("Failed to set date: ") + testLine
[2]);
3241 SimpleDateFormat
fmt(info
[3], Locale(testLine
[0]),status
);
3243 cal
->adoptTimeZone(tz
);
3244 UnicodeString result
;
3245 FieldPosition
pos(0);
3246 fmt
.format(*cal
,result
,pos
);
3247 if (result
!= info
[4]) {
3248 errln(info
[0] + ";" + info
[1] + ";" + info
[2] + ";" + info
[3] + " expected: '" +
3249 info
[4] + "' but got: '" + result
+ "'");
3255 void DateFormatTest::TestRoundtripWithCalendar(void) {
3256 UErrorCode status
= U_ZERO_ERROR
;
3258 TimeZone
*tz
= TimeZone::createTimeZone("Europe/Paris");
3259 TimeZone
*gmt
= TimeZone::createTimeZone("Etc/GMT");
3261 Calendar
*calendars
[] = {
3262 Calendar::createInstance(*tz
, Locale("und@calendar=gregorian"), status
),
3263 Calendar::createInstance(*tz
, Locale("und@calendar=buddhist"), status
),
3264 // Calendar::createInstance(*tz, Locale("und@calendar=hebrew"), status),
3265 Calendar::createInstance(*tz
, Locale("und@calendar=islamic"), status
),
3266 Calendar::createInstance(*tz
, Locale("und@calendar=japanese"), status
),
3269 if (U_FAILURE(status
)) {
3270 dataerrln("Failed to initialize calendars: %s", u_errorName(status
));
3271 for (int i
= 0; calendars
[i
] != NULL
; i
++) {
3272 delete calendars
[i
];
3277 //FIXME The formatters commented out below are currently failing because of
3278 // the calendar calculation problem reported by #6691
3280 // The order of test formatters must match the order of calendars above.
3281 DateFormat
*formatters
[] = {
3282 DateFormat::createDateTimeInstance(DateFormat::kFull
, DateFormat::kFull
, Locale("en_US")), //calendar=gregorian
3283 DateFormat::createDateTimeInstance(DateFormat::kFull
, DateFormat::kFull
, Locale("th_TH")), //calendar=buddhist
3284 // DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, Locale("he_IL@calendar=hebrew")),
3285 DateFormat::createDateTimeInstance(DateFormat::kFull
, DateFormat::kFull
, Locale("ar_EG@calendar=islamic")),
3286 // DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, Locale("ja_JP@calendar=japanese")),
3290 UDate d
= Calendar::getNow();
3295 for (int i
= 0; formatters
[i
] != NULL
; i
++) {
3297 fpos
.setBeginIndex(0);
3298 fpos
.setEndIndex(0);
3299 calendars
[i
]->setTime(d
, status
);
3301 // Normal case output - the given calendar matches the calendar
3302 // used by the formatter
3303 formatters
[i
]->format(*calendars
[i
], buf
, fpos
);
3304 UnicodeString
refStr(buf
);
3306 for (int j
= 0; calendars
[j
] != NULL
; j
++) {
3311 fpos
.setBeginIndex(0);
3312 fpos
.setEndIndex(0);
3313 calendars
[j
]->setTime(d
, status
);
3315 // Even the different calendar type is specified,
3316 // we should get the same result.
3317 formatters
[i
]->format(*calendars
[j
], buf
, fpos
);
3318 if (refStr
!= buf
) {
3319 errln((UnicodeString
)"FAIL: Different format result with a different calendar for the same time -"
3320 + "\n Reference calendar type=" + calendars
[i
]->getType()
3321 + "\n Another calendar type=" + calendars
[j
]->getType()
3322 + "\n Expected result=" + refStr
3323 + "\n Actual result=" + buf
);
3327 calendars
[i
]->setTimeZone(*gmt
);
3328 calendars
[i
]->clear();
3329 ppos
.setErrorIndex(-1);
3332 // Normal case parse result - the given calendar matches the calendar
3333 // used by the formatter
3334 formatters
[i
]->parse(refStr
, *calendars
[i
], ppos
);
3336 for (int j
= 0; calendars
[j
] != NULL
; j
++) {
3340 calendars
[j
]->setTimeZone(*gmt
);
3341 calendars
[j
]->clear();
3342 ppos
.setErrorIndex(-1);
3345 // Even the different calendar type is specified,
3346 // we should get the same time and time zone.
3347 formatters
[i
]->parse(refStr
, *calendars
[j
], ppos
);
3348 if (calendars
[i
]->getTime(status
) != calendars
[j
]->getTime(status
)
3349 || calendars
[i
]->getTimeZone() != calendars
[j
]->getTimeZone()) {
3351 errln((UnicodeString
)"FAIL: Different parse result with a different calendar for the same string -"
3352 + "\n Reference calendar type=" + calendars
[i
]->getType()
3353 + "\n Another calendar type=" + calendars
[j
]->getType()
3354 + "\n Date string=" + refStr
3355 + "\n Expected time=" + calendars
[i
]->getTime(status
)
3356 + "\n Expected time zone=" + calendars
[i
]->getTimeZone().getID(tzid
)
3357 + "\n Actual time=" + calendars
[j
]->getTime(status
)
3358 + "\n Actual time zone=" + calendars
[j
]->getTimeZone().getID(tzid
));
3361 if (U_FAILURE(status
)) {
3362 errln((UnicodeString
)"FAIL: " + u_errorName(status
));
3369 for (int i
= 0; calendars
[i
] != NULL
; i
++) {
3370 delete calendars
[i
];
3372 for (int i
= 0; formatters
[i
] != NULL
; i
++) {
3373 delete formatters
[i
];
3378 void DateFormatTest::TestRelativeError(void)
3383 DateFormat *en_reltime_reldate = DateFormat::createDateTimeInstance(DateFormat::kFullRelative,DateFormat::kFullRelative,en);
3384 if(en_reltime_reldate == NULL) {
3385 logln("PASS: rel date/rel time failed");
3387 errln("FAIL: rel date/rel time created, should have failed.");
3388 delete en_reltime_reldate;
3392 void DateFormatTest::TestRelativeOther(void)
3394 logln("Nothing in this test. When we get more data from CLDR, put in some tests of -2, +2, etc. ");
3398 void DateFormatTest::Test6338(void)
3400 UErrorCode status
= U_ZERO_ERROR
;
3402 SimpleDateFormat
*fmt1
= new SimpleDateFormat(UnicodeString("y-M-d"), Locale("ar"), status
);
3403 if (failure(status
, "new SimpleDateFormat", TRUE
)) return;
3405 UDate dt1
= date(2008-1900, UCAL_JUNE
, 10, 12, 00);
3407 str1
= fmt1
->format(dt1
, str1
);
3410 UDate dt11
= fmt1
->parse(str1
, status
);
3411 failure(status
, "fmt->parse");
3413 UnicodeString str11
;
3414 str11
= fmt1
->format(dt11
, str11
);
3417 if (str1
!= str11
) {
3418 errln((UnicodeString
)"FAIL: Different dates str1:" + str1
3419 + " str2:" + str11
);
3425 status
= U_ZERO_ERROR
;
3426 SimpleDateFormat
*fmt2
= new SimpleDateFormat(UnicodeString("y M d"), Locale("ar"), status
);
3427 failure(status
, "new SimpleDateFormat");
3429 UDate dt2
= date(2008-1900, UCAL_JUNE
, 10, 12, 00);
3431 str2
= fmt2
->format(dt2
, str2
);
3434 UDate dt22
= fmt2
->parse(str2
, status
);
3435 failure(status
, "fmt->parse");
3437 UnicodeString str22
;
3438 str22
= fmt2
->format(dt22
, str22
);
3441 if (str2
!= str22
) {
3442 errln((UnicodeString
)"FAIL: Different dates str1:" + str2
3443 + " str2:" + str22
);
3449 status
= U_ZERO_ERROR
;
3450 SimpleDateFormat
*fmt3
= new SimpleDateFormat(UnicodeString("y-M-d"), Locale("en-us"), status
);
3451 failure(status
, "new SimpleDateFormat");
3453 UDate dt3
= date(2008-1900, UCAL_JUNE
, 10, 12, 00);
3455 str3
= fmt3
->format(dt3
, str3
);
3458 UDate dt33
= fmt3
->parse(str3
, status
);
3459 failure(status
, "fmt->parse");
3461 UnicodeString str33
;
3462 str33
= fmt3
->format(dt33
, str33
);
3465 if (str3
!= str33
) {
3466 errln((UnicodeString
)"FAIL: Different dates str1:" + str3
3467 + " str2:" + str33
);
3473 status
= U_ZERO_ERROR
;
3474 SimpleDateFormat
*fmt4
= new SimpleDateFormat(UnicodeString("y M d"), Locale("en-us"), status
);
3475 failure(status
, "new SimpleDateFormat");
3477 UDate dt4
= date(2008-1900, UCAL_JUNE
, 10, 12, 00);
3479 str4
= fmt4
->format(dt4
, str4
);
3482 UDate dt44
= fmt4
->parse(str4
, status
);
3483 failure(status
, "fmt->parse");
3485 UnicodeString str44
;
3486 str44
= fmt4
->format(dt44
, str44
);
3489 if (str4
!= str44
) {
3490 errln((UnicodeString
)"FAIL: Different dates str1:" + str4
3491 + " str2:" + str44
);
3497 void DateFormatTest::Test6726(void)
3500 // UErrorCode status = U_ZERO_ERROR;
3502 // fmtf, fmtl, fmtm, fmts;
3503 UnicodeString strf
, strl
, strm
, strs
;
3504 UDate dt
= date(2008-1900, UCAL_JUNE
, 10, 12, 00);
3507 DateFormat
* fmtf
= DateFormat::createDateTimeInstance(DateFormat::FULL
, DateFormat::FULL
, loc
);
3508 DateFormat
* fmtl
= DateFormat::createDateTimeInstance(DateFormat::LONG
, DateFormat::FULL
, loc
);
3509 DateFormat
* fmtm
= DateFormat::createDateTimeInstance(DateFormat::MEDIUM
, DateFormat::FULL
, loc
);
3510 DateFormat
* fmts
= DateFormat::createDateTimeInstance(DateFormat::SHORT
, DateFormat::FULL
, loc
);
3511 if (fmtf
== NULL
|| fmtl
== NULL
|| fmtm
== NULL
|| fmts
== NULL
) {
3512 dataerrln("Unable to create DateFormat. got NULL.");
3513 /* It may not be true that if one is NULL all is NULL. Just to be safe. */
3521 strf
= fmtf
->format(dt
, strf
);
3522 strl
= fmtl
->format(dt
, strl
);
3523 strm
= fmtm
->format(dt
, strm
);
3524 strs
= fmts
->format(dt
, strs
);
3527 logln("strm.charAt(10)=%04X wanted 0x20\n", strm
.charAt(10));
3528 if (strm
.charAt(10) != UChar(0x0020)) {
3529 errln((UnicodeString
)"FAIL: Improper formatted date: " + strm
);
3531 logln("strs.charAt(10)=%04X wanted 0x20\n", strs
.charAt(8));
3532 if (strs
.charAt(10) != UChar(0x0020)) {
3533 errln((UnicodeString
)"FAIL: Improper formatted date: " + strs
);
3545 * Test DateFormat's parsing of default GMT variants. See ticket#6135
3547 void DateFormatTest::TestGMTParsing() {
3548 const char* DATA
[] = {
3551 // pattern, input, expected output (in quotes)
3552 "HH:mm:ss Z", "10:20:30 GMT+03:00", "10:20:30 +0300",
3553 "HH:mm:ss Z", "10:20:30 UT-02:00", "10:20:30 -0200",
3554 "HH:mm:ss Z", "10:20:30 GMT", "10:20:30 +0000",
3555 "HH:mm:ss vvvv", "10:20:30 UT+10:00", "10:20:30 +1000",
3556 "HH:mm:ss zzzz", "10:20:30 UTC", "10:20:30 +0000", // standalone "UTC"
3557 "ZZZZ HH:mm:ss", "UT 10:20:30", "10:20:30 +0000",
3558 "z HH:mm:ss", "UT+0130 10:20:30", "10:20:30 +0130",
3559 "z HH:mm:ss", "UTC+0130 10:20:30", "10:20:30 +0130",
3560 // Note: GMT-1100 no longer works because of the introduction of the short
3561 // localized GMT support. Previous implementation support this level of
3562 // leniency (no separator char in localized GMT format), but the new
3563 // implementation handles GMT-11 as the legitimate short localized GMT format
3564 // and stop at there. Otherwise, roundtrip would be broken.
3565 //"HH mm Z ss", "10 20 GMT-1100 30", "10:20:30 -1100",
3566 "HH mm Z ss", "10 20 GMT-11 30", "10:20:30 -1100",
3567 "HH:mm:ssZZZZZ", "14:25:45Z", "14:25:45 +0000",
3568 "HH:mm:ssZZZZZ", "15:00:00-08:00", "15:00:00 -0800",
3570 const int32_t DATA_len
= sizeof(DATA
)/sizeof(DATA
[0]);
3571 expectParse(DATA
, DATA_len
, Locale("en"));
3574 // Test case for localized GMT format parsing
3575 // with no delimitters in offset format (Chinese locale)
3576 void DateFormatTest::Test6880() {
3577 UErrorCode status
= U_ZERO_ERROR
;
3578 UDate d1
, d2
, dp1
, dp2
, dexp1
, dexp2
;
3579 UnicodeString s1
, s2
;
3581 TimeZone
*tz
= TimeZone::createTimeZone("Asia/Shanghai");
3582 GregorianCalendar
gcal(*tz
, status
);
3583 if (failure(status
, "construct GregorianCalendar", TRUE
)) return;
3586 gcal
.set(1910, UCAL_JULY
, 1, 12, 00); // offset 8:05:57
3587 d1
= gcal
.getTime(status
);
3590 gcal
.set(1950, UCAL_JULY
, 1, 12, 00); // offset 8:00
3591 d2
= gcal
.getTime(status
);
3594 gcal
.set(1970, UCAL_JANUARY
, 1, 12, 00);
3595 dexp2
= gcal
.getTime(status
);
3596 dexp1
= dexp2
- (5*60 + 57)*1000; // subtract 5m57s
3598 if (U_FAILURE(status
)) {
3599 errln("FAIL: Gregorian calendar error");
3602 DateFormat
*fmt
= DateFormat::createTimeInstance(DateFormat::kFull
, Locale("zh"));
3604 dataerrln("Unable to create DateFormat. Got NULL.");
3607 fmt
->adoptTimeZone(tz
);
3609 fmt
->format(d1
, s1
);
3610 fmt
->format(d2
, s2
);
3612 dp1
= fmt
->parse(s1
, status
);
3613 dp2
= fmt
->parse(s2
, status
);
3615 if (U_FAILURE(status
)) {
3616 errln("FAIL: Parse failure");
3620 errln("FAIL: Failed to parse " + s1
+ " parsed: " + dp1
+ " expected: " + dexp1
);
3623 errln("FAIL: Failed to parse " + s2
+ " parsed: " + dp2
+ " expected: " + dexp2
);
3630 const char * localeStr
;
3633 UnicodeString datePattern
;
3634 UnicodeString dateString
;
3637 void DateFormatTest::TestNumberAsStringParsing()
3639 const NumAsStringItem items
[] = {
3640 // loc lenient fail? datePattern dateString
3641 { "", FALSE
, TRUE
, UnicodeString("y MMMM d HH:mm:ss"), UnicodeString("2009 7 14 08:43:57") },
3642 { "", TRUE
, FALSE
, UnicodeString("y MMMM d HH:mm:ss"), UnicodeString("2009 7 14 08:43:57") },
3643 { "en", FALSE
, FALSE
, UnicodeString("MMM d, y"), UnicodeString("Jul 14, 2009") },
3644 { "en", TRUE
, FALSE
, UnicodeString("MMM d, y"), UnicodeString("Jul 14, 2009") },
3645 { "en", FALSE
, TRUE
, UnicodeString("MMM d, y"), UnicodeString("7 14, 2009") },
3646 { "en", TRUE
, FALSE
, UnicodeString("MMM d, y"), UnicodeString("7 14, 2009") },
3647 { "ja", FALSE
, FALSE
, UnicodeString("yyyy/MM/dd"), UnicodeString("2009/07/14") },
3648 { "ja", TRUE
, FALSE
, UnicodeString("yyyy/MM/dd"), UnicodeString("2009/07/14") },
3649 //{ "ja", FALSE, FALSE, UnicodeString("yyyy/MMMMM/d"), UnicodeString("2009/7/14") }, // #8860 covers test failure
3650 { "ja", TRUE
, FALSE
, UnicodeString("yyyy/MMMMM/d"), UnicodeString("2009/7/14") },
3651 { "ja", FALSE
, FALSE
, CharsToUnicodeString("y\\u5E74M\\u6708d\\u65E5"), CharsToUnicodeString("2009\\u5E747\\u670814\\u65E5") },
3652 { "ja", TRUE
, FALSE
, CharsToUnicodeString("y\\u5E74M\\u6708d\\u65E5"), CharsToUnicodeString("2009\\u5E747\\u670814\\u65E5") },
3653 { "ja", FALSE
, FALSE
, CharsToUnicodeString("y\\u5E74MMMd\\u65E5"), CharsToUnicodeString("2009\\u5E747\\u670814\\u65E5") },
3654 { "ja", TRUE
, FALSE
, CharsToUnicodeString("y\\u5E74MMMd\\u65E5"), CharsToUnicodeString("2009\\u5E747\\u670814\\u65E5") }, // #8820 fixes test failure
3655 { "ko", FALSE
, FALSE
, UnicodeString("yyyy. M. d."), UnicodeString("2009. 7. 14.") },
3656 { "ko", TRUE
, FALSE
, UnicodeString("yyyy. M. d."), UnicodeString("2009. 7. 14.") },
3657 { "ko", FALSE
, FALSE
, UnicodeString("yyyy. MMMMM d."), CharsToUnicodeString("2009. 7\\uC6D4 14.") },
3658 { "ko", TRUE
, FALSE
, UnicodeString("yyyy. MMMMM d."), CharsToUnicodeString("2009. 7\\uC6D4 14.") }, // #8820 fixes test failure
3659 { "ko", FALSE
, FALSE
, CharsToUnicodeString("y\\uB144 M\\uC6D4 d\\uC77C"), CharsToUnicodeString("2009\\uB144 7\\uC6D4 14\\uC77C") },
3660 { "ko", TRUE
, FALSE
, CharsToUnicodeString("y\\uB144 M\\uC6D4 d\\uC77C"), CharsToUnicodeString("2009\\uB144 7\\uC6D4 14\\uC77C") },
3661 { "ko", FALSE
, FALSE
, CharsToUnicodeString("y\\uB144 MMM d\\uC77C"), CharsToUnicodeString("2009\\uB144 7\\uC6D4 14\\uC77C") },
3662 { "ko", TRUE
, FALSE
, CharsToUnicodeString("y\\uB144 MMM d\\uC77C"), CharsToUnicodeString("2009\\uB144 7\\uC6D4 14\\uC77C") }, // #8820 fixes test failure
3663 { NULL
, FALSE
, FALSE
, UnicodeString(""), UnicodeString("") }
3665 const NumAsStringItem
* itemPtr
;
3666 for (itemPtr
= items
; itemPtr
->localeStr
!= NULL
; itemPtr
++ ) {
3667 Locale locale
= Locale::createFromName(itemPtr
->localeStr
);
3668 UErrorCode status
= U_ZERO_ERROR
;
3669 SimpleDateFormat
*formatter
= new SimpleDateFormat(itemPtr
->datePattern
, locale
, status
);
3670 if (formatter
== NULL
|| U_FAILURE(status
)) {
3671 dataerrln("Unable to create SimpleDateFormat - %s", u_errorName(status
));
3675 formatter
->setLenient(itemPtr
->lenient
);
3676 UDate date1
= formatter
->parse(itemPtr
->dateString
, status
);
3677 if (U_FAILURE(status
)) {
3678 if (!itemPtr
->expectFail
) {
3679 errln("FAIL, err when expected success: Locale \"" + UnicodeString(itemPtr
->localeStr
) + "\", lenient " + itemPtr
->lenient
+
3680 ": using pattern \"" + itemPtr
->datePattern
+ "\", could not parse \"" + itemPtr
->dateString
+ "\"; err: " + u_errorName(status
) );
3682 } else if (itemPtr
->expectFail
) {
3683 errln("FAIL, expected err but got none: Locale \"" + UnicodeString(itemPtr
->localeStr
) + "\", lenient " + itemPtr
->lenient
+
3684 ": using pattern \"" + itemPtr
->datePattern
+ "\", did parse \"" + itemPtr
->dateString
+ "\"." );
3685 } else if (!itemPtr
->lenient
) {
3686 UnicodeString formatted
;
3687 formatter
->format(date1
, formatted
);
3688 if (formatted
!= itemPtr
->dateString
) {
3689 errln("FAIL, mismatch formatting parsed date: Locale \"" + UnicodeString(itemPtr
->localeStr
) + "\", lenient " + itemPtr
->lenient
+
3690 ": using pattern \"" + itemPtr
->datePattern
+ "\", did parse \"" + itemPtr
->dateString
+ "\", formatted result \"" + formatted
+ "\".");
3698 void DateFormatTest::TestISOEra() {
3700 const char* data
[] = {
3702 "BC 4004-10-23T07:00:00Z", "BC 4004-10-23T07:00:00Z",
3703 "AD 4004-10-23T07:00:00Z", "AD 4004-10-23T07:00:00Z",
3704 "-4004-10-23T07:00:00Z" , "BC 4005-10-23T07:00:00Z",
3705 "4004-10-23T07:00:00Z" , "AD 4004-10-23T07:00:00Z",
3708 int32_t numData
= 8;
3710 UErrorCode status
= U_ZERO_ERROR
;
3713 SimpleDateFormat
*fmt1
= new SimpleDateFormat(UnicodeString("GGG yyyy-MM-dd'T'HH:mm:ss'Z"), status
);
3714 failure(status
, "new SimpleDateFormat", TRUE
);
3715 if (status
== U_MISSING_RESOURCE_ERROR
) {
3721 for(int i
=0; i
< numData
; i
+=2) {
3722 // create input string
3723 UnicodeString in
= data
[i
];
3725 // parse string to date
3726 UDate dt1
= fmt1
->parse(in
, status
);
3727 failure(status
, "fmt->parse", TRUE
);
3729 // format date back to string
3731 out
= fmt1
->format(dt1
, out
);
3734 // check that roundtrip worked as expected
3735 UnicodeString expected
= data
[i
+1];
3736 if (out
!= expected
) {
3737 dataerrln((UnicodeString
)"FAIL: " + in
+ " -> " + out
+ " expected -> " + expected
);
3743 void DateFormatTest::TestFormalChineseDate() {
3745 UErrorCode status
= U_ZERO_ERROR
;
3746 UnicodeString
pattern ("y\\u5e74M\\u6708d\\u65e5", -1, US_INV
);
3747 pattern
= pattern
.unescape();
3748 UnicodeString
override ("y=hanidec;M=hans;d=hans", -1, US_INV
);
3751 SimpleDateFormat
*sdf
= new SimpleDateFormat(pattern
,override
,Locale::getChina(),status
);
3752 failure(status
, "new SimpleDateFormat with override", TRUE
);
3754 UDate thedate
= date(2009-1900, UCAL_JULY
, 28);
3755 FieldPosition
pos(0);
3756 UnicodeString result
;
3757 sdf
->format(thedate
,result
,pos
);
3759 UnicodeString expected
= "\\u4e8c\\u3007\\u3007\\u4e5d\\u5e74\\u4e03\\u6708\\u4e8c\\u5341\\u516b\\u65e5";
3760 expected
= expected
.unescape();
3761 if (result
!= expected
) {
3762 dataerrln((UnicodeString
)"FAIL: -> " + result
+ " expected -> " + expected
);
3765 UDate parsedate
= sdf
->parse(expected
,status
);
3766 if ( parsedate
!= thedate
) {
3767 UnicodeString
pat1 ("yyyy-MM-dd'T'HH:mm:ss'Z'", -1, US_INV
);
3768 SimpleDateFormat
*usf
= new SimpleDateFormat(pat1
,Locale::getEnglish(),status
);
3769 UnicodeString parsedres
,expres
;
3770 usf
->format(parsedate
,parsedres
,pos
);
3771 usf
->format(thedate
,expres
,pos
);
3772 dataerrln((UnicodeString
)"FAIL: parsed -> " + parsedres
+ " expected -> " + expres
);
3778 // Test case for #8675
3779 // Incorrect parse offset with stand alone GMT string on 2nd or later iteration.
3780 void DateFormatTest::TestStandAloneGMTParse() {
3781 UErrorCode status
= U_ZERO_ERROR
;
3782 SimpleDateFormat
*sdf
= new SimpleDateFormat("ZZZZ", Locale(""), status
);
3784 if (U_SUCCESS(status
)) {
3786 UnicodeString
inText("GMT$$$");
3787 for (int32_t i
= 0; i
< 10; i
++) {
3788 ParsePosition
pos(0);
3789 sdf
->parse(inText
, pos
);
3790 if (pos
.getIndex() != 3) {
3791 errln((UnicodeString
)"FAIL: Incorrect output parse position: actual=" + pos
.getIndex() + " expected=3");
3797 dataerrln("Unable to create SimpleDateFormat - %s", u_errorName(status
));
3801 void DateFormatTest::TestParsePosition() {
3802 const char* TestData
[][4] = {
3803 // {<pattern>, <lead>, <date string>, <trail>}
3804 {"yyyy-MM-dd HH:mm:ssZ", "", "2010-01-10 12:30:00+0500", ""},
3805 {"yyyy-MM-dd HH:mm:ss ZZZZ", "", "2010-01-10 12:30:00 GMT+05:00", ""},
3806 {"Z HH:mm:ss", "", "-0100 13:20:30", ""},
3807 {"y-M-d Z", "", "2011-8-25 -0400", " Foo"},
3808 {"y/M/d H:mm:ss z", "", "2011/7/1 12:34:00 PDT", ""},
3809 {"y/M/d H:mm:ss z", "+123", "2011/7/1 12:34:00 PDT", " PST"},
3810 {"vvvv a h:mm:ss", "", "Pacific Time AM 10:21:45", ""},
3811 {"HH:mm v M/d", "111", "14:15 PT 8/10", " 12345"},
3812 {"'time zone:' VVVV 'date:' yyyy-MM-dd", "xxxx", "time zone: Los Angeles Time date: 2010-02-25", "xxxx"},
3813 {"yG", "", "2012AD", ""},
3814 {"yG", "", "2012", "x"},
3818 for (int32_t i
= 0; TestData
[i
][0]; i
++) {
3819 UErrorCode status
= U_ZERO_ERROR
;
3820 SimpleDateFormat
*sdf
= new SimpleDateFormat(UnicodeString(TestData
[i
][0]), status
);
3821 if (failure(status
, "new SimpleDateFormat", TRUE
)) return;
3823 int32_t startPos
, resPos
;
3826 UnicodeString
input(TestData
[i
][1]);
3827 startPos
= input
.length();
3830 input
+= TestData
[i
][2];
3831 resPos
= input
.length();
3834 input
+= TestData
[i
][3];
3836 ParsePosition
pos(startPos
);
3837 //UDate d = sdf->parse(input, pos);
3838 (void)sdf
->parse(input
, pos
);
3840 if (pos
.getIndex() != resPos
) {
3841 errln(UnicodeString("FAIL: Parsing [") + input
+ "] with pattern [" + TestData
[i
][0] + "] returns position - "
3842 + pos
.getIndex() + ", expected - " + resPos
);
3853 int32_t month
; // 1-based
3854 int32_t isLeapMonth
;
3856 } ChineseCalTestDate
;
3858 #define NUM_TEST_DATES 3
3861 const char * locale
;
3862 int32_t style
; // <0 => custom
3863 UnicodeString dateString
[NUM_TEST_DATES
];
3866 void DateFormatTest::TestMonthPatterns()
3868 const ChineseCalTestDate dates
[NUM_TEST_DATES
] = {
3870 { 78, 29, 4, 0, 2 }, // (in chinese era 78) gregorian 2012-4-22
3871 { 78, 29, 4, 1, 2 }, // (in chinese era 78) gregorian 2012-5-22
3872 { 78, 29, 5, 0, 2 }, // (in chinese era 78) gregorian 2012-6-20
3875 const MonthPatternItem items
[] = {
3876 // locale date style; expected formats for the 3 dates above
3877 { "root@calendar=chinese", DateFormat::kLong
, { UnicodeString("ren-chen Month4 2"), UnicodeString("ren-chen Month4bis 2"), UnicodeString("ren-chen Month5 2") } },
3878 { "root@calendar=chinese", DateFormat::kShort
, { UnicodeString("29-04-02"), UnicodeString("29-04bis-02"), UnicodeString("29-05-02") } },
3879 { "root@calendar=chinese", -1, { UnicodeString("29-4-2"), UnicodeString("29-4bis-2"), UnicodeString("29-5-2") } },
3880 { "root@calendar=chinese", -2, { UnicodeString("78x29-4-2"), UnicodeString("78x29-4bis-2"), UnicodeString("78x29-5-2") } },
3881 { "root@calendar=chinese", -3, { UnicodeString("ren-chen-4-2"), UnicodeString("ren-chen-4bis-2"), UnicodeString("ren-chen-5-2") } },
3882 { "root@calendar=chinese", -4, { UnicodeString("ren-chen Month4 2"), UnicodeString("ren-chen Month4bis 2"), UnicodeString("ren-chen Month5 2") } },
3883 { "en@calendar=gregorian", -3, { UnicodeString("2012-4-22"), UnicodeString("2012-5-22"), UnicodeString("2012-6-20") } },
3884 { "en@calendar=chinese", DateFormat::kLong
, { UnicodeString("Month4 2, ren-chen"), UnicodeString("Month4bis 2, ren-chen"), UnicodeString("Month5 2, ren-chen") } },
3885 { "en@calendar=chinese", DateFormat::kShort
, { UnicodeString("4/2/29"), UnicodeString("4bis/2/29"), UnicodeString("5/2/29") } },
3886 { "zh@calendar=chinese", DateFormat::kLong
, { CharsToUnicodeString("\\u58EC\\u8FB0\\u5E74\\u56DB\\u6708\\u4E8C\\u65E5"),
3887 CharsToUnicodeString("\\u58EC\\u8FB0\\u5E74\\u95F0\\u56DB\\u6708\\u4E8C\\u65E5"),
3888 CharsToUnicodeString("\\u58EC\\u8FB0\\u5E74\\u4E94\\u6708\\u4E8C\\u65E5") } },
3889 { "zh@calendar=chinese", DateFormat::kShort
, { CharsToUnicodeString("\\u58EC\\u8FB0-4-2"),
3890 CharsToUnicodeString("\\u58EC\\u8FB0-\\u95F04-2"),
3891 CharsToUnicodeString("\\u58EC\\u8FB0-5-2") } },
3892 { "zh@calendar=chinese", -3, { CharsToUnicodeString("\\u58EC\\u8FB0-4-2"),
3893 CharsToUnicodeString("\\u58EC\\u8FB0-\\u95F04-2"),
3894 CharsToUnicodeString("\\u58EC\\u8FB0-5-2") } },
3895 { "zh@calendar=chinese", -4, { CharsToUnicodeString("\\u58EC\\u8FB0 \\u56DB\\u6708 2"),
3896 CharsToUnicodeString("\\u58EC\\u8FB0 \\u95F0\\u56DB\\u6708 2"),
3897 CharsToUnicodeString("\\u58EC\\u8FB0 \\u4E94\\u6708 2") } },
3898 { "zh_Hant@calendar=chinese", DateFormat::kLong
, { CharsToUnicodeString("\\u58EC\\u8FB0\\u5E74\\u56DB\\u6708\\u4E8C\\u65E5"),
3899 CharsToUnicodeString("\\u58EC\\u8FB0\\u5E74\\u958F\\u56DB\\u6708\\u4E8C\\u65E5"),
3900 CharsToUnicodeString("\\u58EC\\u8FB0\\u5E74\\u4E94\\u6708\\u4E8C\\u65E5") } },
3901 { "zh_Hant@calendar=chinese", DateFormat::kShort
, { CharsToUnicodeString("\\u58EC\\u8FB0/4/2"),
3902 CharsToUnicodeString("\\u58EC\\u8FB0/\\u958F4/2"),
3903 CharsToUnicodeString("\\u58EC\\u8FB0/5/2") } },
3904 { "fr@calendar=chinese", DateFormat::kLong
, { CharsToUnicodeString("2 s\\u00ECyu\\u00E8 ren-chen"),
3905 CharsToUnicodeString("2 s\\u00ECyu\\u00E8bis ren-chen"),
3906 CharsToUnicodeString("2 w\\u01D4yu\\u00E8 ren-chen") } },
3907 { "fr@calendar=chinese", DateFormat::kShort
, { UnicodeString("2/4/29"), UnicodeString("2/4bis/29"), UnicodeString("2/5/29") } },
3908 { "en@calendar=dangi", DateFormat::kLong
, { UnicodeString("Month3bis 2, 29"), UnicodeString("Month4 2, 29"), UnicodeString("Month5 1, 29") } },
3909 { "en@calendar=dangi", DateFormat::kShort
, { UnicodeString("3bis/2/29"), UnicodeString("4/2/29"), UnicodeString("5/1/29") } },
3910 { "ko@calendar=dangi", DateFormat::kLong
, { CharsToUnicodeString("\\uC784\\uC9C4\\uB144 3bis\\uC6D4 2\\uC77C"),
3911 CharsToUnicodeString("\\uC784\\uC9C4\\uB144 4\\uC6D4 2\\uC77C"),
3912 CharsToUnicodeString("\\uC784\\uC9C4\\uB144 5\\uC6D4 1\\uC77C") } },
3913 { "ko@calendar=dangi", DateFormat::kShort
, { CharsToUnicodeString("29. 3bis. 2."),
3914 CharsToUnicodeString("29. 4. 2."),
3915 CharsToUnicodeString("29. 5. 1.") } },
3917 { NULL
, 0, { UnicodeString(""), UnicodeString(""), UnicodeString("") } }
3920 //. style: -1 -2 -3 -4
3921 const UnicodeString customPatterns
[] = { "y-Ml-d", "G'x'y-Ml-d", "U-M-d", "U MMM d" }; // like old root pattern, using 'l'
3923 UErrorCode status
= U_ZERO_ERROR
;
3924 Locale rootChineseCalLocale
= Locale::createFromName("root@calendar=chinese");
3925 Calendar
* rootChineseCalendar
= Calendar::createInstance(rootChineseCalLocale
, status
);
3926 if (U_SUCCESS(status
)) {
3927 const MonthPatternItem
* itemPtr
;
3928 for (itemPtr
= items
; itemPtr
->locale
!= NULL
; itemPtr
++ ) {
3929 Locale locale
= Locale::createFromName(itemPtr
->locale
);
3930 DateFormat
* dmft
= (itemPtr
->style
>= 0)?
3931 DateFormat::createDateInstance((DateFormat::EStyle
)itemPtr
->style
, locale
):
3932 new SimpleDateFormat(customPatterns
[-itemPtr
->style
- 1], locale
, status
);
3933 if ( dmft
!= NULL
) {
3934 if (U_SUCCESS(status
)) {
3935 const ChineseCalTestDate
* datePtr
= dates
;
3937 for (idate
= 0; idate
< NUM_TEST_DATES
; idate
++, datePtr
++) {
3938 rootChineseCalendar
->clear();
3939 rootChineseCalendar
->set(UCAL_ERA
, datePtr
->era
);
3940 rootChineseCalendar
->set(datePtr
->year
, datePtr
->month
-1, datePtr
->day
);
3941 rootChineseCalendar
->set(UCAL_IS_LEAP_MONTH
, datePtr
->isLeapMonth
);
3942 UnicodeString result
;
3943 FieldPosition
fpos(0);
3944 dmft
->format(*rootChineseCalendar
, result
, fpos
);
3945 if ( result
.compare(itemPtr
->dateString
[idate
]) != 0 ) {
3946 errln( UnicodeString("FAIL: Chinese calendar format for locale ") + UnicodeString(itemPtr
->locale
) + ", style " + itemPtr
->style
+
3947 ", expected \"" + itemPtr
->dateString
[idate
] + "\", got \"" + result
+ "\"");
3949 // formatted OK, try parse
3950 ParsePosition
ppos(0);
3951 // ensure we are really parsing the fields we should be
3952 rootChineseCalendar
->set(UCAL_YEAR
, 1);
3953 rootChineseCalendar
->set(UCAL_MONTH
, 0);
3954 rootChineseCalendar
->set(UCAL_IS_LEAP_MONTH
, 0);
3955 rootChineseCalendar
->set(UCAL_DATE
, 1);
3957 dmft
->parse(result
, *rootChineseCalendar
, ppos
);
3958 int32_t year
= rootChineseCalendar
->get(UCAL_YEAR
, status
);
3959 int32_t month
= rootChineseCalendar
->get(UCAL_MONTH
, status
) + 1;
3960 int32_t isLeapMonth
= rootChineseCalendar
->get(UCAL_IS_LEAP_MONTH
, status
);
3961 int32_t day
= rootChineseCalendar
->get(UCAL_DATE
, status
);
3962 if ( ppos
.getIndex() < result
.length() || year
!= datePtr
->year
|| month
!= datePtr
->month
|| isLeapMonth
!= datePtr
->isLeapMonth
|| day
!= datePtr
->day
) {
3963 errln( UnicodeString("FAIL: Chinese calendar parse for locale ") + UnicodeString(itemPtr
->locale
) + ", style " + itemPtr
->style
+
3964 ", string \"" + result
+ "\", expected " + datePtr
->year
+"-"+datePtr
->month
+"("+datePtr
->isLeapMonth
+")-"+datePtr
->day
+ ", got pos " +
3965 ppos
.getIndex() + " " + year
+"-"+month
+"("+isLeapMonth
+")-"+day
);
3970 dataerrln("Error creating SimpleDateFormat for Chinese calendar- %s", u_errorName(status
));
3974 dataerrln("FAIL: Unable to create DateFormat for Chinese calendar- %s", u_errorName(status
));
3977 delete rootChineseCalendar
;
3979 errln(UnicodeString("FAIL: Unable to create Calendar for root@calendar=chinese"));
3984 const char * locale
;
3985 UnicodeString pattern
;
3986 UDisplayContext capitalizationContext
;
3987 UnicodeString expectedFormat
;
3990 void DateFormatTest::TestContext()
3992 const UDate july022008
= 1215000001979.0;
3993 const TestContextItem items
[] = {
3994 //locale pattern capitalizationContext expected formatted date
3995 { "fr", UnicodeString("MMMM y"), UDISPCTX_CAPITALIZATION_NONE
, UnicodeString("juillet 2008") },
3996 #if !UCONFIG_NO_BREAK_ITERATION
3997 { "fr", UnicodeString("MMMM y"), UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE
, UnicodeString("juillet 2008") },
3998 { "fr", UnicodeString("MMMM y"), UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE
, UnicodeString("Juillet 2008") },
3999 { "fr", UnicodeString("MMMM y"), UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU
, UnicodeString("juillet 2008") },
4000 { "fr", UnicodeString("MMMM y"), UDISPCTX_CAPITALIZATION_FOR_STANDALONE
, UnicodeString("Juillet 2008") },
4002 { "cs", UnicodeString("LLLL y"), UDISPCTX_CAPITALIZATION_NONE
, CharsToUnicodeString("\\u010Dervenec 2008") },
4003 #if !UCONFIG_NO_BREAK_ITERATION
4004 { "cs", UnicodeString("LLLL y"), UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE
, CharsToUnicodeString("\\u010Dervenec 2008") },
4005 { "cs", UnicodeString("LLLL y"), UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE
, CharsToUnicodeString("\\u010Cervenec 2008") },
4006 { "cs", UnicodeString("LLLL y"), UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU
, CharsToUnicodeString("\\u010Cervenec 2008") },
4007 { "cs", UnicodeString("LLLL y"), UDISPCTX_CAPITALIZATION_FOR_STANDALONE
, CharsToUnicodeString("\\u010Dervenec 2008") },
4010 { NULL
, UnicodeString(""), (UDisplayContext
)0, UnicodeString("") }
4012 UErrorCode status
= U_ZERO_ERROR
;
4013 Calendar
* cal
= Calendar::createInstance(status
);
4014 if (U_FAILURE(status
)) {
4015 dataerrln(UnicodeString("FAIL: Unable to create Calendar for default timezone and locale."));
4017 cal
->setTime(july022008
, status
);
4018 const TestContextItem
* itemPtr
;
4019 for (itemPtr
= items
; itemPtr
->locale
!= NULL
; itemPtr
++ ) {
4020 Locale locale
= Locale::createFromName(itemPtr
->locale
);
4021 status
= U_ZERO_ERROR
;
4022 SimpleDateFormat
* sdmft
= new SimpleDateFormat(itemPtr
->pattern
, locale
, status
);
4023 if (U_FAILURE(status
)) {
4024 dataerrln(UnicodeString("FAIL: Unable to create SimpleDateFormat for specified pattern with locale ") + UnicodeString(itemPtr
->locale
));
4026 sdmft
->setContext(itemPtr
->capitalizationContext
, status
);
4027 UnicodeString result
;
4028 FieldPosition
pos(0);
4029 sdmft
->format(*cal
, result
, pos
);
4030 if (result
.compare(itemPtr
->expectedFormat
) != 0) {
4031 errln(UnicodeString("FAIL: format for locale ") + UnicodeString(itemPtr
->locale
) +
4032 ", status " + (int)status
+
4033 ", capitalizationContext " + (int)itemPtr
->capitalizationContext
+
4034 ", expected " + itemPtr
->expectedFormat
+ ", got " + result
);
4047 // test item for a particular locale + calendar and date format
4054 UnicodeString formattedDate
;
4055 } CalAndFmtTestItem
;
4057 // test item giving locale + calendar, date format, and CalAndFmtTestItems
4059 const char * locale
; // with calendar
4060 DateFormat::EStyle style
;
4061 const CalAndFmtTestItem
*caftItems
;
4064 void DateFormatTest::TestNonGregoFmtParse()
4066 // test items for he@calendar=hebrew, long date format
4067 const CalAndFmtTestItem cafti_he_hebrew_long
[] = {
4068 { 4999, 12, 29, 12, 0, CharsToUnicodeString("\\u05DB\\u05F4\\u05D8 \\u05D1\\u05D0\\u05DC\\u05D5\\u05DC \\u05D3\\u05F3\\u05EA\\u05EA\\u05E7\\u05E6\\u05F4\\u05D8") },
4069 { 5100, 0, 1, 12, 0, CharsToUnicodeString("\\u05D0\\u05F3 \\u05D1\\u05EA\\u05E9\\u05E8\\u05D9 \\u05E7\\u05F3") },
4070 { 5774, 5, 1, 12, 0, CharsToUnicodeString("\\u05D0\\u05F3 \\u05D1\\u05D0\\u05D3\\u05E8 \\u05D0\\u05F3 \\u05EA\\u05E9\\u05E2\\u05F4\\u05D3") },
4071 { 5999, 12, 29, 12, 0, CharsToUnicodeString("\\u05DB\\u05F4\\u05D8 \\u05D1\\u05D0\\u05DC\\u05D5\\u05DC \\u05EA\\u05EA\\u05E7\\u05E6\\u05F4\\u05D8") },
4072 { 6100, 0, 1, 12, 0, CharsToUnicodeString("\\u05D0\\u05F3 \\u05D1\\u05EA\\u05E9\\u05E8\\u05D9 \\u05D5\\u05F3\\u05E7\\u05F3") },
4073 { 0, 0, 0, 0, 0, UnicodeString("") } // terminator
4075 // overal test items
4076 const TestNonGregoItem items
[] = {
4077 { "he@calendar=hebrew", DateFormat::kLong
, cafti_he_hebrew_long
},
4078 { NULL
, DateFormat::kNone
, NULL
} // terminator
4080 const TestNonGregoItem
* itemPtr
;
4081 for (itemPtr
= items
; itemPtr
->locale
!= NULL
; itemPtr
++) {
4082 Locale locale
= Locale::createFromName(itemPtr
->locale
);
4083 DateFormat
* dfmt
= DateFormat::createDateInstance(itemPtr
->style
, locale
);
4085 dataerrln("DateFormat::createDateInstance fails for locale %s", itemPtr
->locale
);
4087 Calendar
* cal
= (dfmt
->getCalendar())->clone();
4089 dataerrln("(DateFormat::getCalendar)->clone() fails for locale %s", itemPtr
->locale
);
4091 const CalAndFmtTestItem
* caftItemPtr
;
4092 for (caftItemPtr
= itemPtr
->caftItems
; caftItemPtr
->year
!= 0; caftItemPtr
++) {
4094 cal
->set(UCAL_YEAR
, caftItemPtr
->year
);
4095 cal
->set(UCAL_MONTH
, caftItemPtr
->month
);
4096 cal
->set(UCAL_DATE
, caftItemPtr
->day
);
4097 cal
->set(UCAL_HOUR_OF_DAY
, caftItemPtr
->hour
);
4098 cal
->set(UCAL_MINUTE
, caftItemPtr
->minute
);
4099 UnicodeString result
;
4100 FieldPosition
fpos(0);
4101 dfmt
->format(*cal
, result
, fpos
);
4102 if ( result
.compare(caftItemPtr
->formattedDate
) != 0 ) {
4103 errln( UnicodeString("FAIL: date format for locale ") + UnicodeString(itemPtr
->locale
) + ", style " + itemPtr
->style
+
4104 ", expected \"" + caftItemPtr
->formattedDate
+ "\", got \"" + result
+ "\"");
4106 // formatted OK, try parse
4107 ParsePosition
ppos(0);
4108 dfmt
->parse(result
, *cal
, ppos
);
4109 UErrorCode status
= U_ZERO_ERROR
;
4110 int32_t year
= cal
->get(UCAL_YEAR
, status
);
4111 int32_t month
= cal
->get(UCAL_MONTH
, status
);
4112 int32_t day
= cal
->get(UCAL_DATE
, status
);
4113 if ( U_FAILURE(status
) || ppos
.getIndex() < result
.length() || year
!= caftItemPtr
->year
|| month
!= caftItemPtr
->month
|| day
!= caftItemPtr
->day
) {
4114 errln( UnicodeString("FAIL: date parse for locale ") + UnicodeString(itemPtr
->locale
) + ", style " + itemPtr
->style
+
4115 ", string \"" + result
+ "\", expected " + caftItemPtr
->year
+"-"+caftItemPtr
->month
+"-"+caftItemPtr
->day
+ ", got pos " +
4116 ppos
.getIndex() + " " + year
+"-"+month
+"-"+day
+ " status " + UnicodeString(u_errorName(status
)) );
4127 static const UDate TEST_DATE
= 1326585600000.; // 2012-jan-15
4129 void DateFormatTest::TestDotAndAtLeniency() {
4130 // Test for date/time parsing regression with CLDR 22.1/ICU 50 pattern strings.
4131 // For details see http://bugs.icu-project.org/trac/ticket/9789
4132 static const char *locales
[] = { "en", "fr" };
4133 for (int32_t i
= 0; i
< LENGTHOF(locales
); ++i
) {
4134 Locale
locale(locales
[i
]);
4136 for (DateFormat::EStyle dateStyle
= DateFormat::FULL
; dateStyle
<= DateFormat::SHORT
;
4137 dateStyle
= static_cast<DateFormat::EStyle
>(dateStyle
+ 1)) {
4138 LocalPointer
<DateFormat
> dateFormat(DateFormat::createDateInstance(dateStyle
, locale
));
4140 for (DateFormat::EStyle timeStyle
= DateFormat::FULL
; timeStyle
<= DateFormat::SHORT
;
4141 timeStyle
= static_cast<DateFormat::EStyle
>(timeStyle
+ 1)) {
4142 LocalPointer
<DateFormat
> format(DateFormat::createDateTimeInstance(dateStyle
, timeStyle
, locale
));
4143 LocalPointer
<DateFormat
> timeFormat(DateFormat::createTimeInstance(timeStyle
, locale
));
4144 UnicodeString formattedString
;
4145 if (format
.isNull()) {
4146 dataerrln("Unable to create DateFormat");
4149 format
->format(TEST_DATE
, formattedString
);
4151 if (!showParse(*format
, formattedString
)) {
4152 errln(UnicodeString(" with date-time: dateStyle=") + dateStyle
+ " timeStyle=" + timeStyle
);
4155 UnicodeString ds
, ts
;
4156 formattedString
= dateFormat
->format(TEST_DATE
, ds
) + " " + timeFormat
->format(TEST_DATE
, ts
);
4157 if (!showParse(*format
, formattedString
)) {
4158 errln(UnicodeString(" with date sp sp time: dateStyle=") + dateStyle
+ " timeStyle=" + timeStyle
);
4160 if (formattedString
.indexOf("n ") >= 0) { // will add "." after the end of text ending in 'n', like Jan.
4161 UnicodeString
plusDot(formattedString
);
4162 plusDot
.findAndReplace("n ", "n. ").append(".");
4163 if (!showParse(*format
, plusDot
)) {
4164 errln(UnicodeString(" with date plus-dot time: dateStyle=") + dateStyle
+ " timeStyle=" + timeStyle
);
4167 if (formattedString
.indexOf(". ") >= 0) { // will subtract "." at the end of strings.
4168 UnicodeString
minusDot(formattedString
);
4169 minusDot
.findAndReplace(". ", " ");
4170 if (!showParse(*format
, minusDot
)) {
4171 errln(UnicodeString(" with date minus-dot time: dateStyle=") + dateStyle
+ " timeStyle=" + timeStyle
);
4179 UBool
DateFormatTest::showParse(DateFormat
&format
, const UnicodeString
&formattedString
) {
4180 ParsePosition parsePosition
;
4181 UDate parsed
= format
.parse(formattedString
, parsePosition
);
4182 UBool ok
= TEST_DATE
== parsed
&& parsePosition
.getIndex() == formattedString
.length();
4183 UnicodeString pattern
;
4184 static_cast<SimpleDateFormat
&>(format
).toPattern(pattern
);
4186 logln(pattern
+ " parsed: " + formattedString
);
4188 errln(pattern
+ " fails to parse: " + formattedString
);
4193 #endif /* #if !UCONFIG_NO_FORMATTING */