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