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