1 /******************************************************************** 2 * COPYRIGHT: 3 * Copyright (c) 1997-2011, International Business Machines 4 * Corporation and others. All Rights Reserved. 5 ********************************************************************/ 6 7 #include "unicode/utypes.h" 8 9 #if !UCONFIG_NO_FORMATTING 10 11 #include "dtfmttst.h" 12 #include "unicode/timezone.h" 13 #include "unicode/gregocal.h" 14 #include "unicode/smpdtfmt.h" 15 #include "unicode/datefmt.h" 16 #include "unicode/simpletz.h" 17 #include "unicode/strenum.h" 18 #include "unicode/dtfmtsym.h" 19 #include "cmemory.h" 20 #include "cstring.h" 21 #include "caltest.h" // for fieldName 22 #include <stdio.h> // for sprintf 23 24 #ifdef U_WINDOWS 25 #include "windttst.h" 26 #endif 27 28 #define ARRAY_SIZE(array) (sizeof array / sizeof array[0]) 29 30 #define ASSERT_OK(status) if(U_FAILURE(status)) {errcheckln(status, #status " = %s @ %s:%d", u_errorName(status), __FILE__, __LINE__); return; } 31 32 // ***************************************************************************** 33 // class DateFormatTest 34 // ***************************************************************************** 35 36 void DateFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) 37 { 38 // if (exec) logln((UnicodeString)"TestSuite DateFormatTest"); 39 switch (index) { 40 TESTCASE(0,TestEquals); 41 TESTCASE(1,TestTwoDigitYearDSTParse); 42 TESTCASE(2,TestFieldPosition); 43 TESTCASE(3,TestPartialParse994); 44 TESTCASE(4,TestRunTogetherPattern985); 45 TESTCASE(5,TestRunTogetherPattern917); 46 TESTCASE(6,TestCzechMonths459); 47 TESTCASE(7,TestLetterDPattern212); 48 TESTCASE(8,TestDayOfYearPattern195); 49 TESTCASE(9,TestQuotePattern161); 50 TESTCASE(10,TestBadInput135); 51 TESTCASE(11,TestBadInput135a); 52 TESTCASE(12,TestTwoDigitYear); 53 TESTCASE(13,TestDateFormatZone061); 54 TESTCASE(14,TestDateFormatZone146); 55 TESTCASE(15,TestLocaleDateFormat); 56 TESTCASE(16,TestWallyWedel); 57 TESTCASE(17,TestDateFormatCalendar); 58 TESTCASE(18,TestSpaceParsing); 59 TESTCASE(19,TestExactCountFormat); 60 TESTCASE(20,TestWhiteSpaceParsing); 61 TESTCASE(21,TestInvalidPattern); 62 TESTCASE(22,TestGeneral); 63 TESTCASE(23,TestGreekMay); 64 TESTCASE(24,TestGenericTime); 65 TESTCASE(25,TestGenericTimeZoneOrder); 66 TESTCASE(26,TestHost); 67 TESTCASE(27,TestEras); 68 TESTCASE(28,TestNarrowNames); 69 TESTCASE(29,TestStandAloneDays); 70 TESTCASE(30,TestStandAloneMonths); 71 TESTCASE(31,TestQuarters); 72 TESTCASE(32,TestZTimeZoneParsing); 73 TESTCASE(33,TestRelative); 74 TESTCASE(34,TestRelativeClone); 75 TESTCASE(35,TestHostClone); 76 TESTCASE(36,TestTimeZoneDisplayName); 77 TESTCASE(37,TestRoundtripWithCalendar); 78 TESTCASE(38,Test6338); 79 TESTCASE(39,Test6726); 80 TESTCASE(40,TestGMTParsing); 81 TESTCASE(41,Test6880); 82 TESTCASE(42,TestISOEra); 83 TESTCASE(43,TestFormalChineseDate); 84 TESTCASE(44,TestNumberAsStringParsing); 85 TESTCASE(45,TestStandAloneGMTParse); 86 /* 87 TESTCASE(46,TestRelativeError); 88 TESTCASE(47,TestRelativeOther); 89 */ 90 default: name = ""; break; 91 } 92 } 93 94 // Test written by Wally Wedel and emailed to me. 95 void DateFormatTest::TestWallyWedel() 96 { 97 UErrorCode status = U_ZERO_ERROR; 98 /* 99 * Instantiate a TimeZone so we can get the ids. 100 */ 101 TimeZone *tz = new SimpleTimeZone(7,""); 102 /* 103 * Computational variables. 104 */ 105 int32_t offset, hours, minutes, seconds; 106 /* 107 * Instantiate a SimpleDateFormat set up to produce a full time 108 zone name. 109 */ 110 SimpleDateFormat *sdf = new SimpleDateFormat((UnicodeString)"zzzz", status); 111 /* 112 * A String array for the time zone ids. 113 */ 114 int32_t ids_length; 115 StringEnumeration* ids = TimeZone::createEnumeration(); 116 if (ids == NULL) { 117 dataerrln("Unable to create TimeZone enumeration."); 118 if (sdf != NULL) { 119 delete sdf; 120 } 121 return; 122 } 123 ids_length = ids->count(status); 124 /* 125 * How many ids do we have? 126 */ 127 logln("Time Zone IDs size: %d", ids_length); 128 /* 129 * Column headings (sort of) 130 */ 131 logln("Ordinal ID offset(h:m) name"); 132 /* 133 * Loop through the tzs. 134 */ 135 UDate today = Calendar::getNow(); 136 Calendar *cal = Calendar::createInstance(status); 137 for (int32_t i = 0; i < ids_length; i++) { 138 // logln(i + " " + ids[i]); 139 const UnicodeString* id = ids->snext(status); 140 TimeZone *ttz = TimeZone::createTimeZone(*id); 141 // offset = ttz.getRawOffset(); 142 cal->setTimeZone(*ttz); 143 cal->setTime(today, status); 144 offset = cal->get(UCAL_ZONE_OFFSET, status) + cal->get(UCAL_DST_OFFSET, status); 145 // logln(i + " " + ids[i] + " offset " + offset); 146 const char* sign = "+"; 147 if (offset < 0) { 148 sign = "-"; 149 offset = -offset; 150 } 151 hours = offset/3600000; 152 minutes = (offset%3600000)/60000; 153 seconds = (offset%60000)/1000; 154 UnicodeString dstOffset = (UnicodeString)"" + sign + (hours < 10 ? "0" : "") + 155 (int32_t)hours + ":" + (minutes < 10 ? "0" : "") + (int32_t)minutes; 156 if (seconds != 0) { 157 dstOffset = dstOffset + ":" + (seconds < 10 ? "0" : "") + seconds; 158 } 159 /* 160 * Instantiate a date so we can display the time zone name. 161 */ 162 sdf->setTimeZone(*ttz); 163 /* 164 * Format the output. 165 */ 166 UnicodeString fmtOffset; 167 FieldPosition pos(0); 168 sdf->format(today,fmtOffset, pos); 169 // UnicodeString fmtOffset = tzS.toString(); 170 UnicodeString *fmtDstOffset = 0; 171 if (fmtOffset.startsWith("GMT") && fmtOffset.length() != 3) 172 { 173 //fmtDstOffset = fmtOffset->substring(3); 174 fmtDstOffset = new UnicodeString(); 175 fmtOffset.extract(3, fmtOffset.length(), *fmtDstOffset); 176 } 177 /* 178 * Show our result. 179 */ 180 UBool ok = fmtDstOffset == 0 || *fmtDstOffset == dstOffset; 181 if (ok) 182 { 183 logln(UnicodeString() + i + " " + *id + " " + dstOffset + 184 " " + fmtOffset + 185 (fmtDstOffset != 0 ? " ok" : " ?")); 186 } 187 else 188 { 189 errln(UnicodeString() + i + " " + *id + " " + dstOffset + 190 " " + fmtOffset + " *** FAIL ***"); 191 } 192 delete ttz; 193 delete fmtDstOffset; 194 } 195 delete cal; 196 // delete ids; // TODO: BAD API 197 delete ids; 198 delete sdf; 199 delete tz; 200 } 201 202 // ------------------------------------- 203 204 /** 205 * Test operator== 206 */ 207 void 208 DateFormatTest::TestEquals() 209 { 210 DateFormat* fmtA = DateFormat::createDateTimeInstance(DateFormat::MEDIUM, DateFormat::FULL); 211 DateFormat* fmtB = DateFormat::createDateTimeInstance(DateFormat::MEDIUM, DateFormat::FULL); 212 if ( fmtA == NULL || fmtB == NULL){ 213 dataerrln("Error calling DateFormat::createDateTimeInstance"); 214 delete fmtA; 215 delete fmtB; 216 return; 217 } 218 219 if (!(*fmtA == *fmtB)) errln((UnicodeString)"FAIL"); 220 delete fmtA; 221 delete fmtB; 222 223 TimeZone* test = TimeZone::createTimeZone("PDT"); 224 delete test; 225 } 226 227 // ------------------------------------- 228 229 /** 230 * Test the parsing of 2-digit years. 231 */ 232 void 233 DateFormatTest::TestTwoDigitYearDSTParse(void) 234 { 235 UErrorCode status = U_ZERO_ERROR; 236 SimpleDateFormat* fullFmt = new SimpleDateFormat((UnicodeString)"EEE MMM dd HH:mm:ss.SSS zzz yyyy G", status); 237 SimpleDateFormat *fmt = new SimpleDateFormat((UnicodeString)"dd-MMM-yy h:mm:ss 'o''clock' a z", Locale::getEnglish(), status); 238 //DateFormat* fmt = DateFormat::createDateTimeInstance(DateFormat::MEDIUM, DateFormat::FULL, Locale::ENGLISH); 239 UnicodeString* s = new UnicodeString("03-Apr-04 2:20:47 o'clock AM PST", ""); 240 TimeZone* defaultTZ = TimeZone::createDefault(); 241 TimeZone* PST = TimeZone::createTimeZone("PST"); 242 int32_t defaultOffset = defaultTZ->getRawOffset(); 243 int32_t PSTOffset = PST->getRawOffset(); 244 int32_t hour = 2 + (defaultOffset - PSTOffset) / (60*60*1000); 245 // hour is the expected hour of day, in units of seconds 246 hour = ((hour < 0) ? hour + 24 : hour) * 60*60; 247 248 UnicodeString str; 249 250 if(U_FAILURE(status)) { 251 dataerrln("Could not set up test. exitting - %s", u_errorName(status)); 252 return; 253 } 254 255 UDate d = fmt->parse(*s, status); 256 logln(*s + " P> " + ((DateFormat*)fullFmt)->format(d, str)); 257 int32_t y, m, day, hr, min, sec; 258 dateToFields(d, y, m, day, hr, min, sec); 259 hour += defaultTZ->inDaylightTime(d, status) ? 1 : 0; 260 hr = hr*60*60; 261 if (hr != hour) 262 errln((UnicodeString)"FAIL: Should parse to hour " + hour + " but got " + hr); 263 264 if (U_FAILURE(status)) 265 errln((UnicodeString)"FAIL: " + (int32_t)status); 266 267 delete s; 268 delete fmt; 269 delete fullFmt; 270 delete PST; 271 delete defaultTZ; 272 } 273 274 // ------------------------------------- 275 276 UChar toHexString(int32_t i) { return (UChar)(i + (i < 10 ? 0x30 : (0x41 - 10))); } 277 278 UnicodeString& 279 DateFormatTest::escape(UnicodeString& s) 280 { 281 UnicodeString buf; 282 for (int32_t i=0; i<s.length(); ++i) 283 { 284 UChar c = s[(int32_t)i]; 285 if (c <= (UChar)0x7F) buf += c; 286 else { 287 buf += (UChar)0x5c; buf += (UChar)0x55; 288 buf += toHexString((c & 0xF000) >> 12); 289 buf += toHexString((c & 0x0F00) >> 8); 290 buf += toHexString((c & 0x00F0) >> 4); 291 buf += toHexString(c & 0x000F); 292 } 293 } 294 return (s = buf); 295 } 296 297 // ------------------------------------- 298 299 /** 300 * This MUST be kept in sync with DateFormatSymbols.gPatternChars. 301 */ 302 static const char* PATTERN_CHARS = "GyMdkHmsSEDFwWahKzYeugAZvcLQqV"; 303 304 /** 305 * A list of the names of all the fields in DateFormat. 306 * This MUST be kept in sync with DateFormat. 307 */ 308 static const char* DATEFORMAT_FIELD_NAMES[] = { 309 "ERA_FIELD", 310 "YEAR_FIELD", 311 "MONTH_FIELD", 312 "DATE_FIELD", 313 "HOUR_OF_DAY1_FIELD", 314 "HOUR_OF_DAY0_FIELD", 315 "MINUTE_FIELD", 316 "SECOND_FIELD", 317 "MILLISECOND_FIELD", 318 "DAY_OF_WEEK_FIELD", 319 "DAY_OF_YEAR_FIELD", 320 "DAY_OF_WEEK_IN_MONTH_FIELD", 321 "WEEK_OF_YEAR_FIELD", 322 "WEEK_OF_MONTH_FIELD", 323 "AM_PM_FIELD", 324 "HOUR1_FIELD", 325 "HOUR0_FIELD", 326 "TIMEZONE_FIELD", 327 "YEAR_WOY_FIELD", 328 "DOW_LOCAL_FIELD", 329 "EXTENDED_YEAR_FIELD", 330 "JULIAN_DAY_FIELD", 331 "MILLISECONDS_IN_DAY_FIELD", 332 "TIMEZONE_RFC_FIELD", 333 "GENERIC_TIMEZONE_FIELD", 334 "STAND_ALONE_DAY_FIELD", 335 "STAND_ALONE_MONTH_FIELD", 336 "QUARTER_FIELD", 337 "STAND_ALONE_QUARTER_FIELD", 338 "TIMEZONE_SPECIAL_FIELD" 339 }; 340 341 static const int32_t DATEFORMAT_FIELD_NAMES_LENGTH = 342 sizeof(DATEFORMAT_FIELD_NAMES) / sizeof(DATEFORMAT_FIELD_NAMES[0]); 343 344 /** 345 * Verify that returned field position indices are correct. 346 */ 347 void DateFormatTest::TestFieldPosition() { 348 UErrorCode ec = U_ZERO_ERROR; 349 int32_t i, j, exp; 350 UnicodeString buf; 351 352 // Verify data 353 DateFormatSymbols rootSyms(Locale(""), ec); 354 assertSuccess("DateFormatSymbols", ec); 355 if (U_FAILURE(ec)) { 356 return; 357 } 358 359 // local pattern chars data is not longer loaded 360 // from icu locale bundle 361 assertEquals("patternChars", PATTERN_CHARS, rootSyms.getLocalPatternChars(buf)); 362 assertEquals("patternChars", PATTERN_CHARS, DateFormatSymbols::getPatternUChars()); 363 assertTrue("DATEFORMAT_FIELD_NAMES", DATEFORMAT_FIELD_NAMES_LENGTH == UDAT_FIELD_COUNT); 364 assertTrue("Data", UDAT_FIELD_COUNT == uprv_strlen(PATTERN_CHARS)); 365 366 // Create test formatters 367 const int32_t COUNT = 4; 368 DateFormat* dateFormats[COUNT]; 369 dateFormats[0] = DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, Locale::getUS()); 370 dateFormats[1] = DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, Locale::getFrance()); 371 // Make the pattern "G y M d..." 372 buf.remove().append(PATTERN_CHARS); 373 for (j=buf.length()-1; j>=0; --j) buf.insert(j, (UChar)32/*' '*/); 374 dateFormats[2] = new SimpleDateFormat(buf, Locale::getUS(), ec); 375 // Make the pattern "GGGG yyyy MMMM dddd..." 376 for (j=buf.length()-1; j>=0; j-=2) { 377 for (i=0; i<3; ++i) { 378 buf.insert(j, buf.charAt(j)); 379 } 380 } 381 dateFormats[3] = new SimpleDateFormat(buf, Locale::getUS(), ec); 382 if(U_FAILURE(ec)){ 383 errln(UnicodeString("Could not create SimpleDateFormat object for locale en_US. Error: " )+ UnicodeString(u_errorName(ec))); 384 return; 385 } 386 UDate aug13 = 871508052513.0; 387 388 // Expected output field values for above DateFormats on aug13 389 // Fields are given in order of DateFormat field number 390 const char* EXPECTED[] = { 391 "", "1997", "August", "13", "", "", "34", "12", "", 392 "Wednesday", "", "", "", "", "PM", "2", "", "Pacific Daylight Time", "", "", "", "", "", "", "", "", "", "", "","", 393 394 "", "1997", "ao\\u00FBt", "13", "", "14", "34", "12", "", 395 "mercredi", "", "", "", "", "", "", "", "heure avanc\\u00e9e du Pacifique", "", "", "", "", "", "", "", "", "", "", "", "", 396 397 "AD", "1997", "8", "13", "14", "14", "34", "12", "5", 398 "Wed", "225", "2", "33", "3", "PM", "2", "2", "PDT", "1997", "4", "1997", "2450674", "52452513", "-0700", "PT", "4", "8", "3", "3","PDT", 399 400 "Anno Domini", "1997", "August", "0013", "0014", "0014", "0034", "0012", "5130", 401 "Wednesday", "0225", "0002", "0033", "0003", "PM", "0002", "0002", "Pacific Daylight Time", "1997", "Wednesday", "1997", "2450674", "52452513", "GMT-07:00", 402 "Pacific Time", "Wednesday", "August", "3rd quarter", "3rd quarter", "United States Time (Los Angeles)" 403 }; 404 405 const int32_t EXPECTED_LENGTH = sizeof(EXPECTED)/sizeof(EXPECTED[0]); 406 407 assertTrue("data size", EXPECTED_LENGTH == COUNT * UDAT_FIELD_COUNT); 408 409 TimeZone* PT = TimeZone::createTimeZone("America/Los_Angeles"); 410 for (j = 0, exp = 0; j < COUNT; ++j) { 411 // String str; 412 DateFormat* df = dateFormats[j]; 413 df->setTimeZone(*PT); 414 SimpleDateFormat* sdtfmt = dynamic_cast<SimpleDateFormat*>(df); 415 if (sdtfmt != NULL) { 416 logln(" Pattern = " + sdtfmt->toPattern(buf.remove())); 417 } else { 418 logln(" Pattern = ? (not a SimpleDateFormat)"); 419 } 420 logln((UnicodeString)" Result = " + df->format(aug13, buf.remove())); 421 422 int32_t expBase = exp; // save for later 423 for (i = 0; i < UDAT_FIELD_COUNT; ++i, ++exp) { 424 FieldPosition pos(i); 425 buf.remove(); 426 df->format(aug13, buf, pos); 427 UnicodeString field; 428 buf.extractBetween(pos.getBeginIndex(), pos.getEndIndex(), field); 429 assertEquals((UnicodeString)"field #" + i + " " + DATEFORMAT_FIELD_NAMES[i], 430 ctou(EXPECTED[exp]), field); 431 } 432 433 // test FieldPositionIterator API 434 logln("FieldPositionIterator"); 435 { 436 UErrorCode status = U_ZERO_ERROR; 437 FieldPositionIterator posIter; 438 FieldPosition fp; 439 440 buf.remove(); 441 df->format(aug13, buf, &posIter, status); 442 while (posIter.next(fp)) { 443 int32_t i = fp.getField(); 444 UnicodeString field; 445 buf.extractBetween(fp.getBeginIndex(), fp.getEndIndex(), field); 446 assertEquals((UnicodeString)"field #" + i + " " + DATEFORMAT_FIELD_NAMES[i], 447 ctou(EXPECTED[expBase + i]), field); 448 } 449 450 } 451 } 452 453 454 // test null posIter 455 buf.remove(); 456 UErrorCode status = U_ZERO_ERROR; 457 dateFormats[0]->format(aug13, buf, NULL, status); 458 // if we didn't crash, we succeeded. 459 460 for (i=0; i<COUNT; ++i) { 461 delete dateFormats[i]; 462 } 463 delete PT; 464 } 465 466 // ------------------------------------- 467 468 /** 469 * General parse/format tests. Add test cases as needed. 470 */ 471 void DateFormatTest::TestGeneral() { 472 const char* DATA[] = { 473 "yyyy MM dd HH:mm:ss.SSS", 474 475 // Milliseconds are left-justified, since they format as fractions of a second 476 "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", 477 "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", 478 "y/M/d H:mm:ss.SSS", "F", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.567", 479 "y/M/d H:mm:ss.SSSS", "pf", "2004/3/10 16:36:31.5679", "2004 03 10 16:36:31.568", "2004/3/10 16:36:31.5680", 480 }; 481 expect(DATA, ARRAY_SIZE(DATA), Locale("en", "", "")); 482 } 483 484 // ------------------------------------- 485 486 /** 487 * Verify that strings which contain incomplete specifications are parsed 488 * correctly. In some instances, this means not being parsed at all, and 489 * returning an appropriate error. 490 */ 491 void 492 DateFormatTest::TestPartialParse994() 493 { 494 UErrorCode status = U_ZERO_ERROR; 495 SimpleDateFormat* f = new SimpleDateFormat(status); 496 if (U_FAILURE(status)) { 497 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status)); 498 delete f; 499 return; 500 } 501 UDate null = 0; 502 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17 10:11:42", date(97, 1 - 1, 17, 10, 11, 42)); 503 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17 10:", null); 504 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17 10", null); 505 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17 ", null); 506 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17", null); 507 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: UErrorCode received during test: " + (int32_t)status); 508 delete f; 509 } 510 511 // ------------------------------------- 512 513 void 514 DateFormatTest::tryPat994(SimpleDateFormat* format, const char* pat, const char* str, UDate expected) 515 { 516 UErrorCode status = U_ZERO_ERROR; 517 UDate null = 0; 518 logln(UnicodeString("Pattern \"") + pat + "\" String \"" + str + "\""); 519 //try { 520 format->applyPattern(pat); 521 UDate date = format->parse(str, status); 522 if (U_FAILURE(status) || date == null) 523 { 524 logln((UnicodeString)"ParseException: " + (int32_t)status); 525 if (expected != null) errln((UnicodeString)"FAIL: Expected " + dateToString(expected)); 526 } 527 else 528 { 529 UnicodeString f; 530 ((DateFormat*)format)->format(date, f); 531 logln(UnicodeString(" parse(") + str + ") -> " + dateToString(date)); 532 logln((UnicodeString)" format -> " + f); 533 if (expected == null || 534 !(date == expected)) errln((UnicodeString)"FAIL: Expected null");//" + expected); 535 if (!(f == str)) errln(UnicodeString("FAIL: Expected ") + str); 536 } 537 //} 538 //catch(ParseException e) { 539 // logln((UnicodeString)"ParseException: " + e.getMessage()); 540 // if (expected != null) errln((UnicodeString)"FAIL: Expected " + dateToString(expected)); 541 //} 542 //catch(Exception e) { 543 // errln((UnicodeString)"*** Exception:"); 544 // e.printStackTrace(); 545 //} 546 } 547 548 // ------------------------------------- 549 550 /** 551 * Verify the behavior of patterns in which digits for different fields run together 552 * without intervening separators. 553 */ 554 void 555 DateFormatTest::TestRunTogetherPattern985() 556 { 557 UErrorCode status = U_ZERO_ERROR; 558 UnicodeString format("yyyyMMddHHmmssSSS"); 559 UnicodeString now, then; 560 //UBool flag; 561 SimpleDateFormat *formatter = new SimpleDateFormat(format, status); 562 if (U_FAILURE(status)) { 563 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status)); 564 delete formatter; 565 return; 566 } 567 UDate date1 = Calendar::getNow(); 568 ((DateFormat*)formatter)->format(date1, now); 569 logln(now); 570 ParsePosition pos(0); 571 UDate date2 = formatter->parse(now, pos); 572 if (date2 == 0) then = "Parse stopped at " + pos.getIndex(); 573 else ((DateFormat*)formatter)->format(date2, then); 574 logln(then); 575 if (!(date2 == date1)) errln((UnicodeString)"FAIL"); 576 delete formatter; 577 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: UErrorCode received during test: " + (int32_t)status); 578 } 579 580 // ------------------------------------- 581 582 /** 583 * Verify the behavior of patterns in which digits for different fields run together 584 * without intervening separators. 585 */ 586 void 587 DateFormatTest::TestRunTogetherPattern917() 588 { 589 UErrorCode status = U_ZERO_ERROR; 590 SimpleDateFormat* fmt; 591 UnicodeString myDate; 592 fmt = new SimpleDateFormat((UnicodeString)"yyyy/MM/dd", status); 593 if (U_FAILURE(status)) { 594 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status)); 595 delete fmt; 596 return; 597 } 598 myDate = "1997/02/03"; 599 testIt917(fmt, myDate, date(97, 2 - 1, 3)); 600 delete fmt; 601 fmt = new SimpleDateFormat((UnicodeString)"yyyyMMdd", status); 602 myDate = "19970304"; 603 testIt917(fmt, myDate, date(97, 3 - 1, 4)); 604 delete fmt; 605 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: UErrorCode received during test: " + (int32_t)status); 606 } 607 608 // ------------------------------------- 609 610 void 611 DateFormatTest::testIt917(SimpleDateFormat* fmt, UnicodeString& str, UDate expected) 612 { 613 UErrorCode status = U_ZERO_ERROR; 614 UnicodeString pattern; 615 logln((UnicodeString)"pattern=" + fmt->toPattern(pattern) + " string=" + str); 616 Formattable o; 617 //try { 618 ((Format*)fmt)->parseObject(str, o, status); 619 //} 620 if (U_FAILURE(status)) return; 621 //catch(ParseException e) { 622 // e.printStackTrace(); 623 // return; 624 //} 625 logln((UnicodeString)"Parsed object: " + dateToString(o.getDate())); 626 if (!(o.getDate() == expected)) errln((UnicodeString)"FAIL: Expected " + dateToString(expected)); 627 UnicodeString formatted; ((Format*)fmt)->format(o, formatted, status); 628 logln((UnicodeString)"Formatted string: " + formatted); 629 if (!(formatted == str)) errln((UnicodeString)"FAIL: Expected " + str); 630 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: UErrorCode received during test: " + (int32_t)status); 631 } 632 633 // ------------------------------------- 634 635 /** 636 * Verify the handling of Czech June and July, which have the unique attribute that 637 * one is a proper prefix substring of the other. 638 */ 639 void 640 DateFormatTest::TestCzechMonths459() 641 { 642 UErrorCode status = U_ZERO_ERROR; 643 DateFormat* fmt = DateFormat::createDateInstance(DateFormat::FULL, Locale("cs", "", "")); 644 if (fmt == NULL){ 645 dataerrln("Error calling DateFormat::createDateInstance()"); 646 return; 647 } 648 649 UnicodeString pattern; 650 logln((UnicodeString)"Pattern " + ((SimpleDateFormat*) fmt)->toPattern(pattern)); 651 UDate june = date(97, UCAL_JUNE, 15); 652 UDate july = date(97, UCAL_JULY, 15); 653 UnicodeString juneStr; fmt->format(june, juneStr); 654 UnicodeString julyStr; fmt->format(july, julyStr); 655 //try { 656 logln((UnicodeString)"format(June 15 1997) = " + juneStr); 657 UDate d = fmt->parse(juneStr, status); 658 UnicodeString s; fmt->format(d, s); 659 int32_t month,yr,day,hr,min,sec; dateToFields(d,yr,month,day,hr,min,sec); 660 logln((UnicodeString)" -> parse -> " + s + " (month = " + month + ")"); 661 if (month != UCAL_JUNE) errln((UnicodeString)"FAIL: Month should be June"); 662 logln((UnicodeString)"format(July 15 1997) = " + julyStr); 663 d = fmt->parse(julyStr, status); 664 fmt->format(d, s); 665 dateToFields(d,yr,month,day,hr,min,sec); 666 logln((UnicodeString)" -> parse -> " + s + " (month = " + month + ")"); 667 if (month != UCAL_JULY) errln((UnicodeString)"FAIL: Month should be July"); 668 //} 669 //catch(ParseException e) { 670 if (U_FAILURE(status)) 671 errln((UnicodeString)"Exception: " + (int32_t)status); 672 //} 673 delete fmt; 674 } 675 676 // ------------------------------------- 677 678 /** 679 * Test the handling of 'D' in patterns. 680 */ 681 void 682 DateFormatTest::TestLetterDPattern212() 683 { 684 UErrorCode status = U_ZERO_ERROR; 685 UnicodeString dateString("1995-040.05:01:29"); 686 UnicodeString bigD("yyyy-DDD.hh:mm:ss"); 687 UnicodeString littleD("yyyy-ddd.hh:mm:ss"); 688 UDate expLittleD = date(95, 0, 1, 5, 1, 29); 689 UDate expBigD = expLittleD + 39 * 24 * 3600000.0; 690 expLittleD = expBigD; // Expect the same, with default lenient parsing 691 logln((UnicodeString)"dateString= " + dateString); 692 SimpleDateFormat *formatter = new SimpleDateFormat(bigD, status); 693 if (U_FAILURE(status)) { 694 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status)); 695 delete formatter; 696 return; 697 } 698 ParsePosition pos(0); 699 UDate myDate = formatter->parse(dateString, pos); 700 logln((UnicodeString)"Using " + bigD + " -> " + myDate); 701 if (myDate != expBigD) errln((UnicodeString)"FAIL: bigD - Expected " + dateToString(expBigD)); 702 delete formatter; 703 formatter = new SimpleDateFormat(littleD, status); 704 ASSERT_OK(status); 705 pos = ParsePosition(0); 706 myDate = formatter->parse(dateString, pos); 707 logln((UnicodeString)"Using " + littleD + " -> " + dateToString(myDate)); 708 if (myDate != expLittleD) errln((UnicodeString)"FAIL: littleD - Expected " + dateToString(expLittleD)); 709 delete formatter; 710 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: UErrorCode received during test: " + (int32_t)status); 711 } 712 713 // ------------------------------------- 714 715 /** 716 * Test the day of year pattern. 717 */ 718 void 719 DateFormatTest::TestDayOfYearPattern195() 720 { 721 UErrorCode status = U_ZERO_ERROR; 722 UDate today = Calendar::getNow(); 723 int32_t year,month,day,hour,min,sec; dateToFields(today,year,month,day,hour,min,sec); 724 UDate expected = date(year, month, day); 725 logln((UnicodeString)"Test Date: " + dateToString(today)); 726 SimpleDateFormat* sdf = (SimpleDateFormat*)DateFormat::createDateInstance(); 727 if (sdf == NULL){ 728 dataerrln("Error calling DateFormat::createDateInstance()"); 729 return; 730 } 731 tryPattern(*sdf, today, 0, expected); 732 tryPattern(*sdf, today, "G yyyy DDD", expected); 733 delete sdf; 734 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: UErrorCode received during test: " + (int32_t)status); 735 } 736 737 // ------------------------------------- 738 739 void 740 DateFormatTest::tryPattern(SimpleDateFormat& sdf, UDate d, const char* pattern, UDate expected) 741 { 742 UErrorCode status = U_ZERO_ERROR; 743 if (pattern != 0) sdf.applyPattern(pattern); 744 UnicodeString thePat; 745 logln((UnicodeString)"pattern: " + sdf.toPattern(thePat)); 746 UnicodeString formatResult; (*(DateFormat*)&sdf).format(d, formatResult); 747 logln((UnicodeString)" format -> " + formatResult); 748 // try { 749 UDate d2 = sdf.parse(formatResult, status); 750 logln((UnicodeString)" parse(" + formatResult + ") -> " + dateToString(d2)); 751 if (d2 != expected) errln((UnicodeString)"FAIL: Expected " + dateToString(expected)); 752 UnicodeString format2; (*(DateFormat*)&sdf).format(d2, format2); 753 logln((UnicodeString)" format -> " + format2); 754 if (!(formatResult == format2)) errln((UnicodeString)"FAIL: Round trip drift"); 755 //} 756 //catch(Exception e) { 757 if (U_FAILURE(status)) 758 errln((UnicodeString)"Error: " + (int32_t)status); 759 //} 760 } 761 762 // ------------------------------------- 763 764 /** 765 * Test the handling of single quotes in patterns. 766 */ 767 void 768 DateFormatTest::TestQuotePattern161() 769 { 770 UErrorCode status = U_ZERO_ERROR; 771 SimpleDateFormat* formatter = new SimpleDateFormat((UnicodeString)"MM/dd/yyyy 'at' hh:mm:ss a zzz", status); 772 if (U_FAILURE(status)) { 773 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status)); 774 delete formatter; 775 return; 776 } 777 UDate currentTime_1 = date(97, UCAL_AUGUST, 13, 10, 42, 28); 778 UnicodeString dateString; ((DateFormat*)formatter)->format(currentTime_1, dateString); 779 UnicodeString exp("08/13/1997 at 10:42:28 AM "); 780 logln((UnicodeString)"format(" + dateToString(currentTime_1) + ") = " + dateString); 781 if (0 != dateString.compareBetween(0, exp.length(), exp, 0, exp.length())) errln((UnicodeString)"FAIL: Expected " + exp); 782 delete formatter; 783 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: UErrorCode received during test: " + (int32_t)status); 784 } 785 786 // ------------------------------------- 787 788 /** 789 * Verify the correct behavior when handling invalid input strings. 790 */ 791 void 792 DateFormatTest::TestBadInput135() 793 { 794 UErrorCode status = U_ZERO_ERROR; 795 DateFormat::EStyle looks[] = { 796 DateFormat::SHORT, DateFormat::MEDIUM, DateFormat::LONG, DateFormat::FULL 797 }; 798 int32_t looks_length = (int32_t)(sizeof(looks) / sizeof(looks[0])); 799 const char* strings[] = { 800 "Mar 15", "Mar 15 1997", "asdf", "3/1/97 1:23:", "3/1/00 1:23:45 AM" 801 }; 802 int32_t strings_length = (int32_t)(sizeof(strings) / sizeof(strings[0])); 803 DateFormat *full = DateFormat::createDateTimeInstance(DateFormat::LONG, DateFormat::LONG); 804 if(full==NULL) { 805 dataerrln("could not create date time instance"); 806 return; 807 } 808 UnicodeString expected("March 1, 2000 1:23:45 AM "); 809 for (int32_t i = 0; i < strings_length;++i) { 810 const char* text = strings[i]; 811 for (int32_t j = 0; j < looks_length;++j) { 812 DateFormat::EStyle dateLook = looks[j]; 813 for (int32_t k = 0; k < looks_length;++k) { 814 DateFormat::EStyle timeLook = looks[k]; 815 DateFormat *df = DateFormat::createDateTimeInstance(dateLook, timeLook); 816 if (df == NULL){ 817 dataerrln("Error calling DateFormat::createDateTimeInstance()"); 818 continue; 819 } 820 UnicodeString prefix = UnicodeString(text) + ", " + dateLook + "/" + timeLook + ": "; 821 //try { 822 UDate when = df->parse(text, status); 823 if (when == 0 && U_SUCCESS(status)) { 824 errln(prefix + "SHOULD NOT HAPPEN: parse returned 0."); 825 continue; 826 } 827 if (U_SUCCESS(status)) 828 { 829 UnicodeString format; 830 UnicodeString pattern; 831 SimpleDateFormat* sdtfmt = dynamic_cast<SimpleDateFormat*>(df); 832 if (sdtfmt != NULL) { 833 sdtfmt->toPattern(pattern); 834 } 835 full->format(when, format); 836 logln(prefix + "OK: " + format); 837 if (0!=format.compareBetween(0, expected.length(), expected, 0, expected.length())) 838 errln((UnicodeString)"FAIL: Parse \"" + text + "\", pattern \"" + pattern + "\", expected " + expected + " got " + format); 839 } 840 //} 841 //catch(ParseException e) { 842 else 843 status = U_ZERO_ERROR; 844 //} 845 //catch(StringIndexOutOfBoundsException e) { 846 // errln(prefix + "SHOULD NOT HAPPEN: " + (int)status); 847 //} 848 delete df; 849 } 850 } 851 } 852 delete full; 853 if (U_FAILURE(status)) 854 errln((UnicodeString)"FAIL: UErrorCode received during test: " + (int32_t)status); 855 } 856 857 static const char* const parseFormats[] = { 858 "MMMM d, yyyy", 859 "MMMM d yyyy", 860 "M/d/yy", 861 "d MMMM, yyyy", 862 "d MMMM yyyy", 863 "d MMMM", 864 "MMMM d", 865 "yyyy", 866 "h:mm a MMMM d, yyyy" 867 }; 868 869 #if 0 870 // strict inputStrings 871 static const char* const inputStrings[] = { 872 "bogus string", 0, 0, 0, 0, 0, 0, 0, 0, 0, 873 "April 1, 1997", "April 1, 1997", 0, 0, 0, 0, 0, "April 1", 0, 0, 874 "Jan 1, 1970", "January 1, 1970", 0, 0, 0, 0, 0, "January 1", 0, 0, 875 "Jan 1 2037", 0, "January 1 2037", 0, 0, 0, 0, "January 1", 0, 0, 876 "1/1/70", 0, 0, "1/1/70", 0, 0, 0, 0, "0001", 0, 877 "5 May 1997", 0, 0, 0, 0, "5 May 1997", "5 May", 0, "0005", 0, 878 "16 May", 0, 0, 0, 0, 0, "16 May", 0, "0016", 0, 879 "April 30", 0, 0, 0, 0, 0, 0, "April 30", 0, 0, 880 "1998", 0, 0, 0, 0, 0, 0, 0, "1998", 0, 881 "1", 0, 0, 0, 0, 0, 0, 0, "0001", 0, 882 "3:00 pm Jan 1, 1997", 0, 0, 0, 0, 0, 0, 0, "0003", "3:00 PM January 1, 1997", 883 }; 884 #else 885 // lenient inputStrings 886 static const char* const inputStrings[] = { 887 "bogus string", 0, 0, 0, 0, 0, 0, 0, 0, 0, 888 "April 1, 1997", "April 1, 1997", "April 1 1997", "4/1/97", 0, 0, 0, "April 1", 0, 0, 889 "Jan 1, 1970", "January 1, 1970", "January 1 1970", "1/1/70", 0, 0, 0, "January 1", 0, 0, 890 "Jan 1 2037", "January 1, 2037", "January 1 2037", "1/1/37", 0, 0, 0, "January 1", 0, 0, 891 "1/1/70", "January 1, 1970", "January 1 1970", "1/1/70", "1 January, 1970", "1 January 1970", "1 January", "January 1", "0001", 0, 892 "5 May 1997", 0, 0, 0, "5 May, 1997", "5 May 1997", "5 May", 0, "0005", 0, 893 "16 May", 0, 0, 0, 0, 0, "16 May", 0, "2016", 0, 894 "April 30", 0, 0, 0, 0, 0, 0, "April 30", 0, 0, 895 "1998", 0, 0, 0, 0, 0, 0, 0, "1998", 0, 896 "1", 0, 0, 0, 0, 0, 0, 0, "0001", 0, 897 "3:00 pm Jan 1, 1997", 0, 0, 0, 0, 0, 0, 0, "0003", "3:00 PM January 1, 1997", 898 }; 899 #endif 900 901 // ------------------------------------- 902 903 /** 904 * Verify the correct behavior when parsing an array of inputs against an 905 * array of patterns, with known results. The results are encoded after 906 * the input strings in each row. 907 */ 908 void 909 DateFormatTest::TestBadInput135a() 910 { 911 UErrorCode status = U_ZERO_ERROR; 912 SimpleDateFormat* dateParse = new SimpleDateFormat(status); 913 if(U_FAILURE(status)) { 914 dataerrln("Failed creating SimpleDateFormat with %s. Quitting test", u_errorName(status)); 915 delete dateParse; 916 return; 917 } 918 const char* s; 919 UDate date; 920 const uint32_t PF_LENGTH = (int32_t)(sizeof(parseFormats)/sizeof(parseFormats[0])); 921 const uint32_t INPUT_LENGTH = (int32_t)(sizeof(inputStrings)/sizeof(inputStrings[0])); 922 923 dateParse->applyPattern("d MMMM, yyyy"); 924 dateParse->adoptTimeZone(TimeZone::createDefault()); 925 s = "not parseable"; 926 UnicodeString thePat; 927 logln(UnicodeString("Trying to parse \"") + s + "\" with " + dateParse->toPattern(thePat)); 928 //try { 929 date = dateParse->parse(s, status); 930 if (U_SUCCESS(status)) 931 errln((UnicodeString)"FAIL: Expected exception during parse"); 932 //} 933 //catch(Exception ex) { 934 else 935 logln((UnicodeString)"Exception during parse: " + (int32_t)status); 936 status = U_ZERO_ERROR; 937 //} 938 for (uint32_t i = 0; i < INPUT_LENGTH; i += (PF_LENGTH + 1)) { 939 ParsePosition parsePosition(0); 940 UnicodeString s( inputStrings[i]); 941 for (uint32_t index = 0; index < PF_LENGTH;++index) { 942 const char* expected = inputStrings[i + 1 + index]; 943 dateParse->applyPattern(parseFormats[index]); 944 dateParse->adoptTimeZone(TimeZone::createDefault()); 945 //try { 946 parsePosition.setIndex(0); 947 date = dateParse->parse(s, parsePosition); 948 if (parsePosition.getIndex() != 0) { 949 UnicodeString s1, s2; 950 s.extract(0, parsePosition.getIndex(), s1); 951 s.extract(parsePosition.getIndex(), s.length(), s2); 952 if (date == 0) { 953 errln((UnicodeString)"ERROR: null result fmt=\"" + 954 parseFormats[index] + 955 "\" pos=" + parsePosition.getIndex() + " " + 956 s1 + "|" + s2); 957 } 958 else { 959 UnicodeString result; 960 ((DateFormat*)dateParse)->format(date, result); 961 logln((UnicodeString)"Parsed \"" + s + "\" using \"" + dateParse->toPattern(thePat) + "\" to: " + result); 962 if (expected == 0) 963 errln((UnicodeString)"FAIL: Expected parse failure, got " + result); 964 else if (!(result == expected)) 965 errln(UnicodeString("FAIL: Parse \"") + s + UnicodeString("\", expected ") + expected + UnicodeString(", got ") + result); 966 } 967 } 968 else if (expected != 0) { 969 errln(UnicodeString("FAIL: Expected ") + expected + " from \"" + 970 s + "\" with \"" + dateParse->toPattern(thePat) + "\""); 971 } 972 //} 973 //catch(Exception ex) { 974 if (U_FAILURE(status)) 975 errln((UnicodeString)"An exception was thrown during parse: " + (int32_t)status); 976 //} 977 } 978 } 979 delete dateParse; 980 if (U_FAILURE(status)) 981 errln((UnicodeString)"FAIL: UErrorCode received during test: " + (int32_t)status); 982 } 983 984 // ------------------------------------- 985 986 /** 987 * Test the parsing of two-digit years. 988 */ 989 void 990 DateFormatTest::TestTwoDigitYear() 991 { 992 UErrorCode ec = U_ZERO_ERROR; 993 SimpleDateFormat fmt("dd/MM/yy", Locale::getUK(), ec); 994 if (U_FAILURE(ec)) { 995 dataerrln("FAIL: SimpleDateFormat constructor - %s", u_errorName(ec)); 996 return; 997 } 998 parse2DigitYear(fmt, "5/6/17", date(117, UCAL_JUNE, 5)); 999 parse2DigitYear(fmt, "4/6/34", date(34, UCAL_JUNE, 4)); 1000 } 1001 1002 // ------------------------------------- 1003 1004 void 1005 DateFormatTest::parse2DigitYear(DateFormat& fmt, const char* str, UDate expected) 1006 { 1007 UErrorCode status = U_ZERO_ERROR; 1008 //try { 1009 UDate d = fmt.parse(str, status); 1010 UnicodeString thePat; 1011 logln(UnicodeString("Parsing \"") + str + "\" with " + ((SimpleDateFormat*)&fmt)->toPattern(thePat) + 1012 " => " + dateToString(d)); 1013 if (d != expected) errln((UnicodeString)"FAIL: Expected " + expected); 1014 //} 1015 //catch(ParseException e) { 1016 if (U_FAILURE(status)) 1017 errln((UnicodeString)"FAIL: Got exception"); 1018 //} 1019 } 1020 1021 // ------------------------------------- 1022 1023 /** 1024 * Test the formatting of time zones. 1025 */ 1026 void 1027 DateFormatTest::TestDateFormatZone061() 1028 { 1029 UErrorCode status = U_ZERO_ERROR; 1030 UDate date; 1031 DateFormat *formatter; 1032 date= 859248000000.0; 1033 logln((UnicodeString)"Date 1997/3/25 00:00 GMT: " + date); 1034 formatter = new SimpleDateFormat((UnicodeString)"dd-MMM-yyyyy HH:mm", Locale::getUK(), status); 1035 if(U_FAILURE(status)) { 1036 dataerrln("Failed creating SimpleDateFormat with %s. Quitting test", u_errorName(status)); 1037 delete formatter; 1038 return; 1039 } 1040 formatter->adoptTimeZone(TimeZone::createTimeZone("GMT")); 1041 UnicodeString temp; formatter->format(date, temp); 1042 logln((UnicodeString)"Formatted in GMT to: " + temp); 1043 //try { 1044 UDate tempDate = formatter->parse(temp, status); 1045 logln((UnicodeString)"Parsed to: " + dateToString(tempDate)); 1046 if (tempDate != date) errln((UnicodeString)"FAIL: Expected " + dateToString(date)); 1047 //} 1048 //catch(Throwable t) { 1049 if (U_FAILURE(status)) 1050 errln((UnicodeString)"Date Formatter throws: " + (int32_t)status); 1051 //} 1052 delete formatter; 1053 } 1054 1055 // ------------------------------------- 1056 1057 /** 1058 * Test the formatting of time zones. 1059 */ 1060 void 1061 DateFormatTest::TestDateFormatZone146() 1062 { 1063 TimeZone *saveDefault = TimeZone::createDefault(); 1064 1065 //try { 1066 TimeZone *thedefault = TimeZone::createTimeZone("GMT"); 1067 TimeZone::setDefault(*thedefault); 1068 // java.util.Locale.setDefault(new java.util.Locale("ar", "", "")); 1069 1070 // check to be sure... its GMT all right 1071 TimeZone *testdefault = TimeZone::createDefault(); 1072 UnicodeString testtimezone; 1073 testdefault->getID(testtimezone); 1074 if (testtimezone == "GMT") 1075 logln("Test timezone = " + testtimezone); 1076 else 1077 dataerrln("Test timezone should be GMT, not " + testtimezone); 1078 1079 UErrorCode status = U_ZERO_ERROR; 1080 // now try to use the default GMT time zone 1081 GregorianCalendar *greenwichcalendar = 1082 new GregorianCalendar(1997, 3, 4, 23, 0, status); 1083 if (U_FAILURE(status)) { 1084 dataerrln("Fail new GregorianCalendar: %s", u_errorName(status)); 1085 } else { 1086 //*****************************greenwichcalendar.setTimeZone(TimeZone.getDefault()); 1087 //greenwichcalendar.set(1997, 3, 4, 23, 0); 1088 // try anything to set hour to 23:00 !!! 1089 greenwichcalendar->set(UCAL_HOUR_OF_DAY, 23); 1090 // get time 1091 UDate greenwichdate = greenwichcalendar->getTime(status); 1092 // format every way 1093 UnicodeString DATA [] = { 1094 UnicodeString("simple format: "), UnicodeString("04/04/97 23:00 GMT"), 1095 UnicodeString("MM/dd/yy HH:mm z"), 1096 UnicodeString("full format: "), UnicodeString("Friday, April 4, 1997 11:00:00 o'clock PM GMT"), 1097 UnicodeString("EEEE, MMMM d, yyyy h:mm:ss 'o''clock' a z"), 1098 UnicodeString("long format: "), UnicodeString("April 4, 1997 11:00:00 PM GMT"), 1099 UnicodeString("MMMM d, yyyy h:mm:ss a z"), 1100 UnicodeString("default format: "), UnicodeString("04-Apr-97 11:00:00 PM"), 1101 UnicodeString("dd-MMM-yy h:mm:ss a"), 1102 UnicodeString("short format: "), UnicodeString("4/4/97 11:00 PM"), 1103 UnicodeString("M/d/yy h:mm a") 1104 }; 1105 int32_t DATA_length = (int32_t)(sizeof(DATA) / sizeof(DATA[0])); 1106 1107 for (int32_t i=0; i<DATA_length; i+=3) { 1108 DateFormat *fmt = new SimpleDateFormat(DATA[i+2], Locale::getEnglish(), status); 1109 if(failure(status, "new SimpleDateFormat")) break; 1110 fmt->setCalendar(*greenwichcalendar); 1111 UnicodeString result; 1112 result = fmt->format(greenwichdate, result); 1113 logln(DATA[i] + result); 1114 if (result != DATA[i+1]) 1115 errln("FAIL: Expected " + DATA[i+1] + ", got " + result); 1116 delete fmt; 1117 } 1118 } 1119 //} 1120 //finally { 1121 TimeZone::adoptDefault(saveDefault); 1122 //} 1123 delete testdefault; 1124 delete greenwichcalendar; 1125 delete thedefault; 1126 1127 1128 } 1129 1130 // ------------------------------------- 1131 1132 /** 1133 * Test the formatting of dates in different locales. 1134 */ 1135 void 1136 DateFormatTest::TestLocaleDateFormat() // Bug 495 1137 { 1138 UDate testDate = date(97, UCAL_SEPTEMBER, 15); 1139 DateFormat *dfFrench = DateFormat::createDateTimeInstance(DateFormat::FULL, 1140 DateFormat::FULL, Locale::getFrench()); 1141 DateFormat *dfUS = DateFormat::createDateTimeInstance(DateFormat::FULL, 1142 DateFormat::FULL, Locale::getUS()); 1143 UnicodeString expectedFRENCH ( "lundi 15 septembre 1997 00:00:00 heure avanc\\u00E9e du Pacifique", -1, US_INV ); 1144 expectedFRENCH = expectedFRENCH.unescape(); 1145 //UnicodeString expectedUS ( "Monday, September 15, 1997 12:00:00 o'clock AM PDT" ); 1146 UnicodeString expectedUS ( "Monday, September 15, 1997 12:00:00 AM Pacific Daylight Time" ); 1147 logln((UnicodeString)"Date set to : " + dateToString(testDate)); 1148 UnicodeString out; 1149 if (dfUS == NULL || dfFrench == NULL){ 1150 dataerrln("Error calling DateFormat::createDateTimeInstance)"); 1151 delete dfUS; 1152 delete dfFrench; 1153 return; 1154 } 1155 1156 dfFrench->format(testDate, out); 1157 logln((UnicodeString)"Date Formated with French Locale " + out); 1158 if (!(out == expectedFRENCH)) 1159 errln((UnicodeString)"FAIL: Expected " + expectedFRENCH); 1160 out.truncate(0); 1161 dfUS->format(testDate, out); 1162 logln((UnicodeString)"Date Formated with US Locale " + out); 1163 if (!(out == expectedUS)) 1164 errln((UnicodeString)"FAIL: Expected " + expectedUS); 1165 delete dfUS; 1166 delete dfFrench; 1167 } 1168 1169 /** 1170 * Test DateFormat(Calendar) API 1171 */ 1172 void DateFormatTest::TestDateFormatCalendar() { 1173 DateFormat *date=0, *time=0, *full=0; 1174 Calendar *cal=0; 1175 UnicodeString str; 1176 ParsePosition pos; 1177 UDate when; 1178 UErrorCode ec = U_ZERO_ERROR; 1179 1180 /* Create a formatter for date fields. */ 1181 date = DateFormat::createDateInstance(DateFormat::kShort, Locale::getUS()); 1182 if (date == NULL) { 1183 dataerrln("FAIL: createDateInstance failed"); 1184 goto FAIL; 1185 } 1186 1187 /* Create a formatter for time fields. */ 1188 time = DateFormat::createTimeInstance(DateFormat::kShort, Locale::getUS()); 1189 if (time == NULL) { 1190 errln("FAIL: createTimeInstance failed"); 1191 goto FAIL; 1192 } 1193 1194 /* Create a full format for output */ 1195 full = DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, 1196 Locale::getUS()); 1197 if (full == NULL) { 1198 errln("FAIL: createInstance failed"); 1199 goto FAIL; 1200 } 1201 1202 /* Create a calendar */ 1203 cal = Calendar::createInstance(Locale::getUS(), ec); 1204 if (cal == NULL || U_FAILURE(ec)) { 1205 errln((UnicodeString)"FAIL: Calendar::createInstance failed with " + 1206 u_errorName(ec)); 1207 goto FAIL; 1208 } 1209 1210 /* Parse the date */ 1211 cal->clear(); 1212 str = UnicodeString("4/5/2001", ""); 1213 pos.setIndex(0); 1214 date->parse(str, *cal, pos); 1215 if (pos.getIndex() != str.length()) { 1216 errln((UnicodeString)"FAIL: DateFormat::parse(4/5/2001) failed at " + 1217 pos.getIndex()); 1218 goto FAIL; 1219 } 1220 1221 /* Parse the time */ 1222 str = UnicodeString("5:45 PM", ""); 1223 pos.setIndex(0); 1224 time->parse(str, *cal, pos); 1225 if (pos.getIndex() != str.length()) { 1226 errln((UnicodeString)"FAIL: DateFormat::parse(17:45) failed at " + 1227 pos.getIndex()); 1228 goto FAIL; 1229 } 1230 1231 /* Check result */ 1232 when = cal->getTime(ec); 1233 if (U_FAILURE(ec)) { 1234 errln((UnicodeString)"FAIL: cal->getTime() failed with " + u_errorName(ec)); 1235 goto FAIL; 1236 } 1237 str.truncate(0); 1238 full->format(when, str); 1239 // Thursday, April 5, 2001 5:45:00 PM PDT 986517900000 1240 if (when == 986517900000.0) { 1241 logln("Ok: Parsed result: " + str); 1242 } else { 1243 errln("FAIL: Parsed result: " + str + ", exp 4/5/2001 5:45 PM"); 1244 } 1245 1246 FAIL: 1247 delete date; 1248 delete time; 1249 delete full; 1250 delete cal; 1251 } 1252 1253 /** 1254 * Test DateFormat's parsing of space characters. See jitterbug 1916. 1255 */ 1256 void DateFormatTest::TestSpaceParsing() { 1257 const char* DATA[] = { 1258 "yyyy MM dd HH:mm:ss", 1259 1260 // pattern, input, expected parse or NULL if expect parse failure 1261 "MMMM d yy", " 04 05 06", "2006 04 05 00:00:00", 1262 NULL, "04 05 06", "2006 04 05 00:00:00", 1263 1264 "MM d yy", " 04 05 06", "2006 04 05 00:00:00", 1265 NULL, "04 05 06", "2006 04 05 00:00:00", 1266 NULL, "04/05/06", "2006 04 05 00:00:00", 1267 NULL, "04-05-06", "2006 04 05 00:00:00", 1268 NULL, "04.05.06", "2006 04 05 00:00:00", 1269 NULL, "04 / 05 / 06", "2006 04 05 00:00:00", 1270 NULL, "Apr / 05/ 06", "2006 04 05 00:00:00", 1271 NULL, "Apr-05-06", "2006 04 05 00:00:00", 1272 NULL, "Apr 05, 2006", "2006 04 05 00:00:00", 1273 1274 "MMMM d yy", " Apr 05 06", "2006 04 05 00:00:00", 1275 NULL, "Apr 05 06", "2006 04 05 00:00:00", 1276 NULL, "Apr05 06", "2006 04 05 00:00:00", 1277 1278 "hh:mm:ss a", "12:34:56 PM", "1970 01 01 12:34:56", 1279 NULL, "12:34:56PM", "1970 01 01 12:34:56", 1280 NULL, "12.34.56PM", "1970 01 01 12:34:56", 1281 NULL, "12-34-56 PM", "1970 01 01 12:34:56", 1282 NULL, "12 : 34 : 56 PM", "1970 01 01 12:34:56", 1283 1284 "MM d yy 'at' hh:mm:ss a", "04/05/06 12:34:56 PM", "2006 04 05 12:34:56", 1285 1286 "MMMM dd yyyy hh:mm a", "September 27, 1964 21:56 PM", "1964 09 28 09:56:00", 1287 NULL, "November 4, 2008 0:13 AM", "2008 11 04 00:13:00", 1288 1289 "HH'h'mm'min'ss's'", "12h34min56s", "1970 01 01 12:34:56", 1290 NULL, "12h34mi56s", "1970 01 01 12:34:56", 1291 NULL, "12h34m56s", "1970 01 01 12:34:56", 1292 NULL, "12:34:56", "1970 01 01 12:34:56" 1293 }; 1294 const int32_t DATA_len = sizeof(DATA)/sizeof(DATA[0]); 1295 1296 expectParse(DATA, DATA_len, Locale("en")); 1297 } 1298 1299 /** 1300 * Test handling of "HHmmss" pattern. 1301 */ 1302 void DateFormatTest::TestExactCountFormat() { 1303 const char* DATA[] = { 1304 "yyyy MM dd HH:mm:ss", 1305 1306 // pattern, input, expected parse or NULL if expect parse failure 1307 "HHmmss", "123456", "1970 01 01 12:34:56", 1308 NULL, "12345", "1970 01 01 01:23:45", 1309 NULL, "1234", NULL, 1310 NULL, "00-05", NULL, 1311 NULL, "12-34", NULL, 1312 NULL, "00+05", NULL, 1313 "ahhmm", "PM730", "1970 01 01 19:30:00", 1314 }; 1315 const int32_t DATA_len = sizeof(DATA)/sizeof(DATA[0]); 1316 1317 expectParse(DATA, DATA_len, Locale("en")); 1318 } 1319 1320 /** 1321 * Test handling of white space. 1322 */ 1323 void DateFormatTest::TestWhiteSpaceParsing() { 1324 const char* DATA[] = { 1325 "yyyy MM dd", 1326 1327 // pattern, input, expected parse or null if expect parse failure 1328 1329 // Pattern space run should parse input text space run 1330 "MM d yy", " 04 01 03", "2003 04 01", 1331 NULL, " 04 01 03 ", "2003 04 01", 1332 }; 1333 const int32_t DATA_len = sizeof(DATA)/sizeof(DATA[0]); 1334 1335 expectParse(DATA, DATA_len, Locale("en")); 1336 } 1337 1338 1339 void DateFormatTest::TestInvalidPattern() { 1340 UErrorCode ec = U_ZERO_ERROR; 1341 SimpleDateFormat f(UnicodeString("Yesterday"), ec); 1342 if (U_FAILURE(ec)) { 1343 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(ec)); 1344 return; 1345 } 1346 UnicodeString out; 1347 FieldPosition pos; 1348 f.format((UDate)0, out, pos); 1349 logln(out); 1350 // The bug is that the call to format() will crash. By not 1351 // crashing, the test passes. 1352 } 1353 1354 void DateFormatTest::TestGreekMay() { 1355 UErrorCode ec = U_ZERO_ERROR; 1356 UDate date = -9896080848000.0; 1357 SimpleDateFormat fmt("EEEE, dd MMMM yyyy h:mm:ss a", Locale("el", "", ""), ec); 1358 if (U_FAILURE(ec)) { 1359 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(ec)); 1360 return; 1361 } 1362 UnicodeString str; 1363 fmt.format(date, str); 1364 ParsePosition pos(0); 1365 UDate d2 = fmt.parse(str, pos); 1366 if (date != d2) { 1367 errln("FAIL: unable to parse strings where case-folding changes length"); 1368 } 1369 } 1370 1371 void DateFormatTest::TestStandAloneMonths() 1372 { 1373 const char *EN_DATA[] = { 1374 "yyyy MM dd HH:mm:ss", 1375 1376 "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", 1377 "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", 1378 "yyyy LLLL dd H:mm:ss", "F", "2004 03 10 16:36:31", "2004 March 10 16:36:31", 1379 "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", 1380 1381 "LLLL", "fp", "1970 01 01 0:00:00", "January", "1970 01 01 0:00:00", 1382 "LLLL", "fp", "1970 02 01 0:00:00", "February", "1970 02 01 0:00:00", 1383 "LLLL", "fp", "1970 03 01 0:00:00", "March", "1970 03 01 0:00:00", 1384 "LLLL", "fp", "1970 04 01 0:00:00", "April", "1970 04 01 0:00:00", 1385 "LLLL", "fp", "1970 05 01 0:00:00", "May", "1970 05 01 0:00:00", 1386 "LLLL", "fp", "1970 06 01 0:00:00", "June", "1970 06 01 0:00:00", 1387 "LLLL", "fp", "1970 07 01 0:00:00", "July", "1970 07 01 0:00:00", 1388 "LLLL", "fp", "1970 08 01 0:00:00", "August", "1970 08 01 0:00:00", 1389 "LLLL", "fp", "1970 09 01 0:00:00", "September", "1970 09 01 0:00:00", 1390 "LLLL", "fp", "1970 10 01 0:00:00", "October", "1970 10 01 0:00:00", 1391 "LLLL", "fp", "1970 11 01 0:00:00", "November", "1970 11 01 0:00:00", 1392 "LLLL", "fp", "1970 12 01 0:00:00", "December", "1970 12 01 0:00:00", 1393 1394 "LLL", "fp", "1970 01 01 0:00:00", "Jan", "1970 01 01 0:00:00", 1395 "LLL", "fp", "1970 02 01 0:00:00", "Feb", "1970 02 01 0:00:00", 1396 "LLL", "fp", "1970 03 01 0:00:00", "Mar", "1970 03 01 0:00:00", 1397 "LLL", "fp", "1970 04 01 0:00:00", "Apr", "1970 04 01 0:00:00", 1398 "LLL", "fp", "1970 05 01 0:00:00", "May", "1970 05 01 0:00:00", 1399 "LLL", "fp", "1970 06 01 0:00:00", "Jun", "1970 06 01 0:00:00", 1400 "LLL", "fp", "1970 07 01 0:00:00", "Jul", "1970 07 01 0:00:00", 1401 "LLL", "fp", "1970 08 01 0:00:00", "Aug", "1970 08 01 0:00:00", 1402 "LLL", "fp", "1970 09 01 0:00:00", "Sep", "1970 09 01 0:00:00", 1403 "LLL", "fp", "1970 10 01 0:00:00", "Oct", "1970 10 01 0:00:00", 1404 "LLL", "fp", "1970 11 01 0:00:00", "Nov", "1970 11 01 0:00:00", 1405 "LLL", "fp", "1970 12 01 0:00:00", "Dec", "1970 12 01 0:00:00", 1406 }; 1407 1408 const char *CS_DATA[] = { 1409 "yyyy MM dd HH:mm:ss", 1410 1411 "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", 1412 "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", 1413 "yyyy LLL dd H:mm:ss", "fp", "2004 04 10 16:36:31", "2004 4. 10 16:36:31", "2004 04 10 16:36:31", 1414 "yyyy LLLL dd H:mm:ss", "F", "2004 04 10 16:36:31", "2004 duben 10 16:36:31", 1415 "yyyy MMMM dd H:mm:ss", "F", "2004 04 10 16:36:31", "2004 dubna 10 16:36:31", 1416 "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", 1417 "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", 1418 1419 "LLLL", "fp", "1970 01 01 0:00:00", "leden", "1970 01 01 0:00:00", 1420 "LLLL", "fp", "1970 02 01 0:00:00", "\\u00FAnor", "1970 02 01 0:00:00", 1421 "LLLL", "fp", "1970 03 01 0:00:00", "b\\u0159ezen", "1970 03 01 0:00:00", 1422 "LLLL", "fp", "1970 04 01 0:00:00", "duben", "1970 04 01 0:00:00", 1423 "LLLL", "fp", "1970 05 01 0:00:00", "kv\\u011Bten", "1970 05 01 0:00:00", 1424 "LLLL", "fp", "1970 06 01 0:00:00", "\\u010Derven", "1970 06 01 0:00:00", 1425 "LLLL", "fp", "1970 07 01 0:00:00", "\\u010Dervenec", "1970 07 01 0:00:00", 1426 "LLLL", "fp", "1970 08 01 0:00:00", "srpen", "1970 08 01 0:00:00", 1427 "LLLL", "fp", "1970 09 01 0:00:00", "z\\u00E1\\u0159\\u00ED", "1970 09 01 0:00:00", 1428 "LLLL", "fp", "1970 10 01 0:00:00", "\\u0159\\u00EDjen", "1970 10 01 0:00:00", 1429 "LLLL", "fp", "1970 11 01 0:00:00", "listopad", "1970 11 01 0:00:00", 1430 "LLLL", "fp", "1970 12 01 0:00:00", "prosinec", "1970 12 01 0:00:00", 1431 1432 "LLL", "fp", "1970 01 01 0:00:00", "1.", "1970 01 01 0:00:00", 1433 "LLL", "fp", "1970 02 01 0:00:00", "2.", "1970 02 01 0:00:00", 1434 "LLL", "fp", "1970 03 01 0:00:00", "3.", "1970 03 01 0:00:00", 1435 "LLL", "fp", "1970 04 01 0:00:00", "4.", "1970 04 01 0:00:00", 1436 "LLL", "fp", "1970 05 01 0:00:00", "5.", "1970 05 01 0:00:00", 1437 "LLL", "fp", "1970 06 01 0:00:00", "6.", "1970 06 01 0:00:00", 1438 "LLL", "fp", "1970 07 01 0:00:00", "7.", "1970 07 01 0:00:00", 1439 "LLL", "fp", "1970 08 01 0:00:00", "8.", "1970 08 01 0:00:00", 1440 "LLL", "fp", "1970 09 01 0:00:00", "9.", "1970 09 01 0:00:00", 1441 "LLL", "fp", "1970 10 01 0:00:00", "10.", "1970 10 01 0:00:00", 1442 "LLL", "fp", "1970 11 01 0:00:00", "11.", "1970 11 01 0:00:00", 1443 "LLL", "fp", "1970 12 01 0:00:00", "12.", "1970 12 01 0:00:00", 1444 }; 1445 1446 expect(EN_DATA, ARRAY_SIZE(EN_DATA), Locale("en", "", "")); 1447 expect(CS_DATA, ARRAY_SIZE(CS_DATA), Locale("cs", "", "")); 1448 } 1449 1450 void DateFormatTest::TestStandAloneDays() 1451 { 1452 const char *EN_DATA[] = { 1453 "yyyy MM dd HH:mm:ss", 1454 1455 "cccc", "fp", "1970 01 04 0:00:00", "Sunday", "1970 01 04 0:00:00", 1456 "cccc", "fp", "1970 01 05 0:00:00", "Monday", "1970 01 05 0:00:00", 1457 "cccc", "fp", "1970 01 06 0:00:00", "Tuesday", "1970 01 06 0:00:00", 1458 "cccc", "fp", "1970 01 07 0:00:00", "Wednesday", "1970 01 07 0:00:00", 1459 "cccc", "fp", "1970 01 01 0:00:00", "Thursday", "1970 01 01 0:00:00", 1460 "cccc", "fp", "1970 01 02 0:00:00", "Friday", "1970 01 02 0:00:00", 1461 "cccc", "fp", "1970 01 03 0:00:00", "Saturday", "1970 01 03 0:00:00", 1462 1463 "ccc", "fp", "1970 01 04 0:00:00", "Sun", "1970 01 04 0:00:00", 1464 "ccc", "fp", "1970 01 05 0:00:00", "Mon", "1970 01 05 0:00:00", 1465 "ccc", "fp", "1970 01 06 0:00:00", "Tue", "1970 01 06 0:00:00", 1466 "ccc", "fp", "1970 01 07 0:00:00", "Wed", "1970 01 07 0:00:00", 1467 "ccc", "fp", "1970 01 01 0:00:00", "Thu", "1970 01 01 0:00:00", 1468 "ccc", "fp", "1970 01 02 0:00:00", "Fri", "1970 01 02 0:00:00", 1469 "ccc", "fp", "1970 01 03 0:00:00", "Sat", "1970 01 03 0:00:00", 1470 }; 1471 1472 const char *CS_DATA[] = { 1473 "yyyy MM dd HH:mm:ss", 1474 1475 "cccc", "fp", "1970 01 04 0:00:00", "ned\\u011Ble", "1970 01 04 0:00:00", 1476 "cccc", "fp", "1970 01 05 0:00:00", "pond\\u011Bl\\u00ED", "1970 01 05 0:00:00", 1477 "cccc", "fp", "1970 01 06 0:00:00", "\\u00FAter\\u00FD", "1970 01 06 0:00:00", 1478 "cccc", "fp", "1970 01 07 0:00:00", "st\\u0159eda", "1970 01 07 0:00:00", 1479 "cccc", "fp", "1970 01 01 0:00:00", "\\u010Dtvrtek", "1970 01 01 0:00:00", 1480 "cccc", "fp", "1970 01 02 0:00:00", "p\\u00E1tek", "1970 01 02 0:00:00", 1481 "cccc", "fp", "1970 01 03 0:00:00", "sobota", "1970 01 03 0:00:00", 1482 1483 "ccc", "fp", "1970 01 04 0:00:00", "ne", "1970 01 04 0:00:00", 1484 "ccc", "fp", "1970 01 05 0:00:00", "po", "1970 01 05 0:00:00", 1485 "ccc", "fp", "1970 01 06 0:00:00", "\\u00FAt", "1970 01 06 0:00:00", 1486 "ccc", "fp", "1970 01 07 0:00:00", "st", "1970 01 07 0:00:00", 1487 "ccc", "fp", "1970 01 01 0:00:00", "\\u010Dt", "1970 01 01 0:00:00", 1488 "ccc", "fp", "1970 01 02 0:00:00", "p\\u00E1", "1970 01 02 0:00:00", 1489 "ccc", "fp", "1970 01 03 0:00:00", "so", "1970 01 03 0:00:00", 1490 }; 1491 1492 expect(EN_DATA, ARRAY_SIZE(EN_DATA), Locale("en", "", "")); 1493 expect(CS_DATA, ARRAY_SIZE(CS_DATA), Locale("cs", "", "")); 1494 } 1495 1496 void DateFormatTest::TestNarrowNames() 1497 { 1498 const char *EN_DATA[] = { 1499 "yyyy MM dd HH:mm:ss", 1500 1501 "yyyy MMMMM dd H:mm:ss", "2004 03 10 16:36:31", "2004 M 10 16:36:31", 1502 "yyyy LLLLL dd H:mm:ss", "2004 03 10 16:36:31", "2004 M 10 16:36:31", 1503 1504 "MMMMM", "1970 01 01 0:00:00", "J", 1505 "MMMMM", "1970 02 01 0:00:00", "F", 1506 "MMMMM", "1970 03 01 0:00:00", "M", 1507 "MMMMM", "1970 04 01 0:00:00", "A", 1508 "MMMMM", "1970 05 01 0:00:00", "M", 1509 "MMMMM", "1970 06 01 0:00:00", "J", 1510 "MMMMM", "1970 07 01 0:00:00", "J", 1511 "MMMMM", "1970 08 01 0:00:00", "A", 1512 "MMMMM", "1970 09 01 0:00:00", "S", 1513 "MMMMM", "1970 10 01 0:00:00", "O", 1514 "MMMMM", "1970 11 01 0:00:00", "N", 1515 "MMMMM", "1970 12 01 0:00:00", "D", 1516 1517 "LLLLL", "1970 01 01 0:00:00", "J", 1518 "LLLLL", "1970 02 01 0:00:00", "F", 1519 "LLLLL", "1970 03 01 0:00:00", "M", 1520 "LLLLL", "1970 04 01 0:00:00", "A", 1521 "LLLLL", "1970 05 01 0:00:00", "M", 1522 "LLLLL", "1970 06 01 0:00:00", "J", 1523 "LLLLL", "1970 07 01 0:00:00", "J", 1524 "LLLLL", "1970 08 01 0:00:00", "A", 1525 "LLLLL", "1970 09 01 0:00:00", "S", 1526 "LLLLL", "1970 10 01 0:00:00", "O", 1527 "LLLLL", "1970 11 01 0:00:00", "N", 1528 "LLLLL", "1970 12 01 0:00:00", "D", 1529 1530 "EEEEE", "1970 01 04 0:00:00", "S", 1531 "EEEEE", "1970 01 05 0:00:00", "M", 1532 "EEEEE", "1970 01 06 0:00:00", "T", 1533 "EEEEE", "1970 01 07 0:00:00", "W", 1534 "EEEEE", "1970 01 01 0:00:00", "T", 1535 "EEEEE", "1970 01 02 0:00:00", "F", 1536 "EEEEE", "1970 01 03 0:00:00", "S", 1537 1538 "ccccc", "1970 01 04 0:00:00", "S", 1539 "ccccc", "1970 01 05 0:00:00", "M", 1540 "ccccc", "1970 01 06 0:00:00", "T", 1541 "ccccc", "1970 01 07 0:00:00", "W", 1542 "ccccc", "1970 01 01 0:00:00", "T", 1543 "ccccc", "1970 01 02 0:00:00", "F", 1544 "ccccc", "1970 01 03 0:00:00", "S", 1545 }; 1546 1547 const char *CS_DATA[] = { 1548 "yyyy MM dd HH:mm:ss", 1549 1550 "yyyy LLLLL dd H:mm:ss", "2004 04 10 16:36:31", "2004 d 10 16:36:31", 1551 "yyyy MMMMM dd H:mm:ss", "2004 04 10 16:36:31", "2004 4 10 16:36:31", 1552 1553 "MMMMM", "1970 01 01 0:00:00", "1", 1554 "MMMMM", "1970 02 01 0:00:00", "2", 1555 "MMMMM", "1970 03 01 0:00:00", "3", 1556 "MMMMM", "1970 04 01 0:00:00", "4", 1557 "MMMMM", "1970 05 01 0:00:00", "5", 1558 "MMMMM", "1970 06 01 0:00:00", "6", 1559 "MMMMM", "1970 07 01 0:00:00", "7", 1560 "MMMMM", "1970 08 01 0:00:00", "8", 1561 "MMMMM", "1970 09 01 0:00:00", "9", 1562 "MMMMM", "1970 10 01 0:00:00", "10", 1563 "MMMMM", "1970 11 01 0:00:00", "11", 1564 "MMMMM", "1970 12 01 0:00:00", "12", 1565 1566 "LLLLL", "1970 01 01 0:00:00", "l", 1567 "LLLLL", "1970 02 01 0:00:00", "\\u00FA", 1568 "LLLLL", "1970 03 01 0:00:00", "b", 1569 "LLLLL", "1970 04 01 0:00:00", "d", 1570 "LLLLL", "1970 05 01 0:00:00", "k", 1571 "LLLLL", "1970 06 01 0:00:00", "\\u010D", 1572 "LLLLL", "1970 07 01 0:00:00", "\\u010D", 1573 "LLLLL", "1970 08 01 0:00:00", "s", 1574 "LLLLL", "1970 09 01 0:00:00", "z", 1575 "LLLLL", "1970 10 01 0:00:00", "\\u0159", 1576 "LLLLL", "1970 11 01 0:00:00", "l", 1577 "LLLLL", "1970 12 01 0:00:00", "p", 1578 1579 "EEEEE", "1970 01 04 0:00:00", "N", 1580 "EEEEE", "1970 01 05 0:00:00", "P", 1581 "EEEEE", "1970 01 06 0:00:00", "\\u00DA", 1582 "EEEEE", "1970 01 07 0:00:00", "S", 1583 "EEEEE", "1970 01 01 0:00:00", "\\u010C", 1584 "EEEEE", "1970 01 02 0:00:00", "P", 1585 "EEEEE", "1970 01 03 0:00:00", "S", 1586 1587 "ccccc", "1970 01 04 0:00:00", "N", 1588 "ccccc", "1970 01 05 0:00:00", "P", 1589 "ccccc", "1970 01 06 0:00:00", "\\u00DA", 1590 "ccccc", "1970 01 07 0:00:00", "S", 1591 "ccccc", "1970 01 01 0:00:00", "\\u010C", 1592 "ccccc", "1970 01 02 0:00:00", "P", 1593 "ccccc", "1970 01 03 0:00:00", "S", 1594 }; 1595 1596 expectFormat(EN_DATA, ARRAY_SIZE(EN_DATA), Locale("en", "", "")); 1597 expectFormat(CS_DATA, ARRAY_SIZE(CS_DATA), Locale("cs", "", "")); 1598 } 1599 1600 void DateFormatTest::TestEras() 1601 { 1602 const char *EN_DATA[] = { 1603 "yyyy MM dd", 1604 1605 "MMMM dd yyyy G", "fp", "1951 07 17", "July 17 1951 AD", "1951 07 17", 1606 "MMMM dd yyyy GG", "fp", "1951 07 17", "July 17 1951 AD", "1951 07 17", 1607 "MMMM dd yyyy GGG", "fp", "1951 07 17", "July 17 1951 AD", "1951 07 17", 1608 "MMMM dd yyyy GGGG", "fp", "1951 07 17", "July 17 1951 Anno Domini", "1951 07 17", 1609 1610 "MMMM dd yyyy G", "fp", "-438 07 17", "July 17 0439 BC", "-438 07 17", 1611 "MMMM dd yyyy GG", "fp", "-438 07 17", "July 17 0439 BC", "-438 07 17", 1612 "MMMM dd yyyy GGG", "fp", "-438 07 17", "July 17 0439 BC", "-438 07 17", 1613 "MMMM dd yyyy GGGG", "fp", "-438 07 17", "July 17 0439 Before Christ", "-438 07 17", 1614 }; 1615 1616 expect(EN_DATA, ARRAY_SIZE(EN_DATA), Locale("en", "", "")); 1617 } 1618 1619 void DateFormatTest::TestQuarters() 1620 { 1621 const char *EN_DATA[] = { 1622 "yyyy MM dd", 1623 1624 "Q", "fp", "1970 01 01", "1", "1970 01 01", 1625 "QQ", "fp", "1970 04 01", "02", "1970 04 01", 1626 "QQQ", "fp", "1970 07 01", "Q3", "1970 07 01", 1627 "QQQQ", "fp", "1970 10 01", "4th quarter", "1970 10 01", 1628 1629 "q", "fp", "1970 01 01", "1", "1970 01 01", 1630 "qq", "fp", "1970 04 01", "02", "1970 04 01", 1631 "qqq", "fp", "1970 07 01", "Q3", "1970 07 01", 1632 "qqqq", "fp", "1970 10 01", "4th quarter", "1970 10 01", 1633 }; 1634 1635 expect(EN_DATA, ARRAY_SIZE(EN_DATA), Locale("en", "", "")); 1636 } 1637 1638 /** 1639 * Test parsing. Input is an array that starts with the following 1640 * header: 1641 * 1642 * [0] = pattern string to parse [i+2] with 1643 * 1644 * followed by test cases, each of which is 3 array elements: 1645 * 1646 * [i] = pattern, or NULL to reuse prior pattern 1647 * [i+1] = input string 1648 * [i+2] = expected parse result (parsed with pattern [0]) 1649 * 1650 * If expect parse failure, then [i+2] should be NULL. 1651 */ 1652 void DateFormatTest::expectParse(const char** data, int32_t data_length, 1653 const Locale& loc) { 1654 const UDate FAIL = (UDate) -1; 1655 const UnicodeString FAIL_STR("parse failure"); 1656 int32_t i = 0; 1657 1658 UErrorCode ec = U_ZERO_ERROR; 1659 SimpleDateFormat fmt("", loc, ec); 1660 SimpleDateFormat ref(data[i++], loc, ec); 1661 SimpleDateFormat gotfmt("G yyyy MM dd HH:mm:ss z", loc, ec); 1662 if (U_FAILURE(ec)) { 1663 dataerrln("FAIL: SimpleDateFormat constructor - %s", u_errorName(ec)); 1664 return; 1665 } 1666 1667 const char* currentPat = NULL; 1668 while (i<data_length) { 1669 const char* pattern = data[i++]; 1670 const char* input = data[i++]; 1671 const char* expected = data[i++]; 1672 1673 ec = U_ZERO_ERROR; 1674 if (pattern != NULL) { 1675 fmt.applyPattern(pattern); 1676 currentPat = pattern; 1677 } 1678 UDate got = fmt.parse(input, ec); 1679 UnicodeString gotstr(FAIL_STR); 1680 if (U_FAILURE(ec)) { 1681 got = FAIL; 1682 } else { 1683 gotstr.remove(); 1684 gotfmt.format(got, gotstr); 1685 } 1686 1687 UErrorCode ec2 = U_ZERO_ERROR; 1688 UDate exp = FAIL; 1689 UnicodeString expstr(FAIL_STR); 1690 if (expected != NULL) { 1691 expstr = expected; 1692 exp = ref.parse(expstr, ec2); 1693 if (U_FAILURE(ec2)) { 1694 // This only happens if expected is in wrong format -- 1695 // should never happen once test is debugged. 1696 errln("FAIL: Internal test error"); 1697 return; 1698 } 1699 } 1700 1701 if (got == exp) { 1702 logln((UnicodeString)"Ok: " + input + " x " + 1703 currentPat + " => " + gotstr); 1704 } else { 1705 errln((UnicodeString)"FAIL: " + input + " x " + 1706 currentPat + " => " + gotstr + ", expected " + 1707 expstr); 1708 } 1709 } 1710 } 1711 1712 /** 1713 * Test formatting and parsing. Input is an array that starts 1714 * with the following header: 1715 * 1716 * [0] = pattern string to parse [i+2] with 1717 * 1718 * followed by test cases, each of which is 3 array elements: 1719 * 1720 * [i] = pattern, or null to reuse prior pattern 1721 * [i+1] = control string, either "fp", "pf", or "F". 1722 * [i+2..] = data strings 1723 * 1724 * The number of data strings depends on the control string. 1725 * Examples: 1726 * 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", 1727 * 'f': Format date [i+2] (as parsed using pattern [0]) and expect string [i+3]. 1728 * 'p': Parse string [i+3] and expect date [i+4]. 1729 * 1730 * 2. "y/M/d H:mm:ss.SSS", "F", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.567" 1731 * 'F': Format date [i+2] and expect string [i+3], 1732 * then parse string [i+3] and expect date [i+2]. 1733 * 1734 * 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", 1735 * 'p': Parse string [i+2] and expect date [i+3]. 1736 * 'f': Format date [i+3] and expect string [i+4]. 1737 */ 1738 void DateFormatTest::expect(const char** data, int32_t data_length, 1739 const Locale& loc) { 1740 int32_t i = 0; 1741 UErrorCode ec = U_ZERO_ERROR; 1742 UnicodeString str, str2; 1743 SimpleDateFormat fmt("", loc, ec); 1744 SimpleDateFormat ref(data[i++], loc, ec); 1745 SimpleDateFormat univ("EE G yyyy MM dd HH:mm:ss.SSS z", loc, ec); 1746 if (U_FAILURE(ec)) { 1747 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(ec)); 1748 return; 1749 } 1750 1751 UnicodeString currentPat; 1752 while (i<data_length) { 1753 const char* pattern = data[i++]; 1754 if (pattern != NULL) { 1755 fmt.applyPattern(pattern); 1756 currentPat = pattern; 1757 } 1758 1759 const char* control = data[i++]; 1760 1761 if (uprv_strcmp(control, "fp") == 0) { 1762 // 'f' 1763 const char* datestr = data[i++]; 1764 const char* string = data[i++]; 1765 UDate date = ref.parse(ctou(datestr), ec); 1766 if (!assertSuccess("parse", ec)) return; 1767 assertEquals((UnicodeString)"\"" + currentPat + "\".format(" + datestr + ")", 1768 ctou(string), 1769 fmt.format(date, str.remove())); 1770 // 'p' 1771 datestr = data[i++]; 1772 date = ref.parse(ctou(datestr), ec); 1773 if (!assertSuccess("parse", ec)) return; 1774 UDate parsedate = fmt.parse(ctou(string), ec); 1775 if (assertSuccess((UnicodeString)"\"" + currentPat + "\".parse(" + string + ")", ec)) { 1776 assertEquals((UnicodeString)"\"" + currentPat + "\".parse(" + string + ")", 1777 univ.format(date, str.remove()), 1778 univ.format(parsedate, str2.remove())); 1779 } 1780 } 1781 1782 else if (uprv_strcmp(control, "pf") == 0) { 1783 // 'p' 1784 const char* string = data[i++]; 1785 const char* datestr = data[i++]; 1786 UDate date = ref.parse(ctou(datestr), ec); 1787 if (!assertSuccess("parse", ec)) return; 1788 UDate parsedate = fmt.parse(ctou(string), ec); 1789 if (assertSuccess((UnicodeString)"\"" + currentPat + "\".parse(" + string + ")", ec)) { 1790 assertEquals((UnicodeString)"\"" + currentPat + "\".parse(" + string + ")", 1791 univ.format(date, str.remove()), 1792 univ.format(parsedate, str2.remove())); 1793 } 1794 // 'f' 1795 string = data[i++]; 1796 assertEquals((UnicodeString)"\"" + currentPat + "\".format(" + datestr + ")", 1797 ctou(string), 1798 fmt.format(date, str.remove())); 1799 } 1800 1801 else if (uprv_strcmp(control, "F") == 0) { 1802 const char* datestr = data[i++]; 1803 const char* string = data[i++]; 1804 UDate date = ref.parse(ctou(datestr), ec); 1805 if (!assertSuccess("parse", ec)) return; 1806 assertEquals((UnicodeString)"\"" + currentPat + "\".format(" + datestr + ")", 1807 ctou(string), 1808 fmt.format(date, str.remove())); 1809 1810 UDate parsedate = fmt.parse(string, ec); 1811 if (assertSuccess((UnicodeString)"\"" + currentPat + "\".parse(" + string + ")", ec)) { 1812 assertEquals((UnicodeString)"\"" + currentPat + "\".parse(" + string + ")", 1813 univ.format(date, str.remove()), 1814 univ.format(parsedate, str2.remove())); 1815 } 1816 } 1817 1818 else { 1819 errln((UnicodeString)"FAIL: Invalid control string " + control); 1820 return; 1821 } 1822 } 1823 } 1824 1825 /** 1826 * Test formatting. Input is an array that starts 1827 * with the following header: 1828 * 1829 * [0] = pattern string to parse [i+2] with 1830 * 1831 * followed by test cases, each of which is 3 array elements: 1832 * 1833 * [i] = pattern, or null to reuse prior pattern 1834 * [i+1] = data string a 1835 * [i+2] = data string b 1836 * 1837 * Examples: 1838 * Format date [i+1] and expect string [i+2]. 1839 * 1840 * "y/M/d H:mm:ss.SSSS", "2004/3/10 16:36:31.5679", "2004 03 10 16:36:31.567" 1841 */ 1842 void DateFormatTest::expectFormat(const char** data, int32_t data_length, 1843 const Locale& loc) { 1844 int32_t i = 0; 1845 UErrorCode ec = U_ZERO_ERROR; 1846 UnicodeString str, str2; 1847 SimpleDateFormat fmt("", loc, ec); 1848 SimpleDateFormat ref(data[i++], loc, ec); 1849 SimpleDateFormat univ("EE G yyyy MM dd HH:mm:ss.SSS z", loc, ec); 1850 if (U_FAILURE(ec)) { 1851 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(ec)); 1852 return; 1853 } 1854 1855 UnicodeString currentPat; 1856 1857 while (i<data_length) { 1858 const char* pattern = data[i++]; 1859 if (pattern != NULL) { 1860 fmt.applyPattern(pattern); 1861 currentPat = pattern; 1862 } 1863 1864 const char* datestr = data[i++]; 1865 const char* string = data[i++]; 1866 UDate date = ref.parse(ctou(datestr), ec); 1867 if (!assertSuccess("parse", ec)) return; 1868 assertEquals((UnicodeString)"\"" + currentPat + "\".format(" + datestr + ")", 1869 ctou(string), 1870 fmt.format(date, str.remove())); 1871 } 1872 } 1873 1874 void DateFormatTest::TestGenericTime() { 1875 const Locale en("en"); 1876 // Note: We no longer parse strings in different styles. 1877 /* 1878 const char* ZDATA[] = { 1879 "yyyy MM dd HH:mm zzz", 1880 // round trip 1881 "y/M/d H:mm zzzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Standard Time", 1882 "y/M/d H:mm zzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PST", 1883 "y/M/d H:mm vvvv", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Time", 1884 "y/M/d H:mm v", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PT", 1885 // non-generic timezone string influences dst offset even if wrong for date/time 1886 "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", 1887 "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", 1888 "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", 1889 "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", 1890 // generic timezone generates dst offset appropriate for local time 1891 "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", 1892 "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", 1893 "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", 1894 "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", 1895 // daylight savings time transition edge cases. 1896 // time to parse does not really exist, PT interpreted as earlier time 1897 "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", 1898 "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", 1899 "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", 1900 "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", 1901 "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", 1902 "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", 1903 "y/M/d H:mm", "pf", "2005/4/3 2:30", "2005 04 03 03:30 PDT", "2005/4/3 3:30", 1904 // time to parse is ambiguous, PT interpreted as later time 1905 "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", 1906 "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", 1907 "y/M/d H:mm", "pf", "2005/10/30 1:30 PT", "2005 10 30 01:30 PST", "2005/10/30 1:30", 1908 1909 "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", 1910 "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", 1911 "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", 1912 "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", 1913 "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", 1914 "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", 1915 "y/M/d H:mm", "pf", "2004/10/31 1:30", "2004 10 31 01:30 PST", "2004/10/31 1:30", 1916 }; 1917 */ 1918 const char* ZDATA[] = { 1919 "yyyy MM dd HH:mm zzz", 1920 // round trip 1921 "y/M/d H:mm zzzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Standard Time", 1922 "y/M/d H:mm zzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PST", 1923 "y/M/d H:mm vvvv", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Time", 1924 "y/M/d H:mm v", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PT", 1925 // non-generic timezone string influences dst offset even if wrong for date/time 1926 "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", 1927 "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", 1928 // generic timezone generates dst offset appropriate for local time 1929 "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", 1930 "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", 1931 "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", 1932 "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", 1933 // daylight savings time transition edge cases. 1934 // time to parse does not really exist, PT interpreted as earlier time 1935 "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", 1936 "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", 1937 "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", 1938 "y/M/d H:mm", "pf", "2005/4/3 2:30", "2005 04 03 03:30 PDT", "2005/4/3 3:30", 1939 // time to parse is ambiguous, PT interpreted as later time 1940 "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", 1941 "y/M/d H:mm", "pf", "2005/10/30 1:30 PT", "2005 10 30 01:30 PST", "2005/10/30 1:30", 1942 1943 "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", 1944 "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", 1945 "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", 1946 "y/M/d H:mm", "pf", "2004/10/31 1:30", "2004 10 31 01:30 PST", "2004/10/31 1:30", 1947 }; 1948 1949 const int32_t ZDATA_length = sizeof(ZDATA)/ sizeof(ZDATA[0]); 1950 expect(ZDATA, ZDATA_length, en); 1951 1952 UErrorCode status = U_ZERO_ERROR; 1953 1954 logln("cross format/parse tests"); // Note: We no longer support cross format/parse 1955 UnicodeString basepat("yy/MM/dd H:mm "); 1956 SimpleDateFormat formats[] = { 1957 SimpleDateFormat(basepat + "vvv", en, status), 1958 SimpleDateFormat(basepat + "vvvv", en, status), 1959 SimpleDateFormat(basepat + "zzz", en, status), 1960 SimpleDateFormat(basepat + "zzzz", en, status) 1961 }; 1962 if (U_FAILURE(status)) { 1963 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(status)); 1964 return; 1965 } 1966 const int32_t formats_length = sizeof(formats)/sizeof(formats[0]); 1967 1968 UnicodeString test; 1969 SimpleDateFormat univ("yyyy MM dd HH:mm zzz", en, status); 1970 ASSERT_OK(status); 1971 const UnicodeString times[] = { 1972 "2004 01 02 03:04 PST", 1973 "2004 07 08 09:10 PDT" 1974 }; 1975 int32_t times_length = sizeof(times)/sizeof(times[0]); 1976 for (int i = 0; i < times_length; ++i) { 1977 UDate d = univ.parse(times[i], status); 1978 logln(UnicodeString("\ntime: ") + d); 1979 for (int j = 0; j < formats_length; ++j) { 1980 test.remove(); 1981 formats[j].format(d, test); 1982 logln("\ntest: '" + test + "'"); 1983 for (int k = 0; k < formats_length; ++k) { 1984 UDate t = formats[k].parse(test, status); 1985 if (U_SUCCESS(status)) { 1986 if (d != t) { 1987 errln((UnicodeString)"FAIL: format " + k + 1988 " incorrectly parsed output of format " + j + 1989 " (" + test + "), returned " + 1990 dateToString(t) + " instead of " + dateToString(d)); 1991 } else { 1992 logln((UnicodeString)"OK: format " + k + " parsed ok"); 1993 } 1994 } else if (status == U_PARSE_ERROR) { 1995 errln((UnicodeString)"FAIL: format " + k + 1996 " could not parse output of format " + j + 1997 " (" + test + ")"); 1998 } 1999 } 2000 } 2001 } 2002 } 2003 2004 void DateFormatTest::TestGenericTimeZoneOrder() { 2005 // generic times should parse the same no matter what the placement of the time zone string 2006 2007 // Note: We no longer support cross style format/parse 2008 2009 //const char* XDATA[] = { 2010 // "yyyy MM dd HH:mm zzz", 2011 // // standard time, explicit daylight/standard 2012 // "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", 2013 // "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", 2014 // "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", 2015 2016 // // standard time, generic 2017 // "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", 2018 // "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", 2019 // "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", 2020 2021 // // dahylight time, explicit daylight/standard 2022 // "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", 2023 // "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", 2024 // "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", 2025 2026 // // daylight time, generic 2027 // "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", 2028 // "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", 2029 // "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", 2030 //}; 2031 const char* XDATA[] = { 2032 "yyyy MM dd HH:mm zzz", 2033 // standard time, explicit daylight/standard 2034 "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", 2035 "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", 2036 "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", 2037 2038 // standard time, generic 2039 "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", 2040 "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", 2041 "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", 2042 2043 // dahylight time, explicit daylight/standard 2044 "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", 2045 "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", 2046 "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", 2047 2048 // daylight time, generic 2049 "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", 2050 "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", 2051 "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", 2052 }; 2053 const int32_t XDATA_length = sizeof(XDATA)/sizeof(XDATA[0]); 2054 Locale en("en"); 2055 expect(XDATA, XDATA_length, en); 2056 } 2057 2058 void DateFormatTest::TestZTimeZoneParsing(void) { 2059 UErrorCode status = U_ZERO_ERROR; 2060 const Locale en("en"); 2061 UnicodeString test; 2062 //SimpleDateFormat univ("yyyy-MM-dd'T'HH:mm Z", en, status); 2063 SimpleDateFormat univ("HH:mm Z", en, status); 2064 if (failure(status, "construct SimpleDateFormat", TRUE)) return; 2065 const TimeZone *t = TimeZone::getGMT(); 2066 univ.setTimeZone(*t); 2067 2068 univ.setLenient(false); 2069 ParsePosition pp(0); 2070 struct { 2071 UnicodeString input; 2072 UnicodeString expected_result; 2073 } tests[] = { 2074 { "11:00 -0200", "13:00 +0000" }, 2075 { "11:00 +0200", "09:00 +0000" }, 2076 { "11:00 +0400", "07:00 +0000" }, 2077 { "11:00 +0530", "05:30 +0000" } 2078 }; 2079 2080 UnicodeString result; 2081 int32_t tests_length = sizeof(tests)/sizeof(tests[0]); 2082 for (int i = 0; i < tests_length; ++i) { 2083 pp.setIndex(0); 2084 UDate d = univ.parse(tests[i].input, pp); 2085 if(pp.getIndex() != tests[i].input.length()){ 2086 errln("Test %i: setZoneString() did not succeed. Consumed: %i instead of %i", 2087 i, pp.getIndex(), tests[i].input.length()); 2088 return; 2089 } 2090 result.remove(); 2091 univ.format(d, result); 2092 if(result != tests[i].expected_result) { 2093 errln("Expected " + tests[i].expected_result 2094 + " got " + result); 2095 return; 2096 } 2097 logln("SUCCESS: Parsed " + tests[i].input 2098 + " got " + result 2099 + " expected " + tests[i].expected_result); 2100 } 2101 } 2102 2103 void DateFormatTest::TestHost(void) 2104 { 2105 #ifdef U_WINDOWS 2106 Win32DateTimeTest::testLocales(this); 2107 #endif 2108 } 2109 2110 // Relative Date Tests 2111 2112 void DateFormatTest::TestRelative(int daysdelta, 2113 const Locale& loc, 2114 const char *expectChars) { 2115 char banner[25]; 2116 sprintf(banner, "%d", daysdelta); 2117 UnicodeString bannerStr(banner, ""); 2118 2119 UErrorCode status = U_ZERO_ERROR; 2120 2121 FieldPosition pos(0); 2122 UnicodeString test; 2123 Locale en("en"); 2124 DateFormat *fullrelative = DateFormat::createDateInstance(DateFormat::kFullRelative, loc); 2125 2126 if (fullrelative == NULL) { 2127 dataerrln("DateFormat::createDateInstance(DateFormat::kFullRelative, %s) returned NULL", loc.getName()); 2128 return; 2129 } 2130 2131 DateFormat *full = DateFormat::createDateInstance(DateFormat::kFull , loc); 2132 2133 if (full == NULL) { 2134 errln("DateFormat::createDateInstance(DateFormat::kFull, %s) returned NULL", loc.getName()); 2135 return; 2136 } 2137 2138 DateFormat *en_full = DateFormat::createDateInstance(DateFormat::kFull, en); 2139 2140 if (en_full == NULL) { 2141 errln("DateFormat::createDateInstance(DateFormat::kFull, en) returned NULL"); 2142 return; 2143 } 2144 2145 DateFormat *en_fulltime = DateFormat::createDateTimeInstance(DateFormat::kFull,DateFormat::kFull,en); 2146 2147 if (en_fulltime == NULL) { 2148 errln("DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, en) returned NULL"); 2149 return; 2150 } 2151 2152 UnicodeString result; 2153 UnicodeString normalResult; 2154 UnicodeString expect; 2155 UnicodeString parseResult; 2156 2157 Calendar *c = Calendar::createInstance(status); 2158 2159 // Today = Today 2160 c->setTime(Calendar::getNow(), status); 2161 if(daysdelta != 0) { 2162 c->add(Calendar::DATE,daysdelta,status); 2163 } 2164 ASSERT_OK(status); 2165 2166 // calculate the expected string 2167 if(expectChars != NULL) { 2168 expect = expectChars; 2169 } else { 2170 full->format(*c, expect, pos); // expected = normal full 2171 } 2172 2173 fullrelative ->format(*c, result, pos); 2174 en_full ->format(*c, normalResult, pos); 2175 2176 if(result != expect) { 2177 errln("FAIL: Relative Format ["+bannerStr+"] of "+normalResult+" failed, expected "+expect+" but got " + result); 2178 } else { 2179 logln("PASS: Relative Format ["+bannerStr+"] of "+normalResult+" got " + result); 2180 } 2181 2182 2183 //verify 2184 UDate d = fullrelative->parse(result, status); 2185 ASSERT_OK(status); 2186 2187 UnicodeString parseFormat; // parse rel->format full 2188 en_full->format(d, parseFormat, status); 2189 2190 UnicodeString origFormat; 2191 en_full->format(*c, origFormat, pos); 2192 2193 if(parseFormat!=origFormat) { 2194 errln("FAIL: Relative Parse ["+bannerStr+"] of "+result+" failed, expected "+parseFormat+" but got "+origFormat); 2195 } else { 2196 logln("PASS: Relative Parse ["+bannerStr+"] of "+result+" passed, got "+parseFormat); 2197 } 2198 2199 delete full; 2200 delete fullrelative; 2201 delete en_fulltime; 2202 delete en_full; 2203 delete c; 2204 } 2205 2206 2207 void DateFormatTest::TestRelative(void) 2208 { 2209 Locale en("en"); 2210 TestRelative( 0, en, "Today"); 2211 TestRelative(-1, en, "Yesterday"); 2212 TestRelative( 1, en, "Tomorrow"); 2213 TestRelative( 2, en, NULL); 2214 TestRelative( -2, en, NULL); 2215 TestRelative( 3, en, NULL); 2216 TestRelative( -3, en, NULL); 2217 TestRelative( 300, en, NULL); 2218 TestRelative( -300, en, NULL); 2219 } 2220 2221 void DateFormatTest::TestRelativeClone(void) 2222 { 2223 /* 2224 Verify that a cloned formatter gives the same results 2225 and is useable after the original has been deleted. 2226 */ 2227 UErrorCode status = U_ZERO_ERROR; 2228 Locale loc("en"); 2229 UDate now = Calendar::getNow(); 2230 DateFormat *full = DateFormat::createDateInstance(DateFormat::kFullRelative, loc); 2231 if (full == NULL) { 2232 dataerrln("FAIL: Can't create Relative date instance"); 2233 return; 2234 } 2235 UnicodeString result1; 2236 full->format(now, result1, status); 2237 Format *fullClone = full->clone(); 2238 delete full; 2239 full = NULL; 2240 2241 UnicodeString result2; 2242 fullClone->format(now, result2, status); 2243 ASSERT_OK(status); 2244 if (result1 != result2) { 2245 errln("FAIL: Clone returned different result from non-clone."); 2246 } 2247 delete fullClone; 2248 } 2249 2250 void DateFormatTest::TestHostClone(void) 2251 { 2252 /* 2253 Verify that a cloned formatter gives the same results 2254 and is useable after the original has been deleted. 2255 */ 2256 // This is mainly important on Windows. 2257 UErrorCode status = U_ZERO_ERROR; 2258 Locale loc("en_US@compat=host"); 2259 UDate now = Calendar::getNow(); 2260 DateFormat *full = DateFormat::createDateInstance(DateFormat::kFull, loc); 2261 if (full == NULL) { 2262 dataerrln("FAIL: Can't create Relative date instance"); 2263 return; 2264 } 2265 UnicodeString result1; 2266 full->format(now, result1, status); 2267 Format *fullClone = full->clone(); 2268 delete full; 2269 full = NULL; 2270 2271 UnicodeString result2; 2272 fullClone->format(now, result2, status); 2273 ASSERT_OK(status); 2274 if (result1 != result2) { 2275 errln("FAIL: Clone returned different result from non-clone."); 2276 } 2277 delete fullClone; 2278 } 2279 2280 void DateFormatTest::TestTimeZoneDisplayName() 2281 { 2282 // This test data was ported from ICU4J. Don't know why the 6th column in there because it's not being 2283 // used currently. 2284 const char *fallbackTests[][6] = { 2285 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" }, 2286 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" }, 2287 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "PST", "America/Los_Angeles" }, 2288 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "V", "PST", "America/Los_Angeles" }, 2289 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "Pacific Standard Time", "America/Los_Angeles" }, 2290 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" }, 2291 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" }, 2292 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "PDT", "America/Los_Angeles" }, 2293 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "V", "PDT", "America/Los_Angeles" }, 2294 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "Pacific Daylight Time", "America/Los_Angeles" }, 2295 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "PT", "America/Los_Angeles" }, 2296 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "Pacific Time", "America/Los_Angeles" }, 2297 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "VVVV", "United States Time (Los Angeles)", "America/Los_Angeles" }, 2298 { "en_GB", "America/Los_Angeles", "2004-01-15T12:00:00Z", "z", "PST", "America/Los_Angeles" }, 2299 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "Z", "-0700", "-7:00" }, 2300 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" }, 2301 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "z", "MST", "America/Phoenix" }, 2302 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "V", "MST", "America/Phoenix" }, 2303 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "zzzz", "Mountain Standard Time", "America/Phoenix" }, 2304 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" }, 2305 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" }, 2306 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "z", "MST", "America/Phoenix" }, 2307 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "V", "MST", "America/Phoenix" }, 2308 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "zzzz", "Mountain Standard Time", "America/Phoenix" }, 2309 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "v", "MST", "America/Phoenix" }, 2310 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "vvvv", "Mountain Standard Time", "America/Phoenix" }, 2311 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "VVVV", "United States Time (Phoenix)", "America/Phoenix" }, 2312 2313 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2314 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2315 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2316 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "V", "GMT-03:00", "-3:00" }, 2317 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argentina Time", "-3:00" }, 2318 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2319 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2320 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2321 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "V", "GMT-03:00", "-3:00" }, 2322 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argentina Time", "-3:00" }, 2323 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Argentina Time (Buenos Aires)", "America/Buenos_Aires" }, 2324 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentina Time", "America/Buenos_Aires" }, 2325 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "VVVV", "Argentina Time (Buenos Aires)", "America/Buenos_Aires" }, 2326 2327 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2328 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2329 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2330 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "V", "GMT-03:00", "-3:00" }, 2331 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argentina Time", "-3:00" }, 2332 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2333 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2334 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2335 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "V", "GMT-03:00", "-3:00" }, 2336 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argentina Time", "-3:00" }, 2337 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Argentina Time (Buenos Aires)", "America/Buenos_Aires" }, 2338 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentina Time", "America/Buenos_Aires" }, 2339 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "VVVV", "Argentina Time (Buenos Aires)", "America/Buenos_Aires" }, 2340 2341 { "en", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" }, 2342 { "en", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" }, 2343 { "en", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-05:00", "-5:00" }, 2344 { "en", "America/Havana", "2004-01-15T00:00:00Z", "V", "GMT-05:00", "-5:00" }, 2345 { "en", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "Cuba Standard Time", "-5:00" }, 2346 { "en", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" }, 2347 { "en", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" }, 2348 { "en", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-04:00", "-4:00" }, 2349 { "en", "America/Havana", "2004-07-15T00:00:00Z", "V", "GMT-04:00", "-4:00" }, 2350 { "en", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "Cuba Daylight Time", "-4:00" }, 2351 { "en", "America/Havana", "2004-07-15T00:00:00Z", "v", "Cuba Time", "America/Havana" }, 2352 { "en", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "Cuba Time", "America/Havana" }, 2353 { "en", "America/Havana", "2004-07-15T00:00:00Z", "VVVV", "Cuba Time", "America/Havana" }, 2354 2355 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" }, 2356 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" }, 2357 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" }, 2358 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "V", "AEDT", "+11:00" }, 2359 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "Australian Eastern Daylight Time", "+11:00" }, 2360 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" }, 2361 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" }, 2362 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" }, 2363 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "V", "AEST", "+10:00" }, 2364 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "Australian Eastern Standard Time", "+10:00" }, 2365 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "Australia Time (Sydney)", "Australia/Sydney" }, 2366 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "Eastern Australia Time", "Australia/Sydney" }, 2367 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "VVVV", "Australia Time (Sydney)", "Australia/Sydney" }, 2368 2369 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" }, 2370 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" }, 2371 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" }, 2372 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "V", "AEDT", "+11:00" }, 2373 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "Australian Eastern Daylight Time", "+11:00" }, 2374 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" }, 2375 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" }, 2376 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" }, 2377 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "V", "AEST", "+10:00" }, 2378 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "Australian Eastern Standard Time", "+10:00" }, 2379 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "Australia Time (Sydney)", "Australia/Sydney" }, 2380 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "Eastern Australia Time", "Australia/Sydney" }, 2381 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "VVVV", "Australia Time (Sydney)", "Australia/Sydney" }, 2382 2383 { "en", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" }, 2384 { "en", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00" }, 2385 { "en", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" }, 2386 { "en", "Europe/London", "2004-01-15T00:00:00Z", "V", "GMT", "+0:00" }, 2387 { "en", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "Greenwich Mean Time", "+0:00" }, 2388 { "en", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" }, 2389 { "en", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" }, 2390 { "en", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+01:00", "Europe/London" }, 2391 { "en", "Europe/London", "2004-07-15T00:00:00Z", "V", "BST", "Europe/London" }, 2392 { "en", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "British Summer Time", "Europe/London" }, 2393 // icu en.txt has exemplar city for this time zone 2394 { "en", "Europe/London", "2004-07-15T00:00:00Z", "v", "United Kingdom Time", "Europe/London" }, 2395 { "en", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "United Kingdom Time", "Europe/London" }, 2396 { "en", "Europe/London", "2004-07-15T00:00:00Z", "VVVV", "United Kingdom Time", "Europe/London" }, 2397 2398 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2399 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2400 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2401 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" }, 2402 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2403 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2404 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2405 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" }, 2406 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-03:00", "-3:00" }, 2407 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" }, 2408 2409 // JB#5150 2410 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" }, 2411 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" }, 2412 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+05:30", "+5:30" }, 2413 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "V", "GMT+05:30", "+5:30" }, 2414 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "India Standard Time", "+5:30" }, 2415 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" }, 2416 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" }, 2417 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+05:30", "+05:30" }, 2418 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "V", "GMT+05:30", "+05:30" }, 2419 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "India Standard Time", "+5:30" }, 2420 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "India Time", "Asia/Calcutta" }, 2421 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "India Standard Time", "Asia/Calcutta" }, 2422 2423 // ========== 2424 2425 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" }, 2426 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" }, 2427 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-08:00", "-8:00" }, 2428 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "Nordamerikanische Westk\\u00fcsten-Winterzeit", "-8:00" }, 2429 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" }, 2430 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" }, 2431 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-07:00", "-7:00" }, 2432 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "Nordamerikanische Westk\\u00fcsten-Sommerzeit", "-7:00" }, 2433 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "Vereinigte Staaten Zeit (Los Angeles)", "America/Los_Angeles" }, 2434 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "Nordamerikanische Westk\\u00fcstenzeit", "America/Los_Angeles" }, 2435 2436 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2437 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2438 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2439 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argentinische Winterzeit", "-3:00" }, 2440 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2441 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2442 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2443 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argentinische Winterzeit", "-3:00" }, 2444 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Argentinien Zeit (Buenos Aires)", "America/Buenos_Aires" }, 2445 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentinische Winterzeit", "America/Buenos_Aires" }, 2446 2447 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2448 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2449 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2450 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argentinische Winterzeit", "-3:00" }, 2451 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2452 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2453 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2454 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argentinische Winterzeit", "-3:00" }, 2455 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Argentinien Zeit (Buenos Aires)", "America/Buenos_Aires" }, 2456 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argentinische Winterzeit", "America/Buenos_Aires" }, 2457 2458 { "de", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" }, 2459 { "de", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" }, 2460 { "de", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-05:00", "-5:00" }, 2461 { "de", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "GMT-05:00", "-5:00" }, 2462 { "de", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" }, 2463 { "de", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" }, 2464 { "de", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-04:00", "-4:00" }, 2465 { "de", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "GMT-04:00", "-4:00" }, 2466 { "de", "America/Havana", "2004-07-15T00:00:00Z", "v", "Kuba Zeit", "America/Havana" }, 2467 { "de", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "Kuba Zeit", "America/Havana" }, 2468 // added to test proper fallback of country name 2469 { "de_CH", "America/Havana", "2004-07-15T00:00:00Z", "v", "Kuba Zeit", "America/Havana" }, 2470 { "de_CH", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "Kuba Zeit", "America/Havana" }, 2471 2472 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" }, 2473 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" }, 2474 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" }, 2475 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "Ostaustralische Sommerzeit", "+11:00" }, 2476 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" }, 2477 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" }, 2478 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" }, 2479 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "Ostaustralische Winterzeit", "+10:00" }, 2480 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "Australien Zeit (Sydney)", "Australia/Sydney" }, 2481 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "Ostaustralische Zeit", "Australia/Sydney" }, 2482 2483 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" }, 2484 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" }, 2485 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" }, 2486 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "Ostaustralische Sommerzeit", "+11:00" }, 2487 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" }, 2488 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" }, 2489 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" }, 2490 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "Ostaustralische Winterzeit", "+10:00" }, 2491 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "Australien Zeit (Sydney)", "Australia/Sydney" }, 2492 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "Ostaustralische Zeit", "Australia/Sydney" }, 2493 2494 { "de", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" }, 2495 { "de", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00" }, 2496 { "de", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" }, 2497 { "de", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "Mittlere Greenwich-Zeit", "+0:00" }, 2498 { "de", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" }, 2499 { "de", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" }, 2500 { "de", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+01:00", "+1:00" }, 2501 { "de", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "GMT+01:00", "+1:00" }, 2502 { "de", "Europe/London", "2004-07-15T00:00:00Z", "v", "Vereinigtes K\\u00f6nigreich Zeit", "Europe/London" }, 2503 { "de", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "Vereinigtes K\\u00f6nigreich Zeit", "Europe/London" }, 2504 2505 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2506 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2507 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2508 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" }, 2509 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2510 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2511 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2512 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" }, 2513 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-03:00", "-3:00" }, 2514 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" }, 2515 2516 // JB#5150 2517 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" }, 2518 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" }, 2519 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+05:30", "+5:30" }, 2520 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "Indische Zeit", "+5:30" }, 2521 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" }, 2522 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" }, 2523 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+05:30", "+05:30" }, 2524 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "Indische Zeit", "+5:30" }, 2525 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "Indien Zeit", "Asia/Calcutta" }, 2526 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "Indische Zeit", "Asia/Calcutta" }, 2527 2528 // ========== 2529 2530 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" }, 2531 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0800", "-8:00" }, 2532 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0800", "America/Los_Angeles" }, 2533 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\\u592a\\u5e73\\u6d0b\\u6807\\u51c6\\u65f6\\u95f4", "America/Los_Angeles" }, 2534 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" }, 2535 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0700", "-7:00" }, 2536 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0700", "America/Los_Angeles" }, 2537 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\\u592a\\u5e73\\u6d0b\\u590f\\u4ee4\\u65f6\\u95f4", "America/Los_Angeles" }, 2538 // icu zh.txt has exemplar city for this time zone 2539 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\\u7f8e\\u56fd\\u65F6\\u95F4\\uff08\\u6d1b\\u6749\\u77f6\\uff09", "America/Los_Angeles" }, 2540 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\\u7f8e\\u56fd\\u592a\\u5e73\\u6d0b\\u65f6\\u95f4", "America/Los_Angeles" }, 2541 2542 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2543 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2544 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2545 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "-3:00" }, 2546 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2547 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2548 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2549 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "-3:00" }, 2550 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u963f\\u6839\\u5ef7\\u65F6\\u95F4\\uff08\\u5e03\\u5b9c\\u8bfa\\u65af\\u827e\\u5229\\u65af\\uff09", "America/Buenos_Aires" }, 2551 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "America/Buenos_Aires" }, 2552 2553 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2554 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2555 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2556 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "-3:00" }, 2557 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2558 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2559 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2560 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "-3:00" }, 2561 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u963f\\u6839\\u5ef7\\u65F6\\u95F4\\uff08\\u5e03\\u5b9c\\u8bfa\\u65af\\u827e\\u5229\\u65af\\uff09", "America/Buenos_Aires" }, 2562 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "America/Buenos_Aires" }, 2563 2564 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" }, 2565 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0500", "-5:00" }, 2566 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0500", "-5:00" }, 2567 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\\u53e4\\u5df4\\u6807\\u51c6\\u65f6\\u95f4", "-5:00" }, 2568 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" }, 2569 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0400", "-4:00" }, 2570 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0400", "-4:00" }, 2571 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\\u53e4\\u5df4\\u590f\\u4ee4\\u65f6\\u95f4", "-4:00" }, 2572 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "v", "\\u53e4\\u5df4\\u65f6\\u95f4", "America/Havana" }, 2573 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\\u53e4\\u5df4\\u65f6\\u95f4", "America/Havana" }, 2574 2575 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" }, 2576 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+1100", "+11:00" }, 2577 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+1100", "+11:00" }, 2578 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\\u6fb3\\u5927\\u5229\\u4e9a\\u4e1c\\u90e8\\u590f\\u4ee4\\u65f6\\u95f4", "+11:00" }, 2579 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" }, 2580 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+1000", "+10:00" }, 2581 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+1000", "+10:00" }, 2582 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\\u6fb3\\u5927\\u5229\\u4e9a\\u4e1c\\u90e8\\u6807\\u51c6\\u65f6\\u95f4", "+10:00" }, 2583 // icu zh.txt does not have info for this time zone 2584 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\\u6fb3\\u5927\\u5229\\u4e9a\\u65F6\\u95F4\\uff08\\u6089\\u5c3c\\uff09", "Australia/Sydney" }, 2585 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\\u6fb3\\u5927\\u5229\\u4e9a\\u4e1c\\u90e8\\u65f6\\u95f4", "Australia/Sydney" }, 2586 2587 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" }, 2588 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+1100", "+11:00" }, 2589 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+1100", "+11:00" }, 2590 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\\u6fb3\\u5927\\u5229\\u4e9a\\u4e1c\\u90e8\\u590f\\u4ee4\\u65f6\\u95f4", "+11:00" }, 2591 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" }, 2592 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+1000", "+10:00" }, 2593 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+1000", "+10:00" }, 2594 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\\u6fb3\\u5927\\u5229\\u4e9a\\u4e1c\\u90e8\\u6807\\u51c6\\u65f6\\u95f4", "+10:00" }, 2595 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\\u6fb3\\u5927\\u5229\\u4e9a\\u65F6\\u95F4\\uff08\\u6089\\u5c3c\\uff09", "Australia/Sydney" }, 2596 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\\u6fb3\\u5927\\u5229\\u4e9a\\u4e1c\\u90e8\\u65f6\\u95f4", "Australia/Sydney" }, 2597 2598 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" }, 2599 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4", "+0:00" }, 2600 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4", "+0:00" }, 2601 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "V", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4", "+0:00" }, 2602 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4", "+0:00" }, 2603 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4", "+0:00" }, 2604 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "V", "\\u683C\\u6797\\u5C3C\\u6CBB\\u6807\\u51C6\\u65F6\\u95F4", "+0:00" }, 2605 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\\u683C\\u6797\\u5C3C\\u6CBB\\u6807\\u51C6\\u65F6\\u95F4", "+0:00" }, 2606 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" }, 2607 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+0100", "+1:00" }, 2608 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+0100", "+1:00" }, 2609 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "V", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+0100", "+1:00" }, 2610 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+0100", "+1:00" }, 2611 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "v", "\\u82f1\\u56fd\\u65f6\\u95f4", "Europe/London" }, 2612 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\\u82f1\\u56fd\\u65f6\\u95f4", "Europe/London" }, 2613 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "VVVV", "\\u82f1\\u56fd\\u65f6\\u95f4", "Europe/London" }, 2614 2615 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2616 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2617 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2618 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2619 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2620 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2621 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2622 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2623 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2624 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0300", "-3:00" }, 2625 2626 // JB#5150 2627 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" }, 2628 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+0530", "+5:30" }, 2629 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+0530", "+5:30" }, 2630 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\\u5370\\u5ea6\\u6807\\u51c6\\u65f6\\u95f4", "+5:30" }, 2631 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" }, 2632 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+0530", "+5:30" }, 2633 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4+0530", "+05:30" }, 2634 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\\u5370\\u5ea6\\u6807\\u51c6\\u65f6\\u95f4", "+5:30" }, 2635 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "\\u5370\\u5ea6\\u65f6\\u95f4", "Asia/Calcutta" }, 2636 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\\u5370\\u5ea6\\u6807\\u51c6\\u65f6\\u95f4", "Asia/Calcutta" }, 2637 2638 // ========== 2639 2640 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" }, 2641 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-\\u0966\\u096e:\\u0966\\u0966", "-8:00" }, 2642 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-\\u0966\\u096e:\\u0966\\u0966", "-8:00" }, 2643 { "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" }, 2644 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" }, 2645 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-\\u0966\\u096d:\\u0966\\u0966", "-7:00" }, 2646 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-\\u0966\\u096d:\\u0966\\u0966", "-7:00" }, 2647 { "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" }, 2648 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\\u0938\\u0902\\u092f\\u0941\\u0915\\u094d\\u0924 \\u0930\\u093e\\u091c\\u094d\\u092f \\u0905\\u092e\\u0947\\u0930\\u093f\\u0915\\u093e \\u0938\\u092E\\u092F (\\u0932\\u094b\\u0938 \\u090f\\u0902\\u091c\\u093f\\u0932\\u0947\\u0938)", "America/Los_Angeles" }, 2649 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\\u092A\\u094D\\u0930\\u0936\\u093E\\u0902\\u0924 \\u0938\\u092E\\u092F", "America/Los_Angeles" }, 2650 2651 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2652 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2653 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2654 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u0938\\u092E\\u092F", "-3:00" }, 2655 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2656 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2657 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2658 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u0938\\u092E\\u092F", "-3:00" }, 2659 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u0905\\u0930\\u094d\\u091c\\u0947\\u0928\\u094d\\u091f\\u0940\\u0928\\u093e \\u0938\\u092E\\u092F (\\u092c\\u094d\\u092f\\u0942\\u0928\\u0938 \\u0906\\u092f\\u0930\\u0938)", "America/Buenos_Aires" }, 2660 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u0938\\u092E\\u092F", "America/Buenos_Aires" }, 2661 2662 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2663 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2664 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2665 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u0938\\u092E\\u092F", "-3:00" }, 2666 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2667 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2668 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2669 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u0938\\u092E\\u092F", "-3:00" }, 2670 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u0905\\u0930\\u094d\\u091c\\u0947\\u0928\\u094d\\u091f\\u0940\\u0928\\u093e \\u0938\\u092E\\u092F (\\u092c\\u094d\\u092f\\u0942\\u0928\\u0938 \\u0906\\u092f\\u0930\\u0938)", "America/Buenos_Aires" }, 2671 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u0938\\u092E\\u092F", "America/Buenos_Aires" }, 2672 2673 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" }, 2674 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-\\u0966\\u096b:\\u0966\\u0966", "-5:00" }, 2675 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-\\u0966\\u096b:\\u0966\\u0966", "-5:00" }, 2676 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "GMT-\\u0966\\u096b:\\u0966\\u0966", "-5:00" }, 2677 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" }, 2678 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-\\u0966\\u096a:\\u0966\\u0966", "-4:00" }, 2679 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-\\u0966\\u096a:\\u0966\\u0966", "-4:00" }, 2680 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "GMT-\\u0966\\u096a:\\u0966\\u0966", "-4:00" }, 2681 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "v", "\\u0915\\u094d\\u092f\\u0942\\u092c\\u093e \\u0938\\u092E\\u092F", "America/Havana" }, 2682 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\\u0915\\u094d\\u092f\\u0942\\u092c\\u093e \\u0938\\u092E\\u092F", "America/Havana" }, 2683 2684 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" }, 2685 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+\\u0967\\u0967:\\u0966\\u0966", "+11:00" }, 2686 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+\\u0967\\u0967:\\u0966\\u0966", "+11:00" }, 2687 { "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" }, 2688 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" }, 2689 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+\\u0967\\u0966:\\u0966\\u0966", "+10:00" }, 2690 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+\\u0967\\u0966:\\u0966\\u0966", "+10:00" }, 2691 { "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" }, 2692 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\\u0911\\u0938\\u094d\\u091f\\u094d\\u0930\\u0947\\u0932\\u093f\\u092f\\u093e \\u0938\\u092E\\u092F (\\u0938\\u093f\\u0921\\u0928\\u0940)", "Australia/Sydney" }, 2693 { "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" }, 2694 2695 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" }, 2696 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+\\u0967\\u0967:\\u0966\\u0966", "+11:00" }, 2697 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+\\u0967\\u0967:\\u0966\\u0966", "+11:00" }, 2698 { "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" }, 2699 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" }, 2700 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+\\u0967\\u0966:\\u0966\\u0966", "+10:00" }, 2701 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+\\u0967\\u0966:\\u0966\\u0966", "+10:00" }, 2702 { "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" }, 2703 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\\u0911\\u0938\\u094d\\u091f\\u094d\\u0930\\u0947\\u0932\\u093f\\u092f\\u093e \\u0938\\u092E\\u092F (\\u0938\\u093f\\u0921\\u0928\\u0940)", "Australia/Sydney" }, 2704 { "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" }, 2705 2706 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" }, 2707 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00" }, 2708 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" }, 2709 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "GMT", "+0:00" }, 2710 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" }, 2711 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+\\u0966\\u0967:\\u0966\\u0966", "+1:00" }, 2712 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+\\u0966\\u0967:\\u0966\\u0966", "+1:00" }, 2713 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "GMT+\\u0966\\u0967:\\u0966\\u0966", "+1:00" }, 2714 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "v", "\\u092C\\u094D\\u0930\\u093F\\u0924\\u0928 \\u0938\\u092E\\u092F", "Europe/London" }, 2715 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\\u092C\\u094D\\u0930\\u093F\\u0924\\u0928 \\u0938\\u092E\\u092F", "Europe/London" }, 2716 2717 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2718 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2719 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2720 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2721 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2722 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2723 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2724 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2725 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2726 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-\\u0966\\u0969:\\u0966\\u0966", "-3:00" }, 2727 2728 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" }, 2729 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+\\u0966\\u096B:\\u0969\\u0966", "+5:30" }, 2730 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "IST", "+5:30" }, 2731 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\\u092D\\u093E\\u0930\\u0924\\u0940\\u092F \\u0938\\u092E\\u092F", "+5:30" }, 2732 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" }, 2733 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+\\u0966\\u096B:\\u0969\\u0966", "+5:30" }, 2734 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "IST", "+05:30" }, 2735 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\\u092D\\u093E\\u0930\\u0924\\u0940\\u092F \\u0938\\u092E\\u092F", "+5:30" }, 2736 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "IST", "Asia/Calcutta" }, 2737 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\\u092D\\u093E\\u0930\\u0924\\u0940\\u092F \\u0938\\u092E\\u092F", "Asia/Calcutta" }, 2738 2739 // ========== 2740 2741 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" }, 2742 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0800", "-8:00" }, 2743 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0800", "America/Los_Angeles" }, 2744 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "V", "PST", "America/Los_Angeles" }, 2745 { "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" }, 2746 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" }, 2747 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0700", "-7:00" }, 2748 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0700", "America/Los_Angeles" }, 2749 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "V", "PDT", "America/Los_Angeles" }, 2750 { "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" }, 2751 // icu bg.txt has exemplar city for this time zone 2752 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\\u0421\\u0410\\u0429 \\u0432\\u0440\\u0435\\u043C\\u0435 (\\u041b\\u043e\\u0441 \\u0410\\u043d\\u0436\\u0435\\u043b\\u0438\\u0441)", "America/Los_Angeles" }, 2753 { "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" }, 2754 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "VVVV", "\\u0421\\u0410\\u0429 \\u0432\\u0440\\u0435\\u043C\\u0435 (\\u041b\\u043e\\u0441 \\u0410\\u043d\\u0436\\u0435\\u043b\\u0438\\u0441)", "America/Los_Angeles" }, 2755 2756 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2757 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2758 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2759 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0430", "-3:00" }, 2760 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2761 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2762 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2763 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0430", "-3:00" }, 2764 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u0410\\u0440\\u0436\\u0435\\u043d\\u0442\\u0438\\u043d\\u0430 \\u0432\\u0440\\u0435\\u043C\\u0435 (\\u0411\\u0443\\u0435\\u043D\\u043E\\u0441 \\u0410\\u0439\\u0440\\u0435\\u0441)", "America/Buenos_Aires" }, 2765 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0430", "America/Buenos_Aires" }, 2766 2767 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2768 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2769 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2770 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0430", "-3:00" }, 2771 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2772 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2773 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2774 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0430", "-3:00" }, 2775 // icu bg.txt does not have info for this time zone 2776 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u0410\\u0440\\u0436\\u0435\\u043d\\u0442\\u0438\\u043d\\u0430 \\u0432\\u0440\\u0435\\u043C\\u0435 (\\u0411\\u0443\\u0435\\u043D\\u043E\\u0441 \\u0410\\u0439\\u0440\\u0435\\u0441)", "America/Buenos_Aires" }, 2777 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0430", "America/Buenos_Aires" }, 2778 2779 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" }, 2780 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0500", "-5:00" }, 2781 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0500", "-5:00" }, 2782 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0500", "-5:00" }, 2783 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" }, 2784 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0400", "-4:00" }, 2785 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0400", "-4:00" }, 2786 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0400", "-4:00" }, 2787 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "v", "\\u041a\\u0443\\u0431\\u0430 \\u0432\\u0440\\u0435\\u043C\\u0435", "America/Havana" }, 2788 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\\u041a\\u0443\\u0431\\u0430 \\u0432\\u0440\\u0435\\u043C\\u0435", "America/Havana" }, 2789 2790 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" }, 2791 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+1100", "+11:00" }, 2792 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+1100", "+11:00" }, 2793 { "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" }, 2794 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" }, 2795 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+1000", "+10:00" }, 2796 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+1000", "+10:00" }, 2797 { "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" }, 2798 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\\u0410\\u0432\\u0441\\u0442\\u0440\\u0430\\u043b\\u0438\\u044f \\u0432\\u0440\\u0435\\u043C\\u0435 (\\u0421\\u0438\\u0434\\u043D\\u0438)", "Australia/Sydney" }, 2799 { "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" }, 2800 2801 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" }, 2802 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+1100", "+11:00" }, 2803 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+1100", "+11:00" }, 2804 { "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" }, 2805 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" }, 2806 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+1000", "+10:00" }, 2807 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+1000", "+10:00" }, 2808 { "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" }, 2809 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\\u0410\\u0432\\u0441\\u0442\\u0440\\u0430\\u043b\\u0438\\u044f \\u0432\\u0440\\u0435\\u043C\\u0435 (\\u0421\\u0438\\u0434\\u043D\\u0438)", "Australia/Sydney" }, 2810 { "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" }, 2811 2812 { "bg", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" }, 2813 { "bg", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447", "+0:00" }, 2814 { "bg", "Europe/London", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447", "+0:00" }, 2815 { "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" }, 2816 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" }, 2817 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+0100", "+1:00" }, 2818 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+0100", "+1:00" }, 2819 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+0100", "+1:00" }, 2820 { "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" }, 2821 { "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" }, 2822 2823 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2824 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2825 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2826 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2827 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2828 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2829 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2830 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2831 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2832 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447-0300", "-3:00" }, 2833 2834 // JB#5150 2835 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" }, 2836 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+0530", "+5:30" }, 2837 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+0530", "+5:30" }, 2838 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+0530", "+5:30" }, 2839 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" }, 2840 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+0530", "+5:30" }, 2841 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+0530", "+05:30" }, 2842 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\\u0413\\u0440\\u0438\\u0438\\u043D\\u0443\\u0438\\u0447+0530", "+5:30" }, 2843 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "\\u0418\\u043D\\u0434\\u0438\\u044F \\u0432\\u0440\\u0435\\u043C\\u0435", "Asia/Calcutta" }, 2844 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\\u0418\\u043D\\u0434\\u0438\\u044F \\u0432\\u0440\\u0435\\u043C\\u0435", "Asia/Calcutta" }, 2845 // ========== 2846 2847 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" }, 2848 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" }, 2849 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-08:00", "America/Los_Angeles" }, 2850 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "V", "PST", "America/Los_Angeles" }, 2851 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\\u30a2\\u30e1\\u30ea\\u30ab\\u592a\\u5e73\\u6d0b\\u6a19\\u6e96\\u6642", "America/Los_Angeles" }, 2852 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-700" }, 2853 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" }, 2854 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-07:00", "America/Los_Angeles" }, 2855 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "V", "PDT", "America/Los_Angeles" }, 2856 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\\u30a2\\u30e1\\u30ea\\u30ab\\u592a\\u5e73\\u6d0b\\u590f\\u6642\\u9593", "America/Los_Angeles" }, 2857 // icu ja.txt has exemplar city for this time zone 2858 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\\u30A2\\u30E1\\u30EA\\u30AB\\u5408\\u8846\\u56FD\\u6642\\u9593\\uFF08\\u30ed\\u30b5\\u30f3\\u30bc\\u30eb\\u30b9\\uFF09", "America/Los_Angeles" }, 2859 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\\u30A2\\u30E1\\u30EA\\u30AB\\u592A\\u5e73\\u6D0B\\u6642\\u9593", "America/Los_Angeles" }, 2860 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "VVVV", "\\u30A2\\u30E1\\u30EA\\u30AB\\u5408\\u8846\\u56FD\\u6642\\u9593\\uFF08\\u30ed\\u30b5\\u30f3\\u30bc\\u30eb\\u30b9\\uFF09", "America/Los_Angeles" }, 2861 2862 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2863 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2864 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2865 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "-3:00" }, 2866 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2867 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2868 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2869 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "-3:00" }, 2870 // icu ja.txt does not have info for this time zone 2871 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u30a2\\u30eb\\u30bc\\u30f3\\u30c1\\u30f3\\u6642\\u9593\\uFF08\\u30D6\\u30A8\\u30CE\\u30B9\\u30A2\\u30A4\\u30EC\\u30B9\\uFF09", "America/Buenos_Aires" }, 2872 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "America/Buenos_Aires" }, 2873 2874 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2875 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2876 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2877 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "-3:00" }, 2878 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2879 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2880 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2881 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "-3:00" }, 2882 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u30a2\\u30eb\\u30bc\\u30f3\\u30c1\\u30f3\\u6642\\u9593\\uFF08\\u30D6\\u30A8\\u30CE\\u30B9\\u30A2\\u30A4\\u30EC\\u30B9\\uFF09", "America/Buenos_Aires" }, 2883 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "America/Buenos_Aires" }, 2884 2885 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" }, 2886 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" }, 2887 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-05:00", "-5:00" }, 2888 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\\u30AD\\u30E5\\u30FC\\u30D0\\u6A19\\u6E96\\u6642", "-5:00" }, 2889 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" }, 2890 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" }, 2891 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-04:00", "-4:00" }, 2892 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\\u30AD\\u30E5\\u30FC\\u30D0\\u590F\\u6642\\u9593", "-4:00" }, 2893 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "v", "\\u30ad\\u30e5\\u30fc\\u30d0\\u6642\\u9593", "America/Havana" }, 2894 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\\u30ad\\u30e5\\u30fc\\u30d0\\u6642\\u9593", "America/Havana" }, 2895 2896 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" }, 2897 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" }, 2898 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" }, 2899 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\\u30AA\\u30FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u590F\\u6642\\u9593", "+11:00" }, 2900 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" }, 2901 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" }, 2902 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" }, 2903 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\\u30AA\\u30FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u6A19\\u6E96\\u6642", "+10:00" }, 2904 // icu ja.txt does not have info for this time zone 2905 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\\u30aa\\u30fc\\u30b9\\u30c8\\u30e9\\u30ea\\u30a2\\u6642\\u9593\\uFF08\\u30b7\\u30c9\\u30cb\\u30fc\\uFF09", "Australia/Sydney" }, 2906 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\\u30AA\\u30FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u6642\\u9593", "Australia/Sydney" }, 2907 2908 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" }, 2909 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" }, 2910 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" }, 2911 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\\u30AA\\u30FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u590F\\u6642\\u9593", "+11:00" }, 2912 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" }, 2913 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" }, 2914 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" }, 2915 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\\u30AA\\u30FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u6A19\\u6E96\\u6642", "+10:00" }, 2916 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\\u30aa\\u30fc\\u30b9\\u30c8\\u30e9\\u30ea\\u30a2\\u6642\\u9593\\uFF08\\u30b7\\u30c9\\u30cb\\u30fc\\uFF09", "Australia/Sydney" }, 2917 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\\u30AA\\u30FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u6642\\u9593", "Australia/Sydney" }, 2918 2919 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" }, 2920 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00" }, 2921 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" }, 2922 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "V", "GMT", "+0:00" }, 2923 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\\u30B0\\u30EA\\u30CB\\u30C3\\u30B8\\u6A19\\u6E96\\u6642", "+0:00" }, 2924 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" }, 2925 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" }, 2926 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+01:00", "+1:00" }, 2927 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "V", "GMT+01:00", "+1:00" }, 2928 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "GMT+01:00", "+1:00" }, 2929 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "v", "\\u30a4\\u30ae\\u30ea\\u30b9\\u6642\\u9593", "Europe/London" }, 2930 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\\u30a4\\u30ae\\u30ea\\u30b9\\u6642\\u9593", "Europe/London" }, 2931 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "VVVV", "\\u30a4\\u30ae\\u30ea\\u30b9\\u6642\\u9593", "Europe/London" }, 2932 2933 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2934 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2935 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2936 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" }, 2937 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2938 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2939 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2940 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" }, 2941 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-03:00", "-3:00" }, 2942 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" }, 2943 2944 // JB#5150 2945 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" }, 2946 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" }, 2947 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+05:30", "+5:30" }, 2948 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\\u30A4\\u30F3\\u30C9\\u6A19\\u6E96\\u6642", "+5:30" }, 2949 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" }, 2950 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" }, 2951 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+05:30", "+05:30" }, 2952 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\\u30A4\\u30F3\\u30C9\\u6A19\\u6E96\\u6642", "+5:30" }, 2953 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "\\u30A4\\u30F3\\u30C9\\u6642\\u9593", "Asia/Calcutta" }, 2954 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\\u30A4\\u30F3\\u30C9\\u6A19\\u6E96\\u6642", "Asia/Calcutta" }, 2955 2956 // ========== 2957 2958 { "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8:00" }, 2959 { "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:00", "-8:00" }, 2960 { "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-08:00", "-8:00" }, 2961 { "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "GMT-08:00", "-8:00" }, 2962 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00" }, 2963 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00", "-7:00" }, 2964 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-07:00", "-7:00" }, 2965 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "GMT-07:00", "-7:00" }, 2966 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "US (Los Angeles)", "America/Los_Angeles" }, 2967 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "US (Los Angeles)", "America/Los_Angeles" }, 2968 2969 { "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2970 { "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2971 { "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2972 { "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" }, 2973 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2974 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2975 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2976 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" }, 2977 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "AR (Buenos Aires)", "America/Buenos_Aires" }, 2978 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "AR (Buenos Aires)", "America/Buenos_Aires" }, 2979 2980 { "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2981 { "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2982 { "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2983 { "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" }, 2984 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 2985 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 2986 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 2987 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" }, 2988 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "AR (Buenos Aires)", "America/Buenos_Aires" }, 2989 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "AR (Buenos Aires)", "America/Buenos_Aires" }, 2990 2991 { "ti", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00" }, 2992 { "ti", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "-5:00" }, 2993 { "ti", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-05:00", "-5:00" }, 2994 { "ti", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "GMT-05:00", "-5:00" }, 2995 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00" }, 2996 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "-4:00" }, 2997 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-04:00", "-4:00" }, 2998 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "GMT-04:00", "-4:00" }, 2999 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "v", "(CU)", "America/Havana" }, 3000 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "(CU)", "America/Havana" }, 3001 3002 { "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" }, 3003 { "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" }, 3004 { "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" }, 3005 { "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "GMT+11:00", "+11:00" }, 3006 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" }, 3007 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" }, 3008 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" }, 3009 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "GMT+10:00", "+10:00" }, 3010 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "AU (Sydney)", "Australia/Sydney" }, 3011 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "AU (Sydney)", "Australia/Sydney" }, 3012 3013 { "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00" }, 3014 { "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+11:00" }, 3015 { "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11:00", "+11:00" }, 3016 { "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "GMT+11:00", "+11:00" }, 3017 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00" }, 3018 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+10:00" }, 3019 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10:00", "+10:00" }, 3020 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "GMT+10:00", "+10:00" }, 3021 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "AU (Sydney)", "Australia/Sydney" }, 3022 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "AU (Sydney)", "Australia/Sydney" }, 3023 3024 { "ti", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" }, 3025 { "ti", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00" }, 3026 { "ti", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" }, 3027 { "ti", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "GMT", "+0:00" }, 3028 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" }, 3029 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+1:00" }, 3030 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+01:00", "+1:00" }, 3031 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "GMT+01:00", "+1:00" }, 3032 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "v", "(GB)", "Europe/London" }, 3033 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "(GB)", "Europe/London" }, 3034 3035 { "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, 3036 { "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 3037 { "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 3038 { "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" }, 3039 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, 3040 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00" }, 3041 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-03:00", "-3:00" }, 3042 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00" }, 3043 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-03:00", "-3:00" }, 3044 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00" }, 3045 3046 // JB#5150 3047 { "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" }, 3048 { "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" }, 3049 { "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+05:30", "+5:30" }, 3050 { "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "GMT+05:30", "+5:30" }, 3051 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" }, 3052 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+5:30" }, 3053 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+05:30", "+05:30" }, 3054 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "GMT+05:30", "+5:30" }, 3055 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "(IN)", "Alna/Calcutta" }, 3056 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "(IN)", "Asia/Calcutta" }, 3057 3058 // Ticket#8589 Partial location name to use country name if the zone is the golden 3059 // zone for the time zone's country. 3060 { "en_MX", "America/Chicago", "1995-07-15T00:00:00Z", "vvvv", "Central Time (United States)", "America/Chicago"}, 3061 3062 { NULL, NULL, NULL, NULL, NULL, NULL }, 3063 }; 3064 3065 UErrorCode status = U_ZERO_ERROR; 3066 Calendar *cal = GregorianCalendar::createInstance(status); 3067 if (failure(status, "GregorianCalendar::createInstance", TRUE)) return; 3068 SimpleDateFormat testfmt(UnicodeString("yyyy-MM-dd'T'HH:mm:ss'Z'"), status); 3069 if (failure(status, "SimpleDateFormat constructor", TRUE)) return; 3070 testfmt.setTimeZone(*TimeZone::getGMT()); 3071 3072 for (int i = 0; fallbackTests[i][0]; i++) { 3073 const char **testLine = fallbackTests[i]; 3074 UnicodeString info[5]; 3075 for ( int j = 0 ; j < 5 ; j++ ) { 3076 info[j] = UnicodeString(testLine[j], -1, US_INV); 3077 } 3078 info[4] = info[4].unescape(); 3079 logln("%s;%s;%s;%s", testLine[0], testLine[1], testLine[2], testLine[3]); 3080 3081 TimeZone *tz = TimeZone::createTimeZone(info[1]); 3082 3083 UDate d = testfmt.parse(testLine[2], status); 3084 cal->setTime(d, status); 3085 if (U_FAILURE(status)) { 3086 errln(UnicodeString("Failed to set date: ") + testLine[2]); 3087 } 3088 3089 SimpleDateFormat fmt(info[3], Locale(testLine[0]),status); 3090 ASSERT_OK(status); 3091 cal->adoptTimeZone(tz); 3092 UnicodeString result; 3093 FieldPosition pos(0); 3094 fmt.format(*cal,result,pos); 3095 if (result != info[4]) { 3096 errln(info[0] + ";" + info[1] + ";" + info[2] + ";" + info[3] + " expected: '" + 3097 info[4] + "' but got: '" + result + "'"); 3098 } 3099 } 3100 delete cal; 3101 } 3102 3103 void DateFormatTest::TestRoundtripWithCalendar(void) { 3104 UErrorCode status = U_ZERO_ERROR; 3105 3106 TimeZone *tz = TimeZone::createTimeZone("Europe/Paris"); 3107 TimeZone *gmt = TimeZone::createTimeZone("Etc/GMT"); 3108 3109 Calendar *calendars[] = { 3110 Calendar::createInstance(*tz, Locale("und@calendar=gregorian"), status), 3111 Calendar::createInstance(*tz, Locale("und@calendar=buddhist"), status), 3112 // Calendar::createInstance(*tz, Locale("und@calendar=hebrew"), status), 3113 Calendar::createInstance(*tz, Locale("und@calendar=islamic"), status), 3114 Calendar::createInstance(*tz, Locale("und@calendar=japanese"), status), 3115 NULL 3116 }; 3117 if (U_FAILURE(status)) { 3118 dataerrln("Failed to initialize calendars: %s", u_errorName(status)); 3119 for (int i = 0; calendars[i] != NULL; i++) { 3120 delete calendars[i]; 3121 } 3122 return; 3123 } 3124 3125 //FIXME The formatters commented out below are currently failing because of 3126 // the calendar calculation problem reported by #6691 3127 3128 // The order of test formatters must match the order of calendars above. 3129 DateFormat *formatters[] = { 3130 DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, Locale("en_US")), //calendar=gregorian 3131 DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, Locale("th_TH")), //calendar=buddhist 3132 // DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, Locale("he_IL@calendar=hebrew")), 3133 DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, Locale("ar_EG@calendar=islamic")), 3134 // DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, Locale("ja_JP@calendar=japanese")), 3135 NULL 3136 }; 3137 3138 UDate d = Calendar::getNow(); 3139 UnicodeString buf; 3140 FieldPosition fpos; 3141 ParsePosition ppos; 3142 3143 for (int i = 0; formatters[i] != NULL; i++) { 3144 buf.remove(); 3145 fpos.setBeginIndex(0); 3146 fpos.setEndIndex(0); 3147 calendars[i]->setTime(d, status); 3148 3149 // Normal case output - the given calendar matches the calendar 3150 // used by the formatter 3151 formatters[i]->format(*calendars[i], buf, fpos); 3152 UnicodeString refStr(buf); 3153 3154 for (int j = 0; calendars[j] != NULL; j++) { 3155 if (j == i) { 3156 continue; 3157 } 3158 buf.remove(); 3159 fpos.setBeginIndex(0); 3160 fpos.setEndIndex(0); 3161 calendars[j]->setTime(d, status); 3162 3163 // Even the different calendar type is specified, 3164 // we should get the same result. 3165 formatters[i]->format(*calendars[j], buf, fpos); 3166 if (refStr != buf) { 3167 errln((UnicodeString)"FAIL: Different format result with a different calendar for the same time -" 3168 + "\n Reference calendar type=" + calendars[i]->getType() 3169 + "\n Another calendar type=" + calendars[j]->getType() 3170 + "\n Expected result=" + refStr 3171 + "\n Actual result=" + buf); 3172 } 3173 } 3174 3175 calendars[i]->setTimeZone(*gmt); 3176 calendars[i]->clear(); 3177 ppos.setErrorIndex(-1); 3178 ppos.setIndex(0); 3179 3180 // Normal case parse result - the given calendar matches the calendar 3181 // used by the formatter 3182 formatters[i]->parse(refStr, *calendars[i], ppos); 3183 3184 for (int j = 0; calendars[j] != NULL; j++) { 3185 if (j == i) { 3186 continue; 3187 } 3188 calendars[j]->setTimeZone(*gmt); 3189 calendars[j]->clear(); 3190 ppos.setErrorIndex(-1); 3191 ppos.setIndex(0); 3192 3193 // Even the different calendar type is specified, 3194 // we should get the same time and time zone. 3195 formatters[i]->parse(refStr, *calendars[j], ppos); 3196 if (calendars[i]->getTime(status) != calendars[j]->getTime(status) 3197 || calendars[i]->getTimeZone() != calendars[j]->getTimeZone()) { 3198 UnicodeString tzid; 3199 errln((UnicodeString)"FAIL: Different parse result with a different calendar for the same string -" 3200 + "\n Reference calendar type=" + calendars[i]->getType() 3201 + "\n Another calendar type=" + calendars[j]->getType() 3202 + "\n Date string=" + refStr 3203 + "\n Expected time=" + calendars[i]->getTime(status) 3204 + "\n Expected time zone=" + calendars[i]->getTimeZone().getID(tzid) 3205 + "\n Actual time=" + calendars[j]->getTime(status) 3206 + "\n Actual time zone=" + calendars[j]->getTimeZone().getID(tzid)); 3207 } 3208 } 3209 if (U_FAILURE(status)) { 3210 errln((UnicodeString)"FAIL: " + u_errorName(status)); 3211 break; 3212 } 3213 } 3214 3215 delete tz; 3216 delete gmt; 3217 for (int i = 0; calendars[i] != NULL; i++) { 3218 delete calendars[i]; 3219 } 3220 for (int i = 0; formatters[i] != NULL; i++) { 3221 delete formatters[i]; 3222 } 3223 } 3224 3225 /* 3226 void DateFormatTest::TestRelativeError(void) 3227 { 3228 UErrorCode status; 3229 Locale en("en"); 3230 3231 DateFormat *en_reltime_reldate = DateFormat::createDateTimeInstance(DateFormat::kFullRelative,DateFormat::kFullRelative,en); 3232 if(en_reltime_reldate == NULL) { 3233 logln("PASS: rel date/rel time failed"); 3234 } else { 3235 errln("FAIL: rel date/rel time created, should have failed."); 3236 delete en_reltime_reldate; 3237 } 3238 } 3239 3240 void DateFormatTest::TestRelativeOther(void) 3241 { 3242 logln("Nothing in this test. When we get more data from CLDR, put in some tests of -2, +2, etc. "); 3243 } 3244 */ 3245 3246 void DateFormatTest::Test6338(void) 3247 { 3248 UErrorCode status = U_ZERO_ERROR; 3249 3250 SimpleDateFormat *fmt1 = new SimpleDateFormat(UnicodeString("y-M-d"), Locale("ar"), status); 3251 if (failure(status, "new SimpleDateFormat", TRUE)) return; 3252 3253 UDate dt1 = date(2008-1900, UCAL_JUNE, 10, 12, 00); 3254 UnicodeString str1; 3255 str1 = fmt1->format(dt1, str1); 3256 logln(str1); 3257 3258 UDate dt11 = fmt1->parse(str1, status); 3259 failure(status, "fmt->parse"); 3260 3261 UnicodeString str11; 3262 str11 = fmt1->format(dt11, str11); 3263 logln(str11); 3264 3265 if (str1 != str11) { 3266 errln((UnicodeString)"FAIL: Different dates str1:" + str1 3267 + " str2:" + str11); 3268 } 3269 delete fmt1; 3270 3271 ///////////////// 3272 3273 status = U_ZERO_ERROR; 3274 SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("y M d"), Locale("ar"), status); 3275 failure(status, "new SimpleDateFormat"); 3276 3277 UDate dt2 = date(2008-1900, UCAL_JUNE, 10, 12, 00); 3278 UnicodeString str2; 3279 str2 = fmt2->format(dt2, str2); 3280 logln(str2); 3281 3282 UDate dt22 = fmt2->parse(str2, status); 3283 failure(status, "fmt->parse"); 3284 3285 UnicodeString str22; 3286 str22 = fmt2->format(dt22, str22); 3287 logln(str22); 3288 3289 if (str2 != str22) { 3290 errln((UnicodeString)"FAIL: Different dates str1:" + str2 3291 + " str2:" + str22); 3292 } 3293 delete fmt2; 3294 3295 ///////////////// 3296 3297 status = U_ZERO_ERROR; 3298 SimpleDateFormat *fmt3 = new SimpleDateFormat(UnicodeString("y-M-d"), Locale("en-us"), status); 3299 failure(status, "new SimpleDateFormat"); 3300 3301 UDate dt3 = date(2008-1900, UCAL_JUNE, 10, 12, 00); 3302 UnicodeString str3; 3303 str3 = fmt3->format(dt3, str3); 3304 logln(str3); 3305 3306 UDate dt33 = fmt3->parse(str3, status); 3307 failure(status, "fmt->parse"); 3308 3309 UnicodeString str33; 3310 str33 = fmt3->format(dt33, str33); 3311 logln(str33); 3312 3313 if (str3 != str33) { 3314 errln((UnicodeString)"FAIL: Different dates str1:" + str3 3315 + " str2:" + str33); 3316 } 3317 delete fmt3; 3318 3319 ///////////////// 3320 3321 status = U_ZERO_ERROR; 3322 SimpleDateFormat *fmt4 = new SimpleDateFormat(UnicodeString("y M d"), Locale("en-us"), status); 3323 failure(status, "new SimpleDateFormat"); 3324 3325 UDate dt4 = date(2008-1900, UCAL_JUNE, 10, 12, 00); 3326 UnicodeString str4; 3327 str4 = fmt4->format(dt4, str4); 3328 logln(str4); 3329 3330 UDate dt44 = fmt4->parse(str4, status); 3331 failure(status, "fmt->parse"); 3332 3333 UnicodeString str44; 3334 str44 = fmt4->format(dt44, str44); 3335 logln(str44); 3336 3337 if (str4 != str44) { 3338 errln((UnicodeString)"FAIL: Different dates str1:" + str4 3339 + " str2:" + str44); 3340 } 3341 delete fmt4; 3342 3343 } 3344 3345 void DateFormatTest::Test6726(void) 3346 { 3347 // status 3348 // UErrorCode status = U_ZERO_ERROR; 3349 3350 // fmtf, fmtl, fmtm, fmts; 3351 UnicodeString strf, strl, strm, strs; 3352 UDate dt = date(2008-1900, UCAL_JUNE, 10, 12, 00); 3353 3354 Locale loc("ja"); 3355 DateFormat* fmtf = DateFormat::createDateTimeInstance(DateFormat::FULL, DateFormat::FULL, loc); 3356 DateFormat* fmtl = DateFormat::createDateTimeInstance(DateFormat::LONG, DateFormat::FULL, loc); 3357 DateFormat* fmtm = DateFormat::createDateTimeInstance(DateFormat::MEDIUM, DateFormat::FULL, loc); 3358 DateFormat* fmts = DateFormat::createDateTimeInstance(DateFormat::SHORT, DateFormat::FULL, loc); 3359 if (fmtf == NULL || fmtl == NULL || fmtm == NULL || fmts == NULL) { 3360 dataerrln("Unable to create DateFormat. got NULL."); 3361 /* It may not be true that if one is NULL all is NULL. Just to be safe. */ 3362 delete fmtf; 3363 delete fmtl; 3364 delete fmtm; 3365 delete fmts; 3366 3367 return; 3368 } 3369 strf = fmtf->format(dt, strf); 3370 strl = fmtl->format(dt, strl); 3371 strm = fmtm->format(dt, strm); 3372 strs = fmts->format(dt, strs); 3373 3374 3375 /* Locale data is not yet updated 3376 if (strf.charAt(13) == UChar(0x20)) { 3377 errln((UnicodeString)"FAIL: Improper formatted date: " + strf); 3378 } 3379 if (strl.charAt(10) == UChar(0x20)) { 3380 errln((UnicodeString)"FAIL: Improper formatted date: " + strl); 3381 } 3382 */ 3383 logln("strm.charAt(10)=%04X wanted 0x20\n", strm.charAt(10)); 3384 if (strm.charAt(10) != UChar(0x0020)) { 3385 errln((UnicodeString)"FAIL: Improper formatted date: " + strm ); 3386 } 3387 logln("strs.charAt(10)=%04X wanted 0x20\n", strs.charAt(8)); 3388 if (strs.charAt(8) != UChar(0x0020)) { 3389 errln((UnicodeString)"FAIL: Improper formatted date: " + strs); 3390 } 3391 3392 delete fmtf; 3393 delete fmtl; 3394 delete fmtm; 3395 delete fmts; 3396 3397 return; 3398 } 3399 3400 /** 3401 * Test DateFormat's parsing of default GMT variants. See ticket#6135 3402 */ 3403 void DateFormatTest::TestGMTParsing() { 3404 const char* DATA[] = { 3405 "HH:mm:ss Z", 3406 3407 // pattern, input, expected output (in quotes) 3408 "HH:mm:ss Z", "10:20:30 GMT+03:00", "10:20:30 +0300", 3409 "HH:mm:ss Z", "10:20:30 UT-02:00", "10:20:30 -0200", 3410 "HH:mm:ss Z", "10:20:30 GMT", "10:20:30 +0000", 3411 "HH:mm:ss vvvv", "10:20:30 UT+10:00", "10:20:30 +1000", 3412 "HH:mm:ss zzzz", "10:20:30 UTC", "10:20:30 +0000", // standalone "UTC" 3413 "ZZZZ HH:mm:ss", "UT 10:20:30", "10:20:30 +0000", 3414 "V HH:mm:ss", "UT+0130 10:20:30", "10:20:30 +0130", 3415 "V HH:mm:ss", "UTC+0130 10:20:30", NULL, // UTC+0130 is not a supported pattern 3416 "HH mm Z ss", "10 20 GMT-1100 30", "10:20:30 -1100", 3417 }; 3418 const int32_t DATA_len = sizeof(DATA)/sizeof(DATA[0]); 3419 expectParse(DATA, DATA_len, Locale("en")); 3420 } 3421 3422 // Test case for localized GMT format parsing 3423 // with no delimitters in offset format (Chinese locale) 3424 void DateFormatTest::Test6880() { 3425 UErrorCode status = U_ZERO_ERROR; 3426 UDate d1, d2, dp1, dp2, dexp1, dexp2; 3427 UnicodeString s1, s2; 3428 3429 TimeZone *tz = TimeZone::createTimeZone("Asia/Shanghai"); 3430 GregorianCalendar gcal(*tz, status); 3431 if (failure(status, "construct GregorianCalendar", TRUE)) return; 3432 3433 gcal.clear(); 3434 gcal.set(1910, UCAL_JULY, 1, 12, 00); // offset 8:05:52 3435 d1 = gcal.getTime(status); 3436 3437 gcal.clear(); 3438 gcal.set(1950, UCAL_JULY, 1, 12, 00); // offset 8:00 3439 d2 = gcal.getTime(status); 3440 3441 gcal.clear(); 3442 gcal.set(1970, UCAL_JANUARY, 1, 12, 00); 3443 dexp2 = gcal.getTime(status); 3444 dexp1 = dexp2 - (5*60 + 52)*1000; // subtract 5m52s 3445 3446 if (U_FAILURE(status)) { 3447 errln("FAIL: Gregorian calendar error"); 3448 } 3449 3450 DateFormat *fmt = DateFormat::createTimeInstance(DateFormat::kFull, Locale("zh")); 3451 if (fmt == NULL) { 3452 dataerrln("Unable to create DateFormat. Got NULL."); 3453 return; 3454 } 3455 fmt->adoptTimeZone(tz); 3456 3457 fmt->format(d1, s1); 3458 fmt->format(d2, s2); 3459 3460 dp1 = fmt->parse(s1, status); 3461 dp2 = fmt->parse(s2, status); 3462 3463 if (U_FAILURE(status)) { 3464 errln("FAIL: Parse failure"); 3465 } 3466 3467 if (dp1 != dexp1) { 3468 errln("FAIL: Failed to parse " + s1 + " parsed: " + dp1 + " expected: " + dexp1); 3469 } 3470 if (dp2 != dexp2) { 3471 errln("FAIL: Failed to parse " + s2 + " parsed: " + dp2 + " expected: " + dexp2); 3472 } 3473 3474 delete fmt; 3475 } 3476 3477 typedef struct { 3478 const char * localeStr; 3479 UBool lenient; 3480 UBool expectFail; 3481 UnicodeString datePattern; 3482 UnicodeString dateString; 3483 } NumAsStringItem; 3484 3485 void DateFormatTest::TestNumberAsStringParsing() 3486 { 3487 const NumAsStringItem items[] = { 3488 // loc lenient fail? datePattern dateString 3489 { "", FALSE, FALSE, UnicodeString("y MMMM d HH:mm:ss"), UnicodeString("2009 7 14 08:43:57") }, 3490 { "", TRUE, FALSE, UnicodeString("y MMMM d HH:mm:ss"), UnicodeString("2009 7 14 08:43:57") }, 3491 { "en", FALSE, FALSE, UnicodeString("MMM d, y"), UnicodeString("Jul 14, 2009") }, 3492 { "en", TRUE, FALSE, UnicodeString("MMM d, y"), UnicodeString("Jul 14, 2009") }, 3493 { "en", FALSE, TRUE, UnicodeString("MMM d, y"), UnicodeString("7 14, 2009") }, 3494 { "en", TRUE, FALSE, UnicodeString("MMM d, y"), UnicodeString("7 14, 2009") }, 3495 { "ja", FALSE, FALSE, UnicodeString("yyyy/MM/dd"), UnicodeString("2009/07/14") }, 3496 { "ja", TRUE, FALSE, UnicodeString("yyyy/MM/dd"), UnicodeString("2009/07/14") }, 3497 //{ "ja", FALSE, FALSE, UnicodeString("yyyy/MMMMM/d"), UnicodeString("2009/7/14") }, // #8860 covers test failure 3498 { "ja", TRUE, FALSE, UnicodeString("yyyy/MMMMM/d"), UnicodeString("2009/7/14") }, 3499 { "ja", FALSE, FALSE, CharsToUnicodeString("y\\u5E74M\\u6708d\\u65E5"), CharsToUnicodeString("2009\\u5E747\\u670814\\u65E5") }, 3500 { "ja", TRUE, FALSE, CharsToUnicodeString("y\\u5E74M\\u6708d\\u65E5"), CharsToUnicodeString("2009\\u5E747\\u670814\\u65E5") }, 3501 { "ja", FALSE, FALSE, CharsToUnicodeString("y\\u5E74MMMd\\u65E5"), CharsToUnicodeString("2009\\u5E747\\u670814\\u65E5") }, 3502 { "ja", TRUE, FALSE, CharsToUnicodeString("y\\u5E74MMMd\\u65E5"), CharsToUnicodeString("2009\\u5E747\\u670814\\u65E5") }, // #8820 fixes test failure 3503 { "ko", FALSE, FALSE, UnicodeString("yyyy. M. d."), UnicodeString("2009. 7. 14.") }, 3504 { "ko", TRUE, FALSE, UnicodeString("yyyy. M. d."), UnicodeString("2009. 7. 14.") }, 3505 { "ko", FALSE, FALSE, UnicodeString("yyyy. MMMMM d."), CharsToUnicodeString("2009. 7\\uC6D4 14.") }, 3506 { "ko", TRUE, FALSE, UnicodeString("yyyy. MMMMM d."), CharsToUnicodeString("2009. 7\\uC6D4 14.") }, // #8820 fixes test failure 3507 { "ko", FALSE, FALSE, CharsToUnicodeString("y\\uB144 M\\uC6D4 d\\uC77C"), CharsToUnicodeString("2009\\uB144 7\\uC6D4 14\\uC77C") }, 3508 { "ko", TRUE, FALSE, CharsToUnicodeString("y\\uB144 M\\uC6D4 d\\uC77C"), CharsToUnicodeString("2009\\uB144 7\\uC6D4 14\\uC77C") }, 3509 { "ko", FALSE, FALSE, CharsToUnicodeString("y\\uB144 MMM d\\uC77C"), CharsToUnicodeString("2009\\uB144 7\\uC6D4 14\\uC77C") }, 3510 { "ko", TRUE, FALSE, CharsToUnicodeString("y\\uB144 MMM d\\uC77C"), CharsToUnicodeString("2009\\uB144 7\\uC6D4 14\\uC77C") }, // #8820 fixes test failure 3511 { NULL, FALSE, FALSE, UnicodeString(""), UnicodeString("") } 3512 }; 3513 const NumAsStringItem * itemPtr; 3514 for (itemPtr = items; itemPtr->localeStr != NULL; itemPtr++ ) { 3515 Locale locale = Locale::createFromName(itemPtr->localeStr); 3516 UErrorCode status = U_ZERO_ERROR; 3517 SimpleDateFormat *formatter = new SimpleDateFormat(itemPtr->datePattern, locale, status); 3518 if (formatter == NULL || U_FAILURE(status)) { 3519 dataerrln("Unable to create SimpleDateFormat - %s", u_errorName(status)); 3520 return; 3521 } 3522 3523 formatter->setLenient(itemPtr->lenient); 3524 UDate date1 = formatter->parse(itemPtr->dateString, status); 3525 if (U_FAILURE(status)) { 3526 if (!itemPtr->expectFail) { 3527 errln("FAIL, err when expected success: Locale \"" + UnicodeString(itemPtr->localeStr) + "\", lenient " + itemPtr->lenient + 3528 ": using pattern \"" + itemPtr->datePattern + "\", could not parse \"" + itemPtr->dateString + "\"; err: " + u_errorName(status) ); 3529 } 3530 } else if (itemPtr->expectFail) { 3531 errln("FAIL, expected err but got none: Locale \"" + UnicodeString(itemPtr->localeStr) + "\", lenient " + itemPtr->lenient + 3532 ": using pattern \"" + itemPtr->datePattern + "\", did parse \"" + itemPtr->dateString + "\"." ); 3533 } else if (!itemPtr->lenient) { 3534 UnicodeString formatted; 3535 formatter->format(date1, formatted); 3536 if (formatted != itemPtr->dateString) { 3537 errln("FAIL, mismatch formatting parsed date: Locale \"" + UnicodeString(itemPtr->localeStr) + "\", lenient " + itemPtr->lenient + 3538 ": using pattern \"" + itemPtr->datePattern + "\", did parse \"" + itemPtr->dateString + "\", formatted result \"" + formatted + "\"."); 3539 } 3540 } 3541 3542 delete formatter; 3543 } 3544 } 3545 3546 void DateFormatTest::TestISOEra() { 3547 3548 const char* data[] = { 3549 // input, output 3550 "BC 4004-10-23T07:00:00Z", "BC 4004-10-23T07:00:00Z", 3551 "AD 4004-10-23T07:00:00Z", "AD 4004-10-23T07:00:00Z", 3552 "-4004-10-23T07:00:00Z" , "BC 4005-10-23T07:00:00Z", 3553 "4004-10-23T07:00:00Z" , "AD 4004-10-23T07:00:00Z", 3554 }; 3555 3556 int32_t numData = 8; 3557 3558 UErrorCode status = U_ZERO_ERROR; 3559 3560 // create formatter 3561 SimpleDateFormat *fmt1 = new SimpleDateFormat(UnicodeString("GGG yyyy-MM-dd'T'HH:mm:ss'Z"), status); 3562 failure(status, "new SimpleDateFormat", TRUE); 3563 if (status == U_MISSING_RESOURCE_ERROR) { 3564 if (fmt1 != NULL) { 3565 delete fmt1; 3566 } 3567 return; 3568 } 3569 for(int i=0; i < numData; i+=2) { 3570 // create input string 3571 UnicodeString in = data[i]; 3572 3573 // parse string to date 3574 UDate dt1 = fmt1->parse(in, status); 3575 failure(status, "fmt->parse", TRUE); 3576 3577 // format date back to string 3578 UnicodeString out; 3579 out = fmt1->format(dt1, out); 3580 logln(out); 3581 3582 // check that roundtrip worked as expected 3583 UnicodeString expected = data[i+1]; 3584 if (out != expected) { 3585 dataerrln((UnicodeString)"FAIL: " + in + " -> " + out + " expected -> " + expected); 3586 } 3587 } 3588 3589 delete fmt1; 3590 } 3591 void DateFormatTest::TestFormalChineseDate() { 3592 3593 UErrorCode status = U_ZERO_ERROR; 3594 UnicodeString pattern ("y\\u5e74M\\u6708d\\u65e5", -1, US_INV ); 3595 pattern = pattern.unescape(); 3596 UnicodeString override ("y=hanidec;M=hans;d=hans", -1, US_INV ); 3597 3598 // create formatter 3599 SimpleDateFormat *sdf = new SimpleDateFormat(pattern,override,Locale::getChina(),status); 3600 failure(status, "new SimpleDateFormat with override", TRUE); 3601 3602 UDate thedate = date(2009-1900, UCAL_JULY, 28); 3603 FieldPosition pos(0); 3604 UnicodeString result; 3605 sdf->format(thedate,result,pos); 3606 3607 UnicodeString expected = "\\u4e8c\\u3007\\u3007\\u4e5d\\u5e74\\u4e03\\u6708\\u4e8c\\u5341\\u516b\\u65e5"; 3608 expected = expected.unescape(); 3609 if (result != expected) { 3610 dataerrln((UnicodeString)"FAIL: -> " + result + " expected -> " + expected); 3611 } 3612 3613 UDate parsedate = sdf->parse(expected,status); 3614 if ( parsedate != thedate ) { 3615 UnicodeString pat1 ("yyyy-MM-dd'T'HH:mm:ss'Z'", -1, US_INV ); 3616 SimpleDateFormat *usf = new SimpleDateFormat(pat1,Locale::getEnglish(),status); 3617 UnicodeString parsedres,expres; 3618 usf->format(parsedate,parsedres,pos); 3619 usf->format(thedate,expres,pos); 3620 dataerrln((UnicodeString)"FAIL: parsed -> " + parsedres + " expected -> " + expres); 3621 delete usf; 3622 } 3623 delete sdf; 3624 } 3625 3626 // Test case for #8675 3627 // Incorrect parse offset with stand alone GMT string on 2nd or later iteration. 3628 void DateFormatTest::TestStandAloneGMTParse() { 3629 UErrorCode status = U_ZERO_ERROR; 3630 SimpleDateFormat *sdf = new SimpleDateFormat("ZZZZ", Locale(""), status); 3631 3632 if (!failure(status, "new SimpleDateFormat")) { 3633 3634 UnicodeString inText("GMT$$$"); 3635 for (int32_t i = 0; i < 10; i++) { 3636 ParsePosition pos(0); 3637 sdf->parse(inText, pos); 3638 if (pos.getIndex() != 3) { 3639 errln((UnicodeString)"FAIL: Incorrect output parse position: actual=" + pos.getIndex() + " expected=3"); 3640 } 3641 } 3642 3643 delete sdf; 3644 } 3645 } 3646 3647 #endif /* #if !UCONFIG_NO_FORMATTING */ 3648 3649 //eof 3650