| OLD | NEW |
| (Empty) |
| 1 /******************************************************************** | |
| 2 * COPYRIGHT: | |
| 3 * Copyright (c) 1997-2015, 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/localpointer.h" | |
| 13 #include "unicode/timezone.h" | |
| 14 #include "unicode/gregocal.h" | |
| 15 #include "unicode/smpdtfmt.h" | |
| 16 #include "unicode/datefmt.h" | |
| 17 #include "unicode/dtptngen.h" | |
| 18 #include "unicode/simpletz.h" | |
| 19 #include "unicode/strenum.h" | |
| 20 #include "unicode/dtfmtsym.h" | |
| 21 #include "cmemory.h" | |
| 22 #include "cstring.h" | |
| 23 #include "caltest.h" // for fieldName | |
| 24 #include <stdio.h> // for sprintf | |
| 25 | |
| 26 #if U_PLATFORM_HAS_WIN32_API | |
| 27 #include "windttst.h" | |
| 28 #endif | |
| 29 | |
| 30 #define ARRAY_SIZE(array) (sizeof array / sizeof array[0]) | |
| 31 | |
| 32 #define ASSERT_OK(status) if(U_FAILURE(status)) {errcheckln(status, #status " =
%s @ %s:%d", u_errorName(status), __FILE__, __LINE__); return; } | |
| 33 | |
| 34 // ***************************************************************************** | |
| 35 // class DateFormatTest | |
| 36 // ***************************************************************************** | |
| 37 | |
| 38 void DateFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &nam
e, char* /*par*/ ) | |
| 39 { | |
| 40 if(exec) { | |
| 41 logln("TestSuite DateFormatTest: "); | |
| 42 } | |
| 43 TESTCASE_AUTO_BEGIN; | |
| 44 TESTCASE_AUTO(TestPatterns); | |
| 45 TESTCASE_AUTO(TestEquals); | |
| 46 TESTCASE_AUTO(TestTwoDigitYearDSTParse); | |
| 47 TESTCASE_AUTO(TestFieldPosition); | |
| 48 TESTCASE_AUTO(TestPartialParse994); | |
| 49 TESTCASE_AUTO(TestRunTogetherPattern985); | |
| 50 TESTCASE_AUTO(TestRunTogetherPattern917); | |
| 51 TESTCASE_AUTO(TestCzechMonths459); | |
| 52 TESTCASE_AUTO(TestLetterDPattern212); | |
| 53 TESTCASE_AUTO(TestDayOfYearPattern195); | |
| 54 TESTCASE_AUTO(TestQuotePattern161); | |
| 55 TESTCASE_AUTO(TestBadInput135); | |
| 56 TESTCASE_AUTO(TestBadInput135a); | |
| 57 TESTCASE_AUTO(TestTwoDigitYear); | |
| 58 TESTCASE_AUTO(TestDateFormatZone061); | |
| 59 TESTCASE_AUTO(TestDateFormatZone146); | |
| 60 TESTCASE_AUTO(TestLocaleDateFormat); | |
| 61 TESTCASE_AUTO(TestFormattingLocaleTimeSeparator); | |
| 62 TESTCASE_AUTO(TestWallyWedel); | |
| 63 TESTCASE_AUTO(TestDateFormatCalendar); | |
| 64 TESTCASE_AUTO(TestSpaceParsing); | |
| 65 TESTCASE_AUTO(TestExactCountFormat); | |
| 66 TESTCASE_AUTO(TestWhiteSpaceParsing); | |
| 67 TESTCASE_AUTO(TestInvalidPattern); | |
| 68 TESTCASE_AUTO(TestGeneral); | |
| 69 TESTCASE_AUTO(TestGreekMay); | |
| 70 TESTCASE_AUTO(TestGenericTime); | |
| 71 TESTCASE_AUTO(TestGenericTimeZoneOrder); | |
| 72 TESTCASE_AUTO(TestHost); | |
| 73 TESTCASE_AUTO(TestEras); | |
| 74 TESTCASE_AUTO(TestNarrowNames); | |
| 75 TESTCASE_AUTO(TestShortDays); | |
| 76 TESTCASE_AUTO(TestStandAloneDays); | |
| 77 TESTCASE_AUTO(TestStandAloneMonths); | |
| 78 TESTCASE_AUTO(TestQuarters); | |
| 79 TESTCASE_AUTO(TestZTimeZoneParsing); | |
| 80 TESTCASE_AUTO(TestRelative); | |
| 81 TESTCASE_AUTO(TestRelativeClone); | |
| 82 TESTCASE_AUTO(TestHostClone); | |
| 83 TESTCASE_AUTO(TestHebrewClone); | |
| 84 TESTCASE_AUTO(TestDateFormatSymbolsClone); | |
| 85 TESTCASE_AUTO(TestTimeZoneDisplayName); | |
| 86 TESTCASE_AUTO(TestRoundtripWithCalendar); | |
| 87 TESTCASE_AUTO(Test6338); | |
| 88 TESTCASE_AUTO(Test6726); | |
| 89 TESTCASE_AUTO(TestGMTParsing); | |
| 90 TESTCASE_AUTO(Test6880); | |
| 91 TESTCASE_AUTO(TestISOEra); | |
| 92 TESTCASE_AUTO(TestFormalChineseDate); | |
| 93 TESTCASE_AUTO(TestNumberAsStringParsing); | |
| 94 TESTCASE_AUTO(TestStandAloneGMTParse); | |
| 95 TESTCASE_AUTO(TestParsePosition); | |
| 96 TESTCASE_AUTO(TestMonthPatterns); | |
| 97 TESTCASE_AUTO(TestContext); | |
| 98 TESTCASE_AUTO(TestNonGregoFmtParse); | |
| 99 /* | |
| 100 TESTCASE_AUTO(TestRelativeError); | |
| 101 TESTCASE_AUTO(TestRelativeOther); | |
| 102 */ | |
| 103 TESTCASE_AUTO(TestDotAndAtLeniency); | |
| 104 TESTCASE_AUTO(TestDateFormatLeniency); | |
| 105 TESTCASE_AUTO(TestParseMultiPatternMatch); | |
| 106 | |
| 107 TESTCASE_AUTO(TestParseLeniencyAPIs); | |
| 108 TESTCASE_AUTO(TestNumberFormatOverride); | |
| 109 TESTCASE_AUTO(TestCreateInstanceForSkeleton); | |
| 110 TESTCASE_AUTO(TestCreateInstanceForSkeletonDefault); | |
| 111 TESTCASE_AUTO(TestCreateInstanceForSkeletonWithCalendar); | |
| 112 TESTCASE_AUTO(TestDFSCreateForLocaleNonGregorianLocale); | |
| 113 TESTCASE_AUTO(TestDFSCreateForLocaleWithCalendarInLocale); | |
| 114 TESTCASE_AUTO(TestChangeCalendar); | |
| 115 | |
| 116 TESTCASE_AUTO_END; | |
| 117 } | |
| 118 | |
| 119 void DateFormatTest::TestPatterns() { | |
| 120 static const struct { | |
| 121 const char *actualPattern; | |
| 122 const char *expectedPattern; | |
| 123 const char *localeID; | |
| 124 const char *expectedLocalPattern; | |
| 125 } EXPECTED[] = { | |
| 126 {UDAT_YEAR, "y","en","y"}, | |
| 127 | |
| 128 {UDAT_QUARTER, "QQQQ", "en", "QQQQ"}, | |
| 129 {UDAT_ABBR_QUARTER, "QQQ", "en", "QQQ"}, | |
| 130 {UDAT_YEAR_QUARTER, "yQQQQ", "en", "QQQQ y"}, | |
| 131 {UDAT_YEAR_ABBR_QUARTER, "yQQQ", "en", "QQQ y"}, | |
| 132 | |
| 133 {UDAT_NUM_MONTH, "M", "en", "L"}, | |
| 134 {UDAT_ABBR_MONTH, "MMM", "en", "LLL"}, | |
| 135 {UDAT_MONTH, "MMMM", "en", "LLLL"}, | |
| 136 {UDAT_YEAR_NUM_MONTH, "yM","en","M/y"}, | |
| 137 {UDAT_YEAR_ABBR_MONTH, "yMMM","en","MMM y"}, | |
| 138 {UDAT_YEAR_MONTH, "yMMMM","en","MMMM y"}, | |
| 139 | |
| 140 {UDAT_DAY, "d","en","d"}, | |
| 141 {UDAT_YEAR_NUM_MONTH_DAY, "yMd", "en", "M/d/y"}, | |
| 142 {UDAT_YEAR_ABBR_MONTH_DAY, "yMMMd", "en", "MMM d, y"}, | |
| 143 {UDAT_YEAR_MONTH_DAY, "yMMMMd", "en", "MMMM d, y"}, | |
| 144 {UDAT_YEAR_NUM_MONTH_WEEKDAY_DAY, "yMEd", "en", "EEE, M/d/y"}, | |
| 145 {UDAT_YEAR_ABBR_MONTH_WEEKDAY_DAY, "yMMMEd", "en", "EEE, MMM d, y"}, | |
| 146 {UDAT_YEAR_MONTH_WEEKDAY_DAY, "yMMMMEEEEd", "en", "EEEE, MMMM d, y"}, | |
| 147 | |
| 148 {UDAT_NUM_MONTH_DAY, "Md","en","M/d"}, | |
| 149 {UDAT_ABBR_MONTH_DAY, "MMMd","en","MMM d"}, | |
| 150 {UDAT_MONTH_DAY, "MMMMd","en","MMMM d"}, | |
| 151 {UDAT_NUM_MONTH_WEEKDAY_DAY, "MEd","en","EEE, M/d"}, | |
| 152 {UDAT_ABBR_MONTH_WEEKDAY_DAY, "MMMEd","en","EEE, MMM d"}, | |
| 153 {UDAT_MONTH_WEEKDAY_DAY, "MMMMEEEEd","en","EEEE, MMMM d"}, | |
| 154 | |
| 155 {UDAT_HOUR, "j", "en", "h a"}, // (fixed expected result per ticket 6872
<-6626) | |
| 156 {UDAT_HOUR24, "H", "en", "HH"}, // (fixed expected result per ticket 687
2<-6626 | |
| 157 | |
| 158 {UDAT_MINUTE, "m", "en", "m"}, | |
| 159 {UDAT_HOUR_MINUTE, "jm","en","h:mm a"}, // (fixed expected result per ti
cket 6872<-7180) | |
| 160 {UDAT_HOUR24_MINUTE, "Hm", "en", "HH:mm"}, // (fixed expected result per
ticket 6872<-6626) | |
| 161 | |
| 162 {UDAT_SECOND, "s", "en", "s"}, | |
| 163 {UDAT_HOUR_MINUTE_SECOND, "jms","en","h:mm:ss a"}, // (fixed expected re
sult per ticket 6872<-7180) | |
| 164 {UDAT_HOUR24_MINUTE_SECOND, "Hms","en","HH:mm:ss"}, // (fixed expected r
esult per ticket 6872<-6626) | |
| 165 {UDAT_MINUTE_SECOND, "ms", "en", "mm:ss"}, // (fixed expected result per
ticket 6872<-6626) | |
| 166 | |
| 167 {UDAT_LOCATION_TZ, "VVVV", "en", "VVVV"}, | |
| 168 {UDAT_GENERIC_TZ, "vvvv", "en", "vvvv"}, | |
| 169 {UDAT_ABBR_GENERIC_TZ, "v", "en", "v"}, | |
| 170 {UDAT_SPECIFIC_TZ, "zzzz", "en", "zzzz"}, | |
| 171 {UDAT_ABBR_SPECIFIC_TZ, "z", "en", "z"}, | |
| 172 {UDAT_ABBR_UTC_TZ, "ZZZZ", "en", "ZZZZ"}, | |
| 173 | |
| 174 {UDAT_YEAR_NUM_MONTH_DAY UDAT_ABBR_UTC_TZ, "yMdZZZZ", "en", "M/d/y, ZZZZ
"}, | |
| 175 {UDAT_MONTH_DAY UDAT_LOCATION_TZ, "MMMMdVVVV", "en", "MMMM d, VVVV"} | |
| 176 }; | |
| 177 | |
| 178 IcuTestErrorCode errorCode(*this, "TestPatterns()"); | |
| 179 for (int32_t i = 0; i < UPRV_LENGTHOF(EXPECTED); i++) { | |
| 180 // Verify that patterns have the correct values | |
| 181 UnicodeString actualPattern(EXPECTED[i].actualPattern, -1, US_INV); | |
| 182 UnicodeString expectedPattern(EXPECTED[i].expectedPattern, -1, US_INV); | |
| 183 Locale locale(EXPECTED[i].localeID); | |
| 184 if (actualPattern != expectedPattern) { | |
| 185 errln("FAILURE! Expected pattern: " + expectedPattern + | |
| 186 " but was: " + actualPattern); | |
| 187 } | |
| 188 | |
| 189 // Verify that DataFormat instances produced contain the correct | |
| 190 // localized patterns | |
| 191 // TODO: use DateFormat::getInstanceForSkeleton(), ticket #9029 | |
| 192 // Java test code: | |
| 193 // DateFormat date1 = DateFormat.getPatternInstance(actualPattern, | |
| 194 // locale); | |
| 195 // DateFormat date2 = DateFormat.getPatternInstance(Calendar.getInstance
(locale), | |
| 196 // actualPattern, locale); | |
| 197 LocalPointer<DateTimePatternGenerator> generator( | |
| 198 DateTimePatternGenerator::createInstance(locale, errorCode)); | |
| 199 if(errorCode.logDataIfFailureAndReset("DateTimePatternGenerator::createI
nstance() failed for locale ID \"%s\"", EXPECTED[i].localeID)) { | |
| 200 continue; | |
| 201 } | |
| 202 UnicodeString pattern = generator->getBestPattern(actualPattern, errorCo
de); | |
| 203 SimpleDateFormat date1(pattern, locale, errorCode); | |
| 204 SimpleDateFormat date2(pattern, locale, errorCode); | |
| 205 date2.adoptCalendar(Calendar::createInstance(locale, errorCode)); | |
| 206 if(errorCode.logIfFailureAndReset("DateFormat::getInstanceForSkeleton()
failed")) { | |
| 207 errln(" for actualPattern \"%s\" & locale ID \"%s\"", | |
| 208 EXPECTED[i].actualPattern, EXPECTED[i].localeID); | |
| 209 continue; | |
| 210 } | |
| 211 | |
| 212 UnicodeString expectedLocalPattern(EXPECTED[i].expectedLocalPattern, -1,
US_INV); | |
| 213 UnicodeString actualLocalPattern1; | |
| 214 UnicodeString actualLocalPattern2; | |
| 215 date1.toLocalizedPattern(actualLocalPattern1, errorCode); | |
| 216 date2.toLocalizedPattern(actualLocalPattern2, errorCode); | |
| 217 if (actualLocalPattern1 != expectedLocalPattern) { | |
| 218 errln("FAILURE! Expected local pattern: " + expectedLocalPattern | |
| 219 + " but was: " + actualLocalPattern1); | |
| 220 } | |
| 221 if (actualLocalPattern2 != expectedLocalPattern) { | |
| 222 errln("FAILURE! Expected local pattern: " + expectedLocalPattern | |
| 223 + " but was: " + actualLocalPattern2); | |
| 224 } | |
| 225 } | |
| 226 } | |
| 227 | |
| 228 // Test written by Wally Wedel and emailed to me. | |
| 229 void DateFormatTest::TestWallyWedel() | |
| 230 { | |
| 231 UErrorCode status = U_ZERO_ERROR; | |
| 232 /* | |
| 233 * Instantiate a TimeZone so we can get the ids. | |
| 234 */ | |
| 235 TimeZone *tz = new SimpleTimeZone(7,""); | |
| 236 /* | |
| 237 * Computational variables. | |
| 238 */ | |
| 239 int32_t offset, hours, minutes, seconds; | |
| 240 /* | |
| 241 * Instantiate a SimpleDateFormat set up to produce a full time | |
| 242 zone name. | |
| 243 */ | |
| 244 SimpleDateFormat *sdf = new SimpleDateFormat((UnicodeString)"zzzz", status); | |
| 245 /* | |
| 246 * A String array for the time zone ids. | |
| 247 */ | |
| 248 int32_t ids_length; | |
| 249 StringEnumeration* ids = TimeZone::createEnumeration(); | |
| 250 if (ids == NULL) { | |
| 251 dataerrln("Unable to create TimeZone enumeration."); | |
| 252 if (sdf != NULL) { | |
| 253 delete sdf; | |
| 254 } | |
| 255 return; | |
| 256 } | |
| 257 ids_length = ids->count(status); | |
| 258 /* | |
| 259 * How many ids do we have? | |
| 260 */ | |
| 261 logln("Time Zone IDs size: %d", ids_length); | |
| 262 /* | |
| 263 * Column headings (sort of) | |
| 264 */ | |
| 265 logln("Ordinal ID offset(h:m) name"); | |
| 266 /* | |
| 267 * Loop through the tzs. | |
| 268 */ | |
| 269 UDate today = Calendar::getNow(); | |
| 270 Calendar *cal = Calendar::createInstance(status); | |
| 271 for (int32_t i = 0; i < ids_length; i++) { | |
| 272 // logln(i + " " + ids[i]); | |
| 273 const UnicodeString* id = ids->snext(status); | |
| 274 TimeZone *ttz = TimeZone::createTimeZone(*id); | |
| 275 // offset = ttz.getRawOffset(); | |
| 276 cal->setTimeZone(*ttz); | |
| 277 cal->setTime(today, status); | |
| 278 offset = cal->get(UCAL_ZONE_OFFSET, status) + cal->get(UCAL_DST_OFFSET,
status); | |
| 279 // logln(i + " " + ids[i] + " offset " + offset); | |
| 280 const char* sign = "+"; | |
| 281 if (offset < 0) { | |
| 282 sign = "-"; | |
| 283 offset = -offset; | |
| 284 } | |
| 285 hours = offset/3600000; | |
| 286 minutes = (offset%3600000)/60000; | |
| 287 seconds = (offset%60000)/1000; | |
| 288 UnicodeString dstOffset = (UnicodeString)"" + sign + (hours < 10 ? "0" :
"") + | |
| 289 (int32_t)hours + ":" + (minutes < 10 ? "0" : "") + (int32_t)minutes; | |
| 290 if (seconds != 0) { | |
| 291 dstOffset = dstOffset + ":" + (seconds < 10 ? "0" : "") + seconds; | |
| 292 } | |
| 293 /* | |
| 294 * Instantiate a date so we can display the time zone name. | |
| 295 */ | |
| 296 sdf->setTimeZone(*ttz); | |
| 297 /* | |
| 298 * Format the output. | |
| 299 */ | |
| 300 UnicodeString fmtOffset; | |
| 301 FieldPosition pos(0); | |
| 302 sdf->format(today,fmtOffset, pos); | |
| 303 // UnicodeString fmtOffset = tzS.toString(); | |
| 304 UnicodeString *fmtDstOffset = 0; | |
| 305 if (fmtOffset.startsWith("GMT") && fmtOffset.length() != 3) | |
| 306 { | |
| 307 //fmtDstOffset = fmtOffset->substring(3); | |
| 308 fmtDstOffset = new UnicodeString(); | |
| 309 fmtOffset.extract(3, fmtOffset.length(), *fmtDstOffset); | |
| 310 } | |
| 311 /* | |
| 312 * Show our result. | |
| 313 */ | |
| 314 UBool ok = fmtDstOffset == 0 || *fmtDstOffset == dstOffset; | |
| 315 if (ok) | |
| 316 { | |
| 317 logln(UnicodeString() + i + " " + *id + " " + dstOffset + | |
| 318 " " + fmtOffset + | |
| 319 (fmtDstOffset != 0 ? " ok" : " ?")); | |
| 320 } | |
| 321 else | |
| 322 { | |
| 323 errln(UnicodeString() + i + " " + *id + " " + dstOffset + | |
| 324 " " + fmtOffset + " *** FAIL ***"); | |
| 325 } | |
| 326 delete ttz; | |
| 327 delete fmtDstOffset; | |
| 328 } | |
| 329 delete cal; | |
| 330 // delete ids; // TODO: BAD API | |
| 331 delete ids; | |
| 332 delete sdf; | |
| 333 delete tz; | |
| 334 } | |
| 335 | |
| 336 // ------------------------------------- | |
| 337 | |
| 338 /** | |
| 339 * Test operator== | |
| 340 */ | |
| 341 void | |
| 342 DateFormatTest::TestEquals() | |
| 343 { | |
| 344 DateFormat* fmtA = DateFormat::createDateTimeInstance(DateFormat::MEDIUM, Da
teFormat::FULL); | |
| 345 DateFormat* fmtB = DateFormat::createDateTimeInstance(DateFormat::MEDIUM, Da
teFormat::FULL); | |
| 346 if ( fmtA == NULL || fmtB == NULL){ | |
| 347 dataerrln("Error calling DateFormat::createDateTimeInstance"); | |
| 348 delete fmtA; | |
| 349 delete fmtB; | |
| 350 return; | |
| 351 } | |
| 352 | |
| 353 if (!(*fmtA == *fmtB)) errln((UnicodeString)"FAIL"); | |
| 354 delete fmtA; | |
| 355 delete fmtB; | |
| 356 | |
| 357 TimeZone* test = TimeZone::createTimeZone("PDT"); | |
| 358 delete test; | |
| 359 } | |
| 360 | |
| 361 // ------------------------------------- | |
| 362 | |
| 363 /** | |
| 364 * Test the parsing of 2-digit years. | |
| 365 */ | |
| 366 void | |
| 367 DateFormatTest::TestTwoDigitYearDSTParse(void) | |
| 368 { | |
| 369 UErrorCode status = U_ZERO_ERROR; | |
| 370 SimpleDateFormat* fullFmt = new SimpleDateFormat((UnicodeString)"EEE MMM dd
HH:mm:ss.SSS zzz yyyy G", status); | |
| 371 SimpleDateFormat *fmt = new SimpleDateFormat((UnicodeString)"dd-MMM-yy h:mm:
ss 'o''clock' a z", Locale::getEnglish(), status); | |
| 372 //DateFormat* fmt = DateFormat::createDateTimeInstance(DateFormat::MEDIUM, D
ateFormat::FULL, Locale::ENGLISH); | |
| 373 UnicodeString* s = new UnicodeString("03-Apr-04 2:20:47 o'clock AM PST", "")
; | |
| 374 TimeZone* defaultTZ = TimeZone::createDefault(); | |
| 375 TimeZone* PST = TimeZone::createTimeZone("PST"); | |
| 376 int32_t defaultOffset = defaultTZ->getRawOffset(); | |
| 377 int32_t PSTOffset = PST->getRawOffset(); | |
| 378 int32_t hour = 2 + (defaultOffset - PSTOffset) / (60*60*1000); | |
| 379 // hour is the expected hour of day, in units of seconds | |
| 380 hour = ((hour < 0) ? hour + 24 : hour) * 60*60; | |
| 381 | |
| 382 UnicodeString str; | |
| 383 | |
| 384 if(U_FAILURE(status)) { | |
| 385 dataerrln("Could not set up test. exitting - %s", u_errorName(status)); | |
| 386 return; | |
| 387 } | |
| 388 | |
| 389 UDate d = fmt->parse(*s, status); | |
| 390 logln(*s + " P> " + ((DateFormat*)fullFmt)->format(d, str)); | |
| 391 int32_t y, m, day, hr, min, sec; | |
| 392 dateToFields(d, y, m, day, hr, min, sec); | |
| 393 hour += defaultTZ->inDaylightTime(d, status) ? 1 : 0; | |
| 394 hr = hr*60*60; | |
| 395 if (hr != hour) | |
| 396 errln((UnicodeString)"FAIL: Should parse to hour " + hour + " but got "
+ hr); | |
| 397 | |
| 398 if (U_FAILURE(status)) | |
| 399 errln((UnicodeString)"FAIL: " + (int32_t)status); | |
| 400 | |
| 401 delete s; | |
| 402 delete fmt; | |
| 403 delete fullFmt; | |
| 404 delete PST; | |
| 405 delete defaultTZ; | |
| 406 } | |
| 407 | |
| 408 // ------------------------------------- | |
| 409 | |
| 410 UChar toHexString(int32_t i) { return (UChar)(i + (i < 10 ? 0x30 : (0x41 - 10)))
; } | |
| 411 | |
| 412 UnicodeString& | |
| 413 DateFormatTest::escape(UnicodeString& s) | |
| 414 { | |
| 415 UnicodeString buf; | |
| 416 for (int32_t i=0; i<s.length(); ++i) | |
| 417 { | |
| 418 UChar c = s[(int32_t)i]; | |
| 419 if (c <= (UChar)0x7F) buf += c; | |
| 420 else { | |
| 421 buf += (UChar)0x5c; buf += (UChar)0x55; | |
| 422 buf += toHexString((c & 0xF000) >> 12); | |
| 423 buf += toHexString((c & 0x0F00) >> 8); | |
| 424 buf += toHexString((c & 0x00F0) >> 4); | |
| 425 buf += toHexString(c & 0x000F); | |
| 426 } | |
| 427 } | |
| 428 return (s = buf); | |
| 429 } | |
| 430 | |
| 431 // ------------------------------------- | |
| 432 | |
| 433 /** | |
| 434 * This MUST be kept in sync with DateFormatSymbols.gPatternChars. | |
| 435 */ | |
| 436 #if UDAT_HAS_PATTERN_CHAR_FOR_TIME_SEPARATOR | |
| 437 static const char* PATTERN_CHARS = "GyMdkHmsSEDFwWahKzYeugAZvcLQqVUOXxr:"; | |
| 438 #else | |
| 439 static const char* PATTERN_CHARS = "GyMdkHmsSEDFwWahKzYeugAZvcLQqVUOXxr"; | |
| 440 #endif | |
| 441 | |
| 442 /** | |
| 443 * A list of the names of all the fields in DateFormat. | |
| 444 * This MUST be kept in sync with DateFormat. | |
| 445 */ | |
| 446 static const char* DATEFORMAT_FIELD_NAMES[] = { | |
| 447 "ERA_FIELD", | |
| 448 "YEAR_FIELD", | |
| 449 "MONTH_FIELD", | |
| 450 "DATE_FIELD", | |
| 451 "HOUR_OF_DAY1_FIELD", | |
| 452 "HOUR_OF_DAY0_FIELD", | |
| 453 "MINUTE_FIELD", | |
| 454 "SECOND_FIELD", | |
| 455 "MILLISECOND_FIELD", | |
| 456 "DAY_OF_WEEK_FIELD", | |
| 457 "DAY_OF_YEAR_FIELD", | |
| 458 "DAY_OF_WEEK_IN_MONTH_FIELD", | |
| 459 "WEEK_OF_YEAR_FIELD", | |
| 460 "WEEK_OF_MONTH_FIELD", | |
| 461 "AM_PM_FIELD", | |
| 462 "HOUR1_FIELD", | |
| 463 "HOUR0_FIELD", | |
| 464 "TIMEZONE_FIELD", | |
| 465 "YEAR_WOY_FIELD", | |
| 466 "DOW_LOCAL_FIELD", | |
| 467 "EXTENDED_YEAR_FIELD", | |
| 468 "JULIAN_DAY_FIELD", | |
| 469 "MILLISECONDS_IN_DAY_FIELD", | |
| 470 "TIMEZONE_RFC_FIELD", | |
| 471 "GENERIC_TIMEZONE_FIELD", | |
| 472 "STAND_ALONE_DAY_FIELD", | |
| 473 "STAND_ALONE_MONTH_FIELD", | |
| 474 "QUARTER_FIELD", | |
| 475 "STAND_ALONE_QUARTER_FIELD", | |
| 476 "TIMEZONE_SPECIAL_FIELD", | |
| 477 "YEAR_NAME_FIELD", | |
| 478 "TIMEZONE_LOCALIZED_GMT_OFFSET_FIELD", | |
| 479 "TIMEZONE_ISO_FIELD", | |
| 480 "TIMEZONE_ISO_LOCAL_FIELD", | |
| 481 "RELATED_YEAR_FIELD", | |
| 482 "UDAT_TIME_SEPARATOR_FIELD", | |
| 483 }; | |
| 484 | |
| 485 static const int32_t DATEFORMAT_FIELD_NAMES_LENGTH = | |
| 486 sizeof(DATEFORMAT_FIELD_NAMES) / sizeof(DATEFORMAT_FIELD_NAMES[0]); | |
| 487 | |
| 488 /** | |
| 489 * Verify that returned field position indices are correct. | |
| 490 */ | |
| 491 void DateFormatTest::TestFieldPosition() { | |
| 492 UErrorCode ec = U_ZERO_ERROR; | |
| 493 int32_t i, j, exp; | |
| 494 UnicodeString buf; | |
| 495 | |
| 496 // Verify data | |
| 497 DateFormatSymbols rootSyms(Locale(""), ec); | |
| 498 if (U_FAILURE(ec)) { | |
| 499 dataerrln("Unable to create DateFormatSymbols - %s", u_errorName(ec)); | |
| 500 return; | |
| 501 } | |
| 502 | |
| 503 // local pattern chars data is not longer loaded | |
| 504 // from icu locale bundle | |
| 505 assertEquals("patternChars", PATTERN_CHARS, rootSyms.getLocalPatternChars(bu
f)); | |
| 506 assertEquals("patternChars", PATTERN_CHARS, DateFormatSymbols::getPatternUCh
ars()); | |
| 507 assertTrue("DATEFORMAT_FIELD_NAMES", DATEFORMAT_FIELD_NAMES_LENGTH == UDAT_F
IELD_COUNT); | |
| 508 #if UDAT_HAS_PATTERN_CHAR_FOR_TIME_SEPARATOR | |
| 509 assertTrue("Data", UDAT_FIELD_COUNT == uprv_strlen(PATTERN_CHARS)); | |
| 510 #else | |
| 511 assertTrue("Data", UDAT_FIELD_COUNT == uprv_strlen(PATTERN_CHARS) + 1); // +
1 for missing TIME_SEPARATOR pattern char | |
| 512 #endif | |
| 513 | |
| 514 // Create test formatters | |
| 515 const int32_t COUNT = 4; | |
| 516 DateFormat* dateFormats[COUNT]; | |
| 517 dateFormats[0] = DateFormat::createDateTimeInstance(DateFormat::kFull, DateF
ormat::kFull, Locale::getUS()); | |
| 518 dateFormats[1] = DateFormat::createDateTimeInstance(DateFormat::kFull, DateF
ormat::kFull, Locale::getFrance()); | |
| 519 // Make the pattern "G y M d..." | |
| 520 buf.remove().append(PATTERN_CHARS); | |
| 521 for (j=buf.length()-1; j>=0; --j) buf.insert(j, (UChar)32/*' '*/); | |
| 522 dateFormats[2] = new SimpleDateFormat(buf, Locale::getUS(), ec); | |
| 523 // Make the pattern "GGGG yyyy MMMM dddd..." | |
| 524 for (j=buf.length()-1; j>=0; j-=2) { | |
| 525 for (i=0; i<3; ++i) { | |
| 526 buf.insert(j, buf.charAt(j)); | |
| 527 } | |
| 528 } | |
| 529 dateFormats[3] = new SimpleDateFormat(buf, Locale::getUS(), ec); | |
| 530 if(U_FAILURE(ec)){ | |
| 531 errln(UnicodeString("Could not create SimpleDateFormat object for locale
en_US. Error: " )+ UnicodeString(u_errorName(ec))); | |
| 532 return; | |
| 533 } | |
| 534 UDate aug13 = 871508052513.0; | |
| 535 | |
| 536 // Expected output field values for above DateFormats on aug13 | |
| 537 // Fields are given in order of DateFormat field number | |
| 538 const char* EXPECTED[] = { | |
| 539 "", "1997", "August", "13", "", "", "34", "12", "", "Wednesday", | |
| 540 "", "", "", "", "PM", "2", "", "Pacific Daylight Time", "", "", | |
| 541 "", "", "", "", "", "", "", "", "", "", | |
| 542 #if UDAT_HAS_PATTERN_CHAR_FOR_TIME_SEPARATOR | |
| 543 "", "", "", "", "", ":", | |
| 544 #else | |
| 545 "", "", "", "", "", "", | |
| 546 #endif | |
| 547 | |
| 548 "", "1997", "ao\\u00FBt", "13", "", "14", "34", "12", "", "mercredi", | |
| 549 "", "", "", "", "", "", "", "heure d\\u2019\\u00E9t\\u00E9 du Pacifique"
, "", "", | |
| 550 "", "", "", "", "", "", "", "", "", "", | |
| 551 #if UDAT_HAS_PATTERN_CHAR_FOR_TIME_SEPARATOR | |
| 552 "", "", "", "", "", ":", | |
| 553 #else | |
| 554 "", "", "", "", "", "", | |
| 555 #endif | |
| 556 | |
| 557 "AD", "1997", "8", "13", "14", "14", "34", "12", "5", "Wed", | |
| 558 "225", "2", "33", "3", "PM", "2", "2", "PDT", "1997", "4", | |
| 559 "1997", "2450674", "52452513", "-0700", "PT", "4", "8", "3", "3", "usla
x", | |
| 560 #if UDAT_HAS_PATTERN_CHAR_FOR_TIME_SEPARATOR | |
| 561 "1997", "GMT-7", "-07", "-07", "1997", ":", | |
| 562 #else | |
| 563 "1997", "GMT-7", "-07", "-07", "1997", "", | |
| 564 #endif | |
| 565 | |
| 566 "Anno Domini", "1997", "August", "0013", "0014", "0014", "0034", "0012",
"5130", "Wednesday", | |
| 567 "0225", "0002", "0033", "0003", "PM", "0002", "0002", "Pacific Daylight
Time", "1997", "Wednesday", | |
| 568 "1997", "2450674", "52452513", "GMT-07:00", "Pacific Time", "Wednesday"
, "August", "3rd quarter", "3rd quarter", "Los Angeles Time", | |
| 569 #if UDAT_HAS_PATTERN_CHAR_FOR_TIME_SEPARATOR | |
| 570 "1997", "GMT-07:00", "-0700", "-0700", "1997", ":", | |
| 571 #else | |
| 572 "1997", "GMT-07:00", "-0700", "-0700", "1997", "", | |
| 573 #endif | |
| 574 }; | |
| 575 | |
| 576 const int32_t EXPECTED_LENGTH = sizeof(EXPECTED)/sizeof(EXPECTED[0]); | |
| 577 | |
| 578 assertTrue("data size", EXPECTED_LENGTH == COUNT * UDAT_FIELD_COUNT); | |
| 579 | |
| 580 TimeZone* PT = TimeZone::createTimeZone("America/Los_Angeles"); | |
| 581 for (j = 0, exp = 0; j < COUNT; ++j) { | |
| 582 // String str; | |
| 583 DateFormat* df = dateFormats[j]; | |
| 584 df->setTimeZone(*PT); | |
| 585 SimpleDateFormat* sdtfmt = dynamic_cast<SimpleDateFormat*>(df); | |
| 586 if (sdtfmt != NULL) { | |
| 587 logln(" Pattern = " + sdtfmt->toPattern(buf.remove())); | |
| 588 } else { | |
| 589 logln(" Pattern = ? (not a SimpleDateFormat)"); | |
| 590 } | |
| 591 logln((UnicodeString)" Result = " + df->format(aug13, buf.remove())); | |
| 592 | |
| 593 int32_t expBase = exp; // save for later | |
| 594 for (i = 0; i < UDAT_FIELD_COUNT; ++i, ++exp) { | |
| 595 FieldPosition pos(i); | |
| 596 buf.remove(); | |
| 597 df->format(aug13, buf, pos); | |
| 598 UnicodeString field; | |
| 599 buf.extractBetween(pos.getBeginIndex(), pos.getEndIndex(), field); | |
| 600 assertEquals((UnicodeString)"field #" + i + " " + DATEFORMAT_FIELD_N
AMES[i], | |
| 601 ctou(EXPECTED[exp]), field); | |
| 602 } | |
| 603 | |
| 604 // test FieldPositionIterator API | |
| 605 logln("FieldPositionIterator"); | |
| 606 { | |
| 607 UErrorCode status = U_ZERO_ERROR; | |
| 608 FieldPositionIterator posIter; | |
| 609 FieldPosition fp; | |
| 610 | |
| 611 buf.remove(); | |
| 612 df->format(aug13, buf, &posIter, status); | |
| 613 while (posIter.next(fp)) { | |
| 614 int32_t i = fp.getField(); | |
| 615 UnicodeString field; | |
| 616 buf.extractBetween(fp.getBeginIndex(), fp.getEndIndex(), field); | |
| 617 assertEquals((UnicodeString)"field #" + i + " " + DATEFORMAT_FIELD_N
AMES[i], | |
| 618 ctou(EXPECTED[expBase + i]), field); | |
| 619 } | |
| 620 | |
| 621 } | |
| 622 } | |
| 623 | |
| 624 | |
| 625 // test null posIter | |
| 626 buf.remove(); | |
| 627 UErrorCode status = U_ZERO_ERROR; | |
| 628 dateFormats[0]->format(aug13, buf, NULL, status); | |
| 629 // if we didn't crash, we succeeded. | |
| 630 | |
| 631 for (i=0; i<COUNT; ++i) { | |
| 632 delete dateFormats[i]; | |
| 633 } | |
| 634 delete PT; | |
| 635 } | |
| 636 | |
| 637 // ------------------------------------- | |
| 638 | |
| 639 /** | |
| 640 * General parse/format tests. Add test cases as needed. | |
| 641 */ | |
| 642 void DateFormatTest::TestGeneral() { | |
| 643 const char* DATA[] = { | |
| 644 "yyyy MM dd HH:mm:ss.SSS", | |
| 645 | |
| 646 // Milliseconds are left-justified, since they format as fractions of a
second | |
| 647 "y/M/d H:mm:ss.S", "fp", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.
5", "2004 03 10 16:36:31.500", | |
| 648 "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", | |
| 649 "y/M/d H:mm:ss.SSS", "F", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31
.567", | |
| 650 "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", | |
| 651 }; | |
| 652 expect(DATA, ARRAY_SIZE(DATA), Locale("en", "", "")); | |
| 653 } | |
| 654 | |
| 655 // ------------------------------------- | |
| 656 | |
| 657 /** | |
| 658 * Verify that strings which contain incomplete specifications are parsed | |
| 659 * correctly. In some instances, this means not being parsed at all, and | |
| 660 * returning an appropriate error. | |
| 661 */ | |
| 662 void | |
| 663 DateFormatTest::TestPartialParse994() | |
| 664 { | |
| 665 UErrorCode status = U_ZERO_ERROR; | |
| 666 SimpleDateFormat* f = new SimpleDateFormat(status); | |
| 667 if (U_FAILURE(status)) { | |
| 668 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status)); | |
| 669 delete f; | |
| 670 return; | |
| 671 } | |
| 672 UDate null = 0; | |
| 673 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17 10:11:42", date(97, 1 - 1, 17, 1
0, 11, 42)); | |
| 674 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17 10:", null); | |
| 675 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17 10", null); | |
| 676 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17 ", null); | |
| 677 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/17", null); | |
| 678 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: UErrorCode received durin
g test: " + (int32_t)status); | |
| 679 delete f; | |
| 680 } | |
| 681 | |
| 682 // ------------------------------------- | |
| 683 | |
| 684 void | |
| 685 DateFormatTest::tryPat994(SimpleDateFormat* format, const char* pat, const char*
str, UDate expected) | |
| 686 { | |
| 687 UErrorCode status = U_ZERO_ERROR; | |
| 688 UDate null = 0; | |
| 689 logln(UnicodeString("Pattern \"") + pat + "\" String \"" + str + "\""); | |
| 690 //try { | |
| 691 format->applyPattern(pat); | |
| 692 UDate date = format->parse(str, status); | |
| 693 if (U_FAILURE(status) || date == null) | |
| 694 { | |
| 695 logln((UnicodeString)"ParseException: " + (int32_t)status); | |
| 696 if (expected != null) errln((UnicodeString)"FAIL: Expected " + dateT
oString(expected)); | |
| 697 } | |
| 698 else | |
| 699 { | |
| 700 UnicodeString f; | |
| 701 ((DateFormat*)format)->format(date, f); | |
| 702 logln(UnicodeString(" parse(") + str + ") -> " + dateToString(date))
; | |
| 703 logln((UnicodeString)" format -> " + f); | |
| 704 if (expected == null || | |
| 705 !(date == expected)) errln((UnicodeString)"FAIL: Expected null")
;//" + expected); | |
| 706 if (!(f == str)) errln(UnicodeString("FAIL: Expected ") + str); | |
| 707 } | |
| 708 //} | |
| 709 //catch(ParseException e) { | |
| 710 // logln((UnicodeString)"ParseException: " + e.getMessage()); | |
| 711 // if (expected != null) errln((UnicodeString)"FAIL: Expected " + dateToS
tring(expected)); | |
| 712 //} | |
| 713 //catch(Exception e) { | |
| 714 // errln((UnicodeString)"*** Exception:"); | |
| 715 // e.printStackTrace(); | |
| 716 //} | |
| 717 } | |
| 718 | |
| 719 // ------------------------------------- | |
| 720 | |
| 721 /** | |
| 722 * Verify the behavior of patterns in which digits for different fields run toge
ther | |
| 723 * without intervening separators. | |
| 724 */ | |
| 725 void | |
| 726 DateFormatTest::TestRunTogetherPattern985() | |
| 727 { | |
| 728 UErrorCode status = U_ZERO_ERROR; | |
| 729 UnicodeString format("yyyyMMddHHmmssSSS"); | |
| 730 UnicodeString now, then; | |
| 731 //UBool flag; | |
| 732 SimpleDateFormat *formatter = new SimpleDateFormat(format, status); | |
| 733 if (U_FAILURE(status)) { | |
| 734 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status)); | |
| 735 delete formatter; | |
| 736 return; | |
| 737 } | |
| 738 UDate date1 = Calendar::getNow(); | |
| 739 ((DateFormat*)formatter)->format(date1, now); | |
| 740 logln(now); | |
| 741 ParsePosition pos(0); | |
| 742 UDate date2 = formatter->parse(now, pos); | |
| 743 if (date2 == 0) then = UnicodeString("Parse stopped at ") + pos.getIndex(); | |
| 744 else ((DateFormat*)formatter)->format(date2, then); | |
| 745 logln(then); | |
| 746 if (!(date2 == date1)) errln((UnicodeString)"FAIL"); | |
| 747 delete formatter; | |
| 748 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: UErrorCode received durin
g test: " + (int32_t)status); | |
| 749 } | |
| 750 | |
| 751 // ------------------------------------- | |
| 752 | |
| 753 /** | |
| 754 * Verify the behavior of patterns in which digits for different fields run toge
ther | |
| 755 * without intervening separators. | |
| 756 */ | |
| 757 void | |
| 758 DateFormatTest::TestRunTogetherPattern917() | |
| 759 { | |
| 760 UErrorCode status = U_ZERO_ERROR; | |
| 761 SimpleDateFormat* fmt; | |
| 762 UnicodeString myDate; | |
| 763 fmt = new SimpleDateFormat((UnicodeString)"yyyy/MM/dd", status); | |
| 764 if (U_FAILURE(status)) { | |
| 765 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status)); | |
| 766 delete fmt; | |
| 767 return; | |
| 768 } | |
| 769 myDate = "1997/02/03"; | |
| 770 testIt917(fmt, myDate, date(97, 2 - 1, 3)); | |
| 771 delete fmt; | |
| 772 fmt = new SimpleDateFormat((UnicodeString)"yyyyMMdd", status); | |
| 773 myDate = "19970304"; | |
| 774 testIt917(fmt, myDate, date(97, 3 - 1, 4)); | |
| 775 delete fmt; | |
| 776 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: UErrorCode received durin
g test: " + (int32_t)status); | |
| 777 } | |
| 778 | |
| 779 // ------------------------------------- | |
| 780 | |
| 781 void | |
| 782 DateFormatTest::testIt917(SimpleDateFormat* fmt, UnicodeString& str, UDate expec
ted) | |
| 783 { | |
| 784 UErrorCode status = U_ZERO_ERROR; | |
| 785 UnicodeString pattern; | |
| 786 logln((UnicodeString)"pattern=" + fmt->toPattern(pattern) + " string=" + s
tr); | |
| 787 Formattable o; | |
| 788 //try { | |
| 789 ((Format*)fmt)->parseObject(str, o, status); | |
| 790 //} | |
| 791 if (U_FAILURE(status)) return; | |
| 792 //catch(ParseException e) { | |
| 793 // e.printStackTrace(); | |
| 794 // return; | |
| 795 //} | |
| 796 logln((UnicodeString)"Parsed object: " + dateToString(o.getDate())); | |
| 797 if (!(o.getDate() == expected)) errln((UnicodeString)"FAIL: Expected " + dat
eToString(expected)); | |
| 798 UnicodeString formatted; ((Format*)fmt)->format(o, formatted, status); | |
| 799 logln((UnicodeString)"Formatted string: " + formatted); | |
| 800 if (!(formatted == str)) errln((UnicodeString)"FAIL: Expected " + str); | |
| 801 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: UErrorCode received durin
g test: " + (int32_t)status); | |
| 802 } | |
| 803 | |
| 804 // ------------------------------------- | |
| 805 | |
| 806 /** | |
| 807 * Verify the handling of Czech June and July, which have the unique attribute t
hat | |
| 808 * one is a proper prefix substring of the other. | |
| 809 */ | |
| 810 void | |
| 811 DateFormatTest::TestCzechMonths459() | |
| 812 { | |
| 813 UErrorCode status = U_ZERO_ERROR; | |
| 814 DateFormat* fmt = DateFormat::createDateInstance(DateFormat::FULL, Locale("c
s", "", "")); | |
| 815 if (fmt == NULL){ | |
| 816 dataerrln("Error calling DateFormat::createDateInstance()"); | |
| 817 return; | |
| 818 } | |
| 819 | |
| 820 UnicodeString pattern; | |
| 821 logln((UnicodeString)"Pattern " + ((SimpleDateFormat*) fmt)->toPattern(patte
rn)); | |
| 822 UDate june = date(97, UCAL_JUNE, 15); | |
| 823 UDate july = date(97, UCAL_JULY, 15); | |
| 824 UnicodeString juneStr; fmt->format(june, juneStr); | |
| 825 UnicodeString julyStr; fmt->format(july, julyStr); | |
| 826 //try { | |
| 827 logln((UnicodeString)"format(June 15 1997) = " + juneStr); | |
| 828 UDate d = fmt->parse(juneStr, status); | |
| 829 UnicodeString s; fmt->format(d, s); | |
| 830 int32_t month,yr,day,hr,min,sec; dateToFields(d,yr,month,day,hr,min,sec)
; | |
| 831 logln((UnicodeString)" -> parse -> " + s + " (month = " + month + ")"); | |
| 832 if (month != UCAL_JUNE) errln((UnicodeString)"FAIL: Month should be June
"); | |
| 833 logln((UnicodeString)"format(July 15 1997) = " + julyStr); | |
| 834 d = fmt->parse(julyStr, status); | |
| 835 fmt->format(d, s); | |
| 836 dateToFields(d,yr,month,day,hr,min,sec); | |
| 837 logln((UnicodeString)" -> parse -> " + s + " (month = " + month + ")"); | |
| 838 if (month != UCAL_JULY) errln((UnicodeString)"FAIL: Month should be July
"); | |
| 839 //} | |
| 840 //catch(ParseException e) { | |
| 841 if (U_FAILURE(status)) | |
| 842 errln((UnicodeString)"Exception: " + (int32_t)status); | |
| 843 //} | |
| 844 delete fmt; | |
| 845 } | |
| 846 | |
| 847 // ------------------------------------- | |
| 848 | |
| 849 /** | |
| 850 * Test the handling of 'D' in patterns. | |
| 851 */ | |
| 852 void | |
| 853 DateFormatTest::TestLetterDPattern212() | |
| 854 { | |
| 855 UErrorCode status = U_ZERO_ERROR; | |
| 856 UnicodeString dateString("1995-040.05:01:29"); | |
| 857 UnicodeString bigD("yyyy-DDD.hh:mm:ss"); | |
| 858 UnicodeString littleD("yyyy-ddd.hh:mm:ss"); | |
| 859 UDate expLittleD = date(95, 0, 1, 5, 1, 29); | |
| 860 UDate expBigD = expLittleD + 39 * 24 * 3600000.0; | |
| 861 expLittleD = expBigD; // Expect the same, with default lenient parsing | |
| 862 logln((UnicodeString)"dateString= " + dateString); | |
| 863 SimpleDateFormat *formatter = new SimpleDateFormat(bigD, status); | |
| 864 if (U_FAILURE(status)) { | |
| 865 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status)); | |
| 866 delete formatter; | |
| 867 return; | |
| 868 } | |
| 869 ParsePosition pos(0); | |
| 870 UDate myDate = formatter->parse(dateString, pos); | |
| 871 logln((UnicodeString)"Using " + bigD + " -> " + myDate); | |
| 872 if (myDate != expBigD) errln((UnicodeString)"FAIL: bigD - Expected " + dateT
oString(expBigD)); | |
| 873 delete formatter; | |
| 874 formatter = new SimpleDateFormat(littleD, status); | |
| 875 ASSERT_OK(status); | |
| 876 pos = ParsePosition(0); | |
| 877 myDate = formatter->parse(dateString, pos); | |
| 878 logln((UnicodeString)"Using " + littleD + " -> " + dateToString(myDate)); | |
| 879 if (myDate != expLittleD) errln((UnicodeString)"FAIL: littleD - Expected " +
dateToString(expLittleD)); | |
| 880 delete formatter; | |
| 881 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: UErrorCode received durin
g test: " + (int32_t)status); | |
| 882 } | |
| 883 | |
| 884 // ------------------------------------- | |
| 885 | |
| 886 /** | |
| 887 * Test the day of year pattern. | |
| 888 */ | |
| 889 void | |
| 890 DateFormatTest::TestDayOfYearPattern195() | |
| 891 { | |
| 892 UErrorCode status = U_ZERO_ERROR; | |
| 893 UDate today = Calendar::getNow(); | |
| 894 int32_t year,month,day,hour,min,sec; dateToFields(today,year,month,day,hour,
min,sec); | |
| 895 UDate expected = date(year, month, day); | |
| 896 logln((UnicodeString)"Test Date: " + dateToString(today)); | |
| 897 SimpleDateFormat* sdf = (SimpleDateFormat*)DateFormat::createDateInstance(); | |
| 898 if (sdf == NULL){ | |
| 899 dataerrln("Error calling DateFormat::createDateInstance()"); | |
| 900 return; | |
| 901 } | |
| 902 tryPattern(*sdf, today, 0, expected); | |
| 903 tryPattern(*sdf, today, "G yyyy DDD", expected); | |
| 904 delete sdf; | |
| 905 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: UErrorCode received durin
g test: " + (int32_t)status); | |
| 906 } | |
| 907 | |
| 908 // ------------------------------------- | |
| 909 | |
| 910 void | |
| 911 DateFormatTest::tryPattern(SimpleDateFormat& sdf, UDate d, const char* pattern,
UDate expected) | |
| 912 { | |
| 913 UErrorCode status = U_ZERO_ERROR; | |
| 914 if (pattern != 0) sdf.applyPattern(pattern); | |
| 915 UnicodeString thePat; | |
| 916 logln((UnicodeString)"pattern: " + sdf.toPattern(thePat)); | |
| 917 UnicodeString formatResult; (*(DateFormat*)&sdf).format(d, formatResult); | |
| 918 logln((UnicodeString)" format -> " + formatResult); | |
| 919 // try { | |
| 920 UDate d2 = sdf.parse(formatResult, status); | |
| 921 logln((UnicodeString)" parse(" + formatResult + ") -> " + dateToString(d
2)); | |
| 922 if (d2 != expected) errln((UnicodeString)"FAIL: Expected " + dateToStrin
g(expected)); | |
| 923 UnicodeString format2; (*(DateFormat*)&sdf).format(d2, format2); | |
| 924 logln((UnicodeString)" format -> " + format2); | |
| 925 if (!(formatResult == format2)) errln((UnicodeString)"FAIL: Round trip d
rift"); | |
| 926 //} | |
| 927 //catch(Exception e) { | |
| 928 if (U_FAILURE(status)) | |
| 929 errln((UnicodeString)"Error: " + (int32_t)status); | |
| 930 //} | |
| 931 } | |
| 932 | |
| 933 // ------------------------------------- | |
| 934 | |
| 935 /** | |
| 936 * Test the handling of single quotes in patterns. | |
| 937 */ | |
| 938 void | |
| 939 DateFormatTest::TestQuotePattern161() | |
| 940 { | |
| 941 UErrorCode status = U_ZERO_ERROR; | |
| 942 SimpleDateFormat* formatter = new SimpleDateFormat((UnicodeString)"MM/dd/yyy
y 'at' hh:mm:ss a zzz", status); | |
| 943 if (U_FAILURE(status)) { | |
| 944 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status)); | |
| 945 delete formatter; | |
| 946 return; | |
| 947 } | |
| 948 UDate currentTime_1 = date(97, UCAL_AUGUST, 13, 10, 42, 28); | |
| 949 UnicodeString dateString; ((DateFormat*)formatter)->format(currentTime_1, da
teString); | |
| 950 UnicodeString exp("08/13/1997 at 10:42:28 AM "); | |
| 951 logln((UnicodeString)"format(" + dateToString(currentTime_1) + ") = " + date
String); | |
| 952 if (0 != dateString.compareBetween(0, exp.length(), exp, 0, exp.length())) e
rrln((UnicodeString)"FAIL: Expected " + exp); | |
| 953 delete formatter; | |
| 954 if (U_FAILURE(status)) errln((UnicodeString)"FAIL: UErrorCode received durin
g test: " + (int32_t)status); | |
| 955 } | |
| 956 | |
| 957 // ------------------------------------- | |
| 958 | |
| 959 /** | |
| 960 * Verify the correct behavior when handling invalid input strings. | |
| 961 */ | |
| 962 void | |
| 963 DateFormatTest::TestBadInput135() | |
| 964 { | |
| 965 UErrorCode status = U_ZERO_ERROR; | |
| 966 DateFormat::EStyle looks[] = { | |
| 967 DateFormat::SHORT, DateFormat::MEDIUM, DateFormat::LONG, DateFormat::FUL
L | |
| 968 }; | |
| 969 int32_t looks_length = (int32_t)(sizeof(looks) / sizeof(looks[0])); | |
| 970 const char* strings[] = { | |
| 971 "Mar 15", "Mar 15 1997", "asdf", "3/1/97 1:23:", "3/1/00 1:23:45 AM" | |
| 972 }; | |
| 973 int32_t strings_length = (int32_t)(sizeof(strings) / sizeof(strings[0])); | |
| 974 DateFormat *full = DateFormat::createDateTimeInstance(DateFormat::LONG, Date
Format::LONG); | |
| 975 if(full==NULL) { | |
| 976 dataerrln("could not create date time instance"); | |
| 977 return; | |
| 978 } | |
| 979 UnicodeString expected("March 1, 2000 at 1:23:45 AM "); | |
| 980 for (int32_t i = 0; i < strings_length;++i) { | |
| 981 const char* text = strings[i]; | |
| 982 for (int32_t j = 0; j < looks_length;++j) { | |
| 983 DateFormat::EStyle dateLook = looks[j]; | |
| 984 for (int32_t k = 0; k < looks_length;++k) { | |
| 985 DateFormat::EStyle timeLook = looks[k]; | |
| 986 DateFormat *df = DateFormat::createDateTimeInstance(dateLook, ti
meLook); | |
| 987 if (df == NULL){ | |
| 988 dataerrln("Error calling DateFormat::createDateTimeInstance(
)"); | |
| 989 continue; | |
| 990 } | |
| 991 UnicodeString prefix = UnicodeString(text) + ", " + dateLook + "
/" + timeLook + ": "; | |
| 992 //try { | |
| 993 UDate when = df->parse(text, status); | |
| 994 if (when == 0 && U_SUCCESS(status)) { | |
| 995 errln(prefix + "SHOULD NOT HAPPEN: parse returned 0."); | |
| 996 continue; | |
| 997 } | |
| 998 if (U_SUCCESS(status)) | |
| 999 { | |
| 1000 UnicodeString format; | |
| 1001 UnicodeString pattern; | |
| 1002 SimpleDateFormat* sdtfmt = dynamic_cast<SimpleDateFormat
*>(df); | |
| 1003 if (sdtfmt != NULL) { | |
| 1004 sdtfmt->toPattern(pattern); | |
| 1005 } | |
| 1006 full->format(when, format); | |
| 1007 logln(prefix + "OK: " + format); | |
| 1008 if (0!=format.compareBetween(0, expected.length(), expec
ted, 0, expected.length())) | |
| 1009 errln((UnicodeString)"FAIL: Parse \"" + text + "\",
pattern \"" + pattern + "\", expected " + expected + " got " + format); | |
| 1010 } | |
| 1011 //} | |
| 1012 //catch(ParseException e) { | |
| 1013 else | |
| 1014 status = U_ZERO_ERROR; | |
| 1015 //} | |
| 1016 //catch(StringIndexOutOfBoundsException e) { | |
| 1017 // errln(prefix + "SHOULD NOT HAPPEN: " + (int)status); | |
| 1018 //} | |
| 1019 delete df; | |
| 1020 } | |
| 1021 } | |
| 1022 } | |
| 1023 delete full; | |
| 1024 if (U_FAILURE(status)) | |
| 1025 errln((UnicodeString)"FAIL: UErrorCode received during test: " + (int32_
t)status); | |
| 1026 } | |
| 1027 | |
| 1028 static const char* const parseFormats[] = { | |
| 1029 "MMMM d, yyyy", | |
| 1030 "MMMM d yyyy", | |
| 1031 "M/d/yy", | |
| 1032 "d MMMM, yyyy", | |
| 1033 "d MMMM yyyy", | |
| 1034 "d MMMM", | |
| 1035 "MMMM d", | |
| 1036 "yyyy", | |
| 1037 "h:mm a MMMM d, yyyy" | |
| 1038 }; | |
| 1039 | |
| 1040 #if 0 | |
| 1041 // strict inputStrings | |
| 1042 static const char* const inputStrings[] = { | |
| 1043 "bogus string", 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 1044 "April 1, 1997", "April 1, 1997", 0, 0, 0, 0, 0, "April 1", 0, 0, | |
| 1045 "Jan 1, 1970", "January 1, 1970", 0, 0, 0, 0, 0, "January 1", 0, 0, | |
| 1046 "Jan 1 2037", 0, "January 1 2037", 0, 0, 0, 0, "January 1", 0, 0, | |
| 1047 "1/1/70", 0, 0, "1/1/70", 0, 0, 0, 0, "0001", 0, | |
| 1048 "5 May 1997", 0, 0, 0, 0, "5 May 1997", "5 May", 0, "0005", 0, | |
| 1049 "16 May", 0, 0, 0, 0, 0, "16 May", 0, "0016", 0, | |
| 1050 "April 30", 0, 0, 0, 0, 0, 0, "April 30", 0, 0, | |
| 1051 "1998", 0, 0, 0, 0, 0, 0, 0, "1998", 0, | |
| 1052 "1", 0, 0, 0, 0, 0, 0, 0, "0001", 0, | |
| 1053 "3:00 pm Jan 1, 1997", 0, 0, 0, 0, 0, 0, 0, "0003", "3:00 PM January 1, 1997
", | |
| 1054 }; | |
| 1055 #else | |
| 1056 // lenient inputStrings | |
| 1057 static const char* const inputStrings[] = { | |
| 1058 "bogus string", 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 1059 "April 1, 1997", "April 1, 1997", "April 1 1997", "4/1/97", 0, 0, 0, "April
1", 0, 0, | |
| 1060 "Jan 1, 1970", "January 1, 1970", "January 1 1970", "1/1/70", 0, 0, 0, "Janu
ary 1", 0, 0, | |
| 1061 "Jan 1 2037", "January 1, 2037", "January 1 2037", "1/1/37", 0, 0, 0, "Janua
ry 1", 0, 0, | |
| 1062 "1/1/70", "January 1, 0070", "January 1 0070", "1/1/70", "1 January, 0070",
"1 January 0070", "1 January", "January 1", "0001", 0, | |
| 1063 "5 May 1997", 0, 0, 0, "5 May, 1997", "5 May 1997", "5 May", 0, "0005", 0, | |
| 1064 "16 May", 0, 0, 0, 0, 0, "16 May", 0, "0016", 0, | |
| 1065 "April 30", 0, 0, 0, 0, 0, 0, "April 30", 0, 0, | |
| 1066 "1998", 0, 0, 0, 0, 0, 0, 0, "1998", 0, | |
| 1067 "1", 0, 0, 0, 0, 0, 0, 0, "0001", 0, | |
| 1068 "3:00 pm Jan 1, 1997", 0, 0, 0, 0, 0, 0, 0, "0003", "3:00 PM January 1, 1997
", | |
| 1069 }; | |
| 1070 #endif | |
| 1071 | |
| 1072 // ------------------------------------- | |
| 1073 | |
| 1074 /** | |
| 1075 * Verify the correct behavior when parsing an array of inputs against an | |
| 1076 * array of patterns, with known results. The results are encoded after | |
| 1077 * the input strings in each row. | |
| 1078 */ | |
| 1079 void | |
| 1080 DateFormatTest::TestBadInput135a() | |
| 1081 { | |
| 1082 UErrorCode status = U_ZERO_ERROR; | |
| 1083 SimpleDateFormat* dateParse = new SimpleDateFormat(status); | |
| 1084 if(U_FAILURE(status)) { | |
| 1085 dataerrln("Failed creating SimpleDateFormat with %s. Quitting test", u_error
Name(status)); | |
| 1086 delete dateParse; | |
| 1087 return; | |
| 1088 } | |
| 1089 const char* s; | |
| 1090 UDate date; | |
| 1091 const uint32_t PF_LENGTH = (int32_t)(sizeof(parseFormats)/sizeof(parseFormats[
0])); | |
| 1092 const uint32_t INPUT_LENGTH = (int32_t)(sizeof(inputStrings)/sizeof(inputStrin
gs[0])); | |
| 1093 | |
| 1094 dateParse->applyPattern("d MMMM, yyyy"); | |
| 1095 dateParse->adoptTimeZone(TimeZone::createDefault()); | |
| 1096 s = "not parseable"; | |
| 1097 UnicodeString thePat; | |
| 1098 logln(UnicodeString("Trying to parse \"") + s + "\" with " + dateParse->toPatt
ern(thePat)); | |
| 1099 //try { | |
| 1100 date = dateParse->parse(s, status); | |
| 1101 if (U_SUCCESS(status)) | |
| 1102 errln((UnicodeString)"FAIL: Expected exception during parse"); | |
| 1103 //} | |
| 1104 //catch(Exception ex) { | |
| 1105 else | |
| 1106 logln((UnicodeString)"Exception during parse: " + (int32_t)status); | |
| 1107 status = U_ZERO_ERROR; | |
| 1108 //} | |
| 1109 for (uint32_t i = 0; i < INPUT_LENGTH; i += (PF_LENGTH + 1)) { | |
| 1110 ParsePosition parsePosition(0); | |
| 1111 UnicodeString s( inputStrings[i]); | |
| 1112 for (uint32_t index = 0; index < PF_LENGTH;++index) { | |
| 1113 const char* expected = inputStrings[i + 1 + index]; | |
| 1114 dateParse->applyPattern(parseFormats[index]); | |
| 1115 dateParse->adoptTimeZone(TimeZone::createDefault()); | |
| 1116 //try { | |
| 1117 parsePosition.setIndex(0); | |
| 1118 date = dateParse->parse(s, parsePosition); | |
| 1119 if (parsePosition.getIndex() != 0) { | |
| 1120 UnicodeString s1, s2; | |
| 1121 s.extract(0, parsePosition.getIndex(), s1); | |
| 1122 s.extract(parsePosition.getIndex(), s.length(), s2); | |
| 1123 if (date == 0) { | |
| 1124 errln((UnicodeString)"ERROR: null result fmt=\"" + | |
| 1125 parseFormats[index] + | |
| 1126 "\" pos=" + parsePosition.getIndex() + " " + | |
| 1127 s1 + "|" + s2); | |
| 1128 } | |
| 1129 else { | |
| 1130 UnicodeString result; | |
| 1131 ((DateFormat*)dateParse)->format(date, result); | |
| 1132 logln((UnicodeString)"Parsed \"" + s + "\" using \"" + dateParse->toPa
ttern(thePat) + "\" to: " + result); | |
| 1133 if (expected == 0) | |
| 1134 errln((UnicodeString)"FAIL: Expected parse failure, got " + result); | |
| 1135 else if (!(result == expected)) | |
| 1136 errln(UnicodeString("FAIL: Parse \"") + s + UnicodeString("\", expec
ted ") + expected + UnicodeString(", got ") + result); | |
| 1137 } | |
| 1138 } | |
| 1139 else if (expected != 0) { | |
| 1140 errln(UnicodeString("FAIL: Expected ") + expected + " from \"" + | |
| 1141 s + "\" with \"" + dateParse->toPattern(thePat) + "\""); | |
| 1142 } | |
| 1143 //} | |
| 1144 //catch(Exception ex) { | |
| 1145 if (U_FAILURE(status)) | |
| 1146 errln((UnicodeString)"An exception was thrown during parse: " + (int32_t
)status); | |
| 1147 //} | |
| 1148 } | |
| 1149 } | |
| 1150 delete dateParse; | |
| 1151 if (U_FAILURE(status)) | |
| 1152 errln((UnicodeString)"FAIL: UErrorCode received during test: " + (int32_t)st
atus); | |
| 1153 } | |
| 1154 | |
| 1155 // ------------------------------------- | |
| 1156 | |
| 1157 /** | |
| 1158 * Test the parsing of two-digit years. | |
| 1159 */ | |
| 1160 void | |
| 1161 DateFormatTest::TestTwoDigitYear() | |
| 1162 { | |
| 1163 UErrorCode ec = U_ZERO_ERROR; | |
| 1164 SimpleDateFormat fmt("dd/MM/yy", Locale::getUK(), ec); | |
| 1165 if (U_FAILURE(ec)) { | |
| 1166 dataerrln("FAIL: SimpleDateFormat constructor - %s", u_errorName(ec)); | |
| 1167 return; | |
| 1168 } | |
| 1169 parse2DigitYear(fmt, "5/6/30", date(130, UCAL_JUNE, 5)); | |
| 1170 parse2DigitYear(fmt, "4/6/50", date(50, UCAL_JUNE, 4)); | |
| 1171 } | |
| 1172 | |
| 1173 // ------------------------------------- | |
| 1174 | |
| 1175 void | |
| 1176 DateFormatTest::parse2DigitYear(DateFormat& fmt, const char* str, UDate expected
) | |
| 1177 { | |
| 1178 UErrorCode status = U_ZERO_ERROR; | |
| 1179 //try { | |
| 1180 UDate d = fmt.parse(str, status); | |
| 1181 UnicodeString thePat; | |
| 1182 logln(UnicodeString("Parsing \"") + str + "\" with " + ((SimpleDateForma
t*)&fmt)->toPattern(thePat) + | |
| 1183 " => " + dateToString(d)); | |
| 1184 if (d != expected) errln((UnicodeString)"FAIL: Expected " + expected); | |
| 1185 //} | |
| 1186 //catch(ParseException e) { | |
| 1187 if (U_FAILURE(status)) | |
| 1188 errln((UnicodeString)"FAIL: Got exception"); | |
| 1189 //} | |
| 1190 } | |
| 1191 | |
| 1192 // ------------------------------------- | |
| 1193 | |
| 1194 /** | |
| 1195 * Test the formatting of time zones. | |
| 1196 */ | |
| 1197 void | |
| 1198 DateFormatTest::TestDateFormatZone061() | |
| 1199 { | |
| 1200 UErrorCode status = U_ZERO_ERROR; | |
| 1201 UDate date; | |
| 1202 DateFormat *formatter; | |
| 1203 date= 859248000000.0; | |
| 1204 logln((UnicodeString)"Date 1997/3/25 00:00 GMT: " + date); | |
| 1205 formatter = new SimpleDateFormat((UnicodeString)"dd-MMM-yyyyy HH:mm", Locale
::getUK(), status); | |
| 1206 if(U_FAILURE(status)) { | |
| 1207 dataerrln("Failed creating SimpleDateFormat with %s. Quitting test", u_err
orName(status)); | |
| 1208 delete formatter; | |
| 1209 return; | |
| 1210 } | |
| 1211 formatter->adoptTimeZone(TimeZone::createTimeZone("GMT")); | |
| 1212 UnicodeString temp; formatter->format(date, temp); | |
| 1213 logln((UnicodeString)"Formatted in GMT to: " + temp); | |
| 1214 //try { | |
| 1215 UDate tempDate = formatter->parse(temp, status); | |
| 1216 logln((UnicodeString)"Parsed to: " + dateToString(tempDate)); | |
| 1217 if (tempDate != date) errln((UnicodeString)"FAIL: Expected " + dateToStr
ing(date)); | |
| 1218 //} | |
| 1219 //catch(Throwable t) { | |
| 1220 if (U_FAILURE(status)) | |
| 1221 errln((UnicodeString)"Date Formatter throws: " + (int32_t)status); | |
| 1222 //} | |
| 1223 delete formatter; | |
| 1224 } | |
| 1225 | |
| 1226 // ------------------------------------- | |
| 1227 | |
| 1228 /** | |
| 1229 * Test the formatting of time zones. | |
| 1230 */ | |
| 1231 void | |
| 1232 DateFormatTest::TestDateFormatZone146() | |
| 1233 { | |
| 1234 TimeZone *saveDefault = TimeZone::createDefault(); | |
| 1235 | |
| 1236 //try { | |
| 1237 TimeZone *thedefault = TimeZone::createTimeZone("GMT"); | |
| 1238 TimeZone::setDefault(*thedefault); | |
| 1239 // java.util.Locale.setDefault(new java.util.Locale("ar", "", "")); | |
| 1240 | |
| 1241 // check to be sure... its GMT all right | |
| 1242 TimeZone *testdefault = TimeZone::createDefault(); | |
| 1243 UnicodeString testtimezone; | |
| 1244 testdefault->getID(testtimezone); | |
| 1245 if (testtimezone == "GMT") | |
| 1246 logln("Test timezone = " + testtimezone); | |
| 1247 else | |
| 1248 dataerrln("Test timezone should be GMT, not " + testtimezone); | |
| 1249 | |
| 1250 UErrorCode status = U_ZERO_ERROR; | |
| 1251 // now try to use the default GMT time zone | |
| 1252 GregorianCalendar *greenwichcalendar = | |
| 1253 new GregorianCalendar(1997, 3, 4, 23, 0, status); | |
| 1254 if (U_FAILURE(status)) { | |
| 1255 dataerrln("Fail new GregorianCalendar: %s", u_errorName(status)); | |
| 1256 } else { | |
| 1257 //*****************************greenwichcalendar.setTimeZone(TimeZon
e.getDefault()); | |
| 1258 //greenwichcalendar.set(1997, 3, 4, 23, 0); | |
| 1259 // try anything to set hour to 23:00 !!! | |
| 1260 greenwichcalendar->set(UCAL_HOUR_OF_DAY, 23); | |
| 1261 // get time | |
| 1262 UDate greenwichdate = greenwichcalendar->getTime(status); | |
| 1263 // format every way | |
| 1264 UnicodeString DATA [] = { | |
| 1265 UnicodeString("simple format: "), UnicodeString("04/04/97 23:00
GMT"), | |
| 1266 UnicodeString("MM/dd/yy HH:mm z"), | |
| 1267 UnicodeString("full format: "), UnicodeString("Friday, April
4, 1997 11:00:00 o'clock PM GMT"), | |
| 1268 UnicodeString("EEEE, MMMM d, yyyy h:mm:ss 'o''clock' a z"), | |
| 1269 UnicodeString("long format: "), UnicodeString("April 4, 1997
11:00:00 PM GMT"), | |
| 1270 UnicodeString("MMMM d, yyyy h:mm:ss a z"), | |
| 1271 UnicodeString("default format: "), UnicodeString("04-Apr-97 11:0
0:00 PM"), | |
| 1272 UnicodeString("dd-MMM-yy h:mm:ss a"), | |
| 1273 UnicodeString("short format: "), UnicodeString("4/4/97 11:00 P
M"), | |
| 1274 UnicodeString("M/d/yy h:mm a") | |
| 1275 }; | |
| 1276 int32_t DATA_length = (int32_t)(sizeof(DATA) / sizeof(DATA[0])); | |
| 1277 | |
| 1278 for (int32_t i=0; i<DATA_length; i+=3) { | |
| 1279 DateFormat *fmt = new SimpleDateFormat(DATA[i+2], Locale::getEng
lish(), status); | |
| 1280 if (U_FAILURE(status)) { | |
| 1281 dataerrln("Unable to create SimpleDateFormat - %s", u_errorN
ame(status)); | |
| 1282 break; | |
| 1283 } | |
| 1284 fmt->setCalendar(*greenwichcalendar); | |
| 1285 UnicodeString result; | |
| 1286 result = fmt->format(greenwichdate, result); | |
| 1287 logln(DATA[i] + result); | |
| 1288 if (result != DATA[i+1]) | |
| 1289 errln("FAIL: Expected " + DATA[i+1] + ", got " + result); | |
| 1290 delete fmt; | |
| 1291 } | |
| 1292 } | |
| 1293 //} | |
| 1294 //finally { | |
| 1295 TimeZone::adoptDefault(saveDefault); | |
| 1296 //} | |
| 1297 delete testdefault; | |
| 1298 delete greenwichcalendar; | |
| 1299 delete thedefault; | |
| 1300 | |
| 1301 | |
| 1302 } | |
| 1303 | |
| 1304 // ------------------------------------- | |
| 1305 | |
| 1306 /** | |
| 1307 * Test the formatting of dates in different locales. | |
| 1308 */ | |
| 1309 void | |
| 1310 DateFormatTest::TestLocaleDateFormat() // Bug 495 | |
| 1311 { | |
| 1312 UDate testDate = date(97, UCAL_SEPTEMBER, 15); | |
| 1313 DateFormat *dfFrench = DateFormat::createDateTimeInstance(DateFormat::FULL, | |
| 1314 DateFormat::FULL, Locale::getFrench()); | |
| 1315 DateFormat *dfUS = DateFormat::createDateTimeInstance(DateFormat::FULL, | |
| 1316 DateFormat::FULL, Locale::getUS()); | |
| 1317 UnicodeString expectedFRENCH ( "lundi 15 septembre 1997 \\u00E0 00:00:00 heu
re d\\u2019\\u00E9t\\u00E9 du Pacifique", -1, US_INV ); | |
| 1318 expectedFRENCH = expectedFRENCH.unescape(); | |
| 1319 UnicodeString expectedUS ( "Monday, September 15, 1997 at 12:00:00 AM Pacifi
c Daylight Time" ); | |
| 1320 logln((UnicodeString)"Date set to : " + dateToString(testDate)); | |
| 1321 UnicodeString out; | |
| 1322 if (dfUS == NULL || dfFrench == NULL){ | |
| 1323 dataerrln("Error calling DateFormat::createDateTimeInstance)"); | |
| 1324 delete dfUS; | |
| 1325 delete dfFrench; | |
| 1326 return; | |
| 1327 } | |
| 1328 | |
| 1329 dfFrench->format(testDate, out); | |
| 1330 logln((UnicodeString)"Date Formated with French Locale " + out); | |
| 1331 if (!(out == expectedFRENCH)) | |
| 1332 errln((UnicodeString)"FAIL: Expected " + expectedFRENCH); | |
| 1333 out.truncate(0); | |
| 1334 dfUS->format(testDate, out); | |
| 1335 logln((UnicodeString)"Date Formated with US Locale " + out); | |
| 1336 if (!(out == expectedUS)) | |
| 1337 errln((UnicodeString)"FAIL: Expected " + expectedUS); | |
| 1338 delete dfUS; | |
| 1339 delete dfFrench; | |
| 1340 } | |
| 1341 | |
| 1342 void | |
| 1343 DateFormatTest::TestFormattingLocaleTimeSeparator() | |
| 1344 { | |
| 1345 // This test not as useful is it once was, since timeSeparator | |
| 1346 // in the Arabic is changed back to ":" in CLDR 28. | |
| 1347 const UDate testDate = 874266720000.; // Sun Sep 14 21:52:00 CET 1997 | |
| 1348 logln((UnicodeString)"Date set to : " + dateToString(testDate)); | |
| 1349 | |
| 1350 const LocalPointer<const TimeZone> tz(TimeZone::createTimeZone("CET")); | |
| 1351 | |
| 1352 const LocalPointer<DateFormat> dfArab(DateFormat::createTimeInstance( | |
| 1353 DateFormat::SHORT, Locale("ar"))); | |
| 1354 | |
| 1355 const LocalPointer<DateFormat> dfLatn(DateFormat::createTimeInstance( | |
| 1356 DateFormat::SHORT, Locale("ar", NULL, NULL, "numbers=latn"))); | |
| 1357 | |
| 1358 if (dfLatn.isNull() || dfArab.isNull()) { | |
| 1359 dataerrln("Error calling DateFormat::createTimeInstance()"); | |
| 1360 return; | |
| 1361 } | |
| 1362 | |
| 1363 dfArab->setTimeZone(*tz); | |
| 1364 dfLatn->setTimeZone(*tz); | |
| 1365 | |
| 1366 const UnicodeString expectedArab = UnicodeString( | |
| 1367 "\\u0669:\\u0665\\u0662 \\u0645", -1, US_INV).unescape(); | |
| 1368 | |
| 1369 const UnicodeString expectedLatn = UnicodeString( | |
| 1370 "9:52 \\u0645", -1, US_INV).unescape(); | |
| 1371 | |
| 1372 UnicodeString actualArab; | |
| 1373 UnicodeString actualLatn; | |
| 1374 | |
| 1375 dfArab->format(testDate, actualArab); | |
| 1376 dfLatn->format(testDate, actualLatn); | |
| 1377 | |
| 1378 assertEquals("Arab", expectedArab, actualArab); | |
| 1379 assertEquals("Latn", expectedLatn, actualLatn); | |
| 1380 } | |
| 1381 | |
| 1382 /** | |
| 1383 * Test DateFormat(Calendar) API | |
| 1384 */ | |
| 1385 void DateFormatTest::TestDateFormatCalendar() { | |
| 1386 DateFormat *date=0, *time=0, *full=0; | |
| 1387 Calendar *cal=0; | |
| 1388 UnicodeString str; | |
| 1389 ParsePosition pos; | |
| 1390 UDate when; | |
| 1391 UErrorCode ec = U_ZERO_ERROR; | |
| 1392 | |
| 1393 /* Create a formatter for date fields. */ | |
| 1394 date = DateFormat::createDateInstance(DateFormat::kShort, Locale::getUS()); | |
| 1395 if (date == NULL) { | |
| 1396 dataerrln("FAIL: createDateInstance failed"); | |
| 1397 goto FAIL; | |
| 1398 } | |
| 1399 | |
| 1400 /* Create a formatter for time fields. */ | |
| 1401 time = DateFormat::createTimeInstance(DateFormat::kShort, Locale::getUS()); | |
| 1402 if (time == NULL) { | |
| 1403 errln("FAIL: createTimeInstance failed"); | |
| 1404 goto FAIL; | |
| 1405 } | |
| 1406 | |
| 1407 /* Create a full format for output */ | |
| 1408 full = DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFu
ll, | |
| 1409 Locale::getUS()); | |
| 1410 if (full == NULL) { | |
| 1411 errln("FAIL: createInstance failed"); | |
| 1412 goto FAIL; | |
| 1413 } | |
| 1414 | |
| 1415 /* Create a calendar */ | |
| 1416 cal = Calendar::createInstance(Locale::getUS(), ec); | |
| 1417 if (cal == NULL || U_FAILURE(ec)) { | |
| 1418 errln((UnicodeString)"FAIL: Calendar::createInstance failed with " + | |
| 1419 u_errorName(ec)); | |
| 1420 goto FAIL; | |
| 1421 } | |
| 1422 | |
| 1423 /* Parse the date */ | |
| 1424 cal->clear(); | |
| 1425 str = UnicodeString("4/5/2001", ""); | |
| 1426 pos.setIndex(0); | |
| 1427 date->parse(str, *cal, pos); | |
| 1428 if (pos.getIndex() != str.length()) { | |
| 1429 errln((UnicodeString)"FAIL: DateFormat::parse(4/5/2001) failed at " + | |
| 1430 pos.getIndex()); | |
| 1431 goto FAIL; | |
| 1432 } | |
| 1433 | |
| 1434 /* Parse the time */ | |
| 1435 str = UnicodeString("5:45 PM", ""); | |
| 1436 pos.setIndex(0); | |
| 1437 time->parse(str, *cal, pos); | |
| 1438 if (pos.getIndex() != str.length()) { | |
| 1439 errln((UnicodeString)"FAIL: DateFormat::parse(17:45) failed at " + | |
| 1440 pos.getIndex()); | |
| 1441 goto FAIL; | |
| 1442 } | |
| 1443 | |
| 1444 /* Check result */ | |
| 1445 when = cal->getTime(ec); | |
| 1446 if (U_FAILURE(ec)) { | |
| 1447 errln((UnicodeString)"FAIL: cal->getTime() failed with " + u_errorName(e
c)); | |
| 1448 goto FAIL; | |
| 1449 } | |
| 1450 str.truncate(0); | |
| 1451 full->format(when, str); | |
| 1452 // Thursday, April 5, 2001 5:45:00 PM PDT 986517900000 | |
| 1453 if (when == 986517900000.0) { | |
| 1454 logln("Ok: Parsed result: " + str); | |
| 1455 } else { | |
| 1456 errln("FAIL: Parsed result: " + str + ", exp 4/5/2001 5:45 PM"); | |
| 1457 } | |
| 1458 | |
| 1459 FAIL: | |
| 1460 delete date; | |
| 1461 delete time; | |
| 1462 delete full; | |
| 1463 delete cal; | |
| 1464 } | |
| 1465 | |
| 1466 /** | |
| 1467 * Test DateFormat's parsing of space characters. See jitterbug 1916. | |
| 1468 */ | |
| 1469 void DateFormatTest::TestSpaceParsing() { | |
| 1470 const char* DATA[] = { | |
| 1471 "yyyy MM dd HH:mm:ss", | |
| 1472 | |
| 1473 // pattern, input, expected parse or NULL if expect parse failure | |
| 1474 "MMMM d yy", " 04 05 06", "2006 04 05 00:00:00", | |
| 1475 NULL, "04 05 06", "2006 04 05 00:00:00", | |
| 1476 | |
| 1477 "MM d yy", " 04 05 06", "2006 04 05 00:00:00", | |
| 1478 NULL, "04 05 06", "2006 04 05 00:00:00", | |
| 1479 NULL, "04/05/06", "2006 04 05 00:00:00", | |
| 1480 NULL, "04-05-06", "2006 04 05 00:00:00", | |
| 1481 NULL, "04.05.06", "2006 04 05 00:00:00", | |
| 1482 NULL, "04 / 05 / 06", "2006 04 05 00:00:00", | |
| 1483 NULL, "Apr / 05/ 06", "2006 04 05 00:00:00", | |
| 1484 NULL, "Apr-05-06", "2006 04 05 00:00:00", | |
| 1485 NULL, "Apr 05, 2006", "2006 04 05 00:00:00", | |
| 1486 | |
| 1487 "MMMM d yy", " Apr 05 06", "2006 04 05 00:00:00", | |
| 1488 NULL, "Apr 05 06", "2006 04 05 00:00:00", | |
| 1489 NULL, "Apr05 06", "2006 04 05 00:00:00", | |
| 1490 | |
| 1491 "hh:mm:ss a", "12:34:56 PM", "1970 01 01 12:34:56", | |
| 1492 NULL, "12:34:56PM", "1970 01 01 12:34:56", | |
| 1493 NULL, "12.34.56PM", "1970 01 01 12:34:56", | |
| 1494 NULL, "12 : 34 : 56 PM", "1970 01 01 12:34:56", | |
| 1495 | |
| 1496 "MM d yy 'at' hh:mm:ss a", "04/05/06 12:34:56 PM", "2006 04 05 12:34:56"
, | |
| 1497 | |
| 1498 "MMMM dd yyyy hh:mm a", "September 27, 1964 21:56 PM", "1964 09 28 09:56
:00", | |
| 1499 NULL, "November 4, 2008 0:13 AM", "2008 11 04 00:13
:00", | |
| 1500 | |
| 1501 "HH'h'mm'min'ss's'", "12h34min56s", "1970 01 01 12:34:56", | |
| 1502 NULL, "12h34mi56s", "1970 01 01 12:34:56", | |
| 1503 NULL, "12h34m56s", "1970 01 01 12:34:56", | |
| 1504 NULL, "12:34:56", "1970 01 01 12:34:56" | |
| 1505 }; | |
| 1506 const int32_t DATA_len = sizeof(DATA)/sizeof(DATA[0]); | |
| 1507 | |
| 1508 expectParse(DATA, DATA_len, Locale("en")); | |
| 1509 } | |
| 1510 | |
| 1511 /** | |
| 1512 * Test handling of "HHmmss" pattern. | |
| 1513 */ | |
| 1514 void DateFormatTest::TestExactCountFormat() { | |
| 1515 const char* DATA[] = { | |
| 1516 "yyyy MM dd HH:mm:ss", | |
| 1517 | |
| 1518 // pattern, input, expected parse or NULL if expect parse failure | |
| 1519 "HHmmss", "123456", "1970 01 01 12:34:56", | |
| 1520 NULL, "12345", "1970 01 01 01:23:45", | |
| 1521 NULL, "1234", NULL, | |
| 1522 NULL, "00-05", NULL, | |
| 1523 NULL, "12-34", NULL, | |
| 1524 NULL, "00+05", NULL, | |
| 1525 "ahhmm", "PM730", "1970 01 01 19:30:00", | |
| 1526 }; | |
| 1527 const int32_t DATA_len = sizeof(DATA)/sizeof(DATA[0]); | |
| 1528 | |
| 1529 expectParse(DATA, DATA_len, Locale("en")); | |
| 1530 } | |
| 1531 | |
| 1532 /** | |
| 1533 * Test handling of white space. | |
| 1534 */ | |
| 1535 void DateFormatTest::TestWhiteSpaceParsing() { | |
| 1536 const char* DATA[] = { | |
| 1537 "yyyy MM dd", | |
| 1538 | |
| 1539 // pattern, input, expected parse or null if expect parse failure | |
| 1540 | |
| 1541 // Pattern space run should parse input text space run | |
| 1542 "MM d yy", " 04 01 03", "2003 04 01", | |
| 1543 NULL, " 04 01 03 ", "2003 04 01", | |
| 1544 }; | |
| 1545 const int32_t DATA_len = sizeof(DATA)/sizeof(DATA[0]); | |
| 1546 | |
| 1547 expectParse(DATA, DATA_len, Locale("en")); | |
| 1548 } | |
| 1549 | |
| 1550 | |
| 1551 void DateFormatTest::TestInvalidPattern() { | |
| 1552 UErrorCode ec = U_ZERO_ERROR; | |
| 1553 SimpleDateFormat f(UnicodeString("Yesterday"), ec); | |
| 1554 if (U_FAILURE(ec)) { | |
| 1555 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(ec)); | |
| 1556 return; | |
| 1557 } | |
| 1558 UnicodeString out; | |
| 1559 FieldPosition pos; | |
| 1560 f.format((UDate)0, out, pos); | |
| 1561 logln(out); | |
| 1562 // The bug is that the call to format() will crash. By not | |
| 1563 // crashing, the test passes. | |
| 1564 } | |
| 1565 | |
| 1566 void DateFormatTest::TestGreekMay() { | |
| 1567 UErrorCode ec = U_ZERO_ERROR; | |
| 1568 UDate date = -9896080848000.0; | |
| 1569 SimpleDateFormat fmt("EEEE, dd MMMM yyyy h:mm:ss a", Locale("el", "", ""), e
c); | |
| 1570 if (U_FAILURE(ec)) { | |
| 1571 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(ec)); | |
| 1572 return; | |
| 1573 } | |
| 1574 UnicodeString str; | |
| 1575 fmt.format(date, str); | |
| 1576 ParsePosition pos(0); | |
| 1577 UDate d2 = fmt.parse(str, pos); | |
| 1578 if (date != d2) { | |
| 1579 errln("FAIL: unable to parse strings where case-folding changes length")
; | |
| 1580 } | |
| 1581 } | |
| 1582 | |
| 1583 void DateFormatTest::TestStandAloneMonths() | |
| 1584 { | |
| 1585 const char *EN_DATA[] = { | |
| 1586 "yyyy MM dd HH:mm:ss", | |
| 1587 | |
| 1588 "yyyy LLLL dd H:mm:ss", "fp", "2004 03 10 16:36:31", "2004 March 10 16:3
6:31", "2004 03 10 16:36:31", | |
| 1589 "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", | |
| 1590 "yyyy LLLL dd H:mm:ss", "F", "2004 03 10 16:36:31", "2004 March 10 16:3
6:31", | |
| 1591 "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", | |
| 1592 | |
| 1593 "LLLL", "fp", "1970 01 01 0:00:00", "January", "1970 01 01 0:00:00", | |
| 1594 "LLLL", "fp", "1970 02 01 0:00:00", "February", "1970 02 01 0:00:00", | |
| 1595 "LLLL", "fp", "1970 03 01 0:00:00", "March", "1970 03 01 0:00:00", | |
| 1596 "LLLL", "fp", "1970 04 01 0:00:00", "April", "1970 04 01 0:00:00", | |
| 1597 "LLLL", "fp", "1970 05 01 0:00:00", "May", "1970 05 01 0:00:00", | |
| 1598 "LLLL", "fp", "1970 06 01 0:00:00", "June", "1970 06 01 0:00:00", | |
| 1599 "LLLL", "fp", "1970 07 01 0:00:00", "July", "1970 07 01 0:00:00", | |
| 1600 "LLLL", "fp", "1970 08 01 0:00:00", "August", "1970 08 01 0:00:00", | |
| 1601 "LLLL", "fp", "1970 09 01 0:00:00", "September", "1970 09 01 0:00:00", | |
| 1602 "LLLL", "fp", "1970 10 01 0:00:00", "October", "1970 10 01 0:00:00", | |
| 1603 "LLLL", "fp", "1970 11 01 0:00:00", "November", "1970 11 01 0:00:00", | |
| 1604 "LLLL", "fp", "1970 12 01 0:00:00", "December", "1970 12 01 0:00:00", | |
| 1605 | |
| 1606 "LLL", "fp", "1970 01 01 0:00:00", "Jan", "1970 01 01 0:00:00", | |
| 1607 "LLL", "fp", "1970 02 01 0:00:00", "Feb", "1970 02 01 0:00:00", | |
| 1608 "LLL", "fp", "1970 03 01 0:00:00", "Mar", "1970 03 01 0:00:00", | |
| 1609 "LLL", "fp", "1970 04 01 0:00:00", "Apr", "1970 04 01 0:00:00", | |
| 1610 "LLL", "fp", "1970 05 01 0:00:00", "May", "1970 05 01 0:00:00", | |
| 1611 "LLL", "fp", "1970 06 01 0:00:00", "Jun", "1970 06 01 0:00:00", | |
| 1612 "LLL", "fp", "1970 07 01 0:00:00", "Jul", "1970 07 01 0:00:00", | |
| 1613 "LLL", "fp", "1970 08 01 0:00:00", "Aug", "1970 08 01 0:00:00", | |
| 1614 "LLL", "fp", "1970 09 01 0:00:00", "Sep", "1970 09 01 0:00:00", | |
| 1615 "LLL", "fp", "1970 10 01 0:00:00", "Oct", "1970 10 01 0:00:00", | |
| 1616 "LLL", "fp", "1970 11 01 0:00:00", "Nov", "1970 11 01 0:00:00", | |
| 1617 "LLL", "fp", "1970 12 01 0:00:00", "Dec", "1970 12 01 0:00:00", | |
| 1618 }; | |
| 1619 | |
| 1620 const char *CS_DATA[] = { | |
| 1621 "yyyy MM dd HH:mm:ss", | |
| 1622 | |
| 1623 "yyyy LLLL dd H:mm:ss", "fp", "2004 04 10 16:36:31", "2004 duben 10 16:3
6:31", "2004 04 10 16:36:31", | |
| 1624 "yyyy MMMM dd H:mm:ss", "fp", "2004 04 10 16:36:31", "2004 dubna 10 16:3
6:31", "2004 04 10 16:36:31", | |
| 1625 "yyyy LLL dd H:mm:ss", "fp", "2004 04 10 16:36:31", "2004 dub 10 16:36:
31", "2004 04 10 16:36:31", | |
| 1626 "yyyy LLLL dd H:mm:ss", "F", "2004 04 10 16:36:31", "2004 duben 10 16:3
6:31", | |
| 1627 "yyyy MMMM dd H:mm:ss", "F", "2004 04 10 16:36:31", "2004 dubna 10 16:3
6:31", | |
| 1628 "yyyy LLLL dd H:mm:ss", "pf", "2004 duben 10 16:36:31", "2004 04 10 16:3
6:31", "2004 duben 10 16:36:31", | |
| 1629 "yyyy MMMM dd H:mm:ss", "pf", "2004 dubna 10 16:36:31", "2004 04 10 16:3
6:31", "2004 dubna 10 16:36:31", | |
| 1630 | |
| 1631 "LLLL", "fp", "1970 01 01 0:00:00", "leden", "1970 01 01 0
:00:00", | |
| 1632 "LLLL", "fp", "1970 02 01 0:00:00", "\\u00FAnor", "1970 02 01
0:00:00", | |
| 1633 "LLLL", "fp", "1970 03 01 0:00:00", "b\\u0159ezen", "1970 03 01
0:00:00", | |
| 1634 "LLLL", "fp", "1970 04 01 0:00:00", "duben", "1970 04 01 0
:00:00", | |
| 1635 "LLLL", "fp", "1970 05 01 0:00:00", "kv\\u011Bten", "1970 05 01
0:00:00", | |
| 1636 "LLLL", "fp", "1970 06 01 0:00:00", "\\u010Derven", "1970 06 01
0:00:00", | |
| 1637 "LLLL", "fp", "1970 07 01 0:00:00", "\\u010Dervenec", "1970 07 01
0:00:00", | |
| 1638 "LLLL", "fp", "1970 08 01 0:00:00", "srpen", "1970 08 01 0
:00:00", | |
| 1639 "LLLL", "fp", "1970 09 01 0:00:00", "z\\u00E1\\u0159\\u00ED", "1970 09 0
1 0:00:00", | |
| 1640 "LLLL", "fp", "1970 10 01 0:00:00", "\\u0159\\u00EDjen", "1970 10 01
0:00:00", | |
| 1641 "LLLL", "fp", "1970 11 01 0:00:00", "listopad", "1970 11 01 0
:00:00", | |
| 1642 "LLLL", "fp", "1970 12 01 0:00:00", "prosinec", "1970 12 01 0
:00:00", | |
| 1643 | |
| 1644 "LLL", "fp", "1970 01 01 0:00:00", "led", "1970 01 01 0:00:00", | |
| 1645 "LLL", "fp", "1970 02 01 0:00:00", "\\u00FAno", "1970 02 01 0:00:00", | |
| 1646 "LLL", "fp", "1970 03 01 0:00:00", "b\\u0159e", "1970 03 01 0:00:00", | |
| 1647 "LLL", "fp", "1970 04 01 0:00:00", "dub", "1970 04 01 0:00:00", | |
| 1648 "LLL", "fp", "1970 05 01 0:00:00", "kv\\u011B", "1970 05 01 0:00:00", | |
| 1649 "LLL", "fp", "1970 06 01 0:00:00", "\\u010Dvn", "1970 06 01 0:00:00", | |
| 1650 "LLL", "fp", "1970 07 01 0:00:00", "\\u010Dvc", "1970 07 01 0:00:00", | |
| 1651 "LLL", "fp", "1970 08 01 0:00:00", "srp", "1970 08 01 0:00:00", | |
| 1652 "LLL", "fp", "1970 09 01 0:00:00", "z\\u00E1\\u0159", "1970 09 01 0:00:
00", | |
| 1653 "LLL", "fp", "1970 10 01 0:00:00", "\\u0159\\u00EDj", "1970 10 01 0:00:0
0", | |
| 1654 "LLL", "fp", "1970 11 01 0:00:00", "lis", "1970 11 01 0:00:00", | |
| 1655 "LLL", "fp", "1970 12 01 0:00:00", "pro", "1970 12 01 0:00:00", | |
| 1656 }; | |
| 1657 | |
| 1658 expect(EN_DATA, ARRAY_SIZE(EN_DATA), Locale("en", "", "")); | |
| 1659 expect(CS_DATA, ARRAY_SIZE(CS_DATA), Locale("cs", "", "")); | |
| 1660 } | |
| 1661 | |
| 1662 void DateFormatTest::TestStandAloneDays() | |
| 1663 { | |
| 1664 const char *EN_DATA[] = { | |
| 1665 "yyyy MM dd HH:mm:ss", | |
| 1666 | |
| 1667 "cccc", "fp", "1970 01 04 0:00:00", "Sunday", "1970 01 04 0:00:00", | |
| 1668 "cccc", "fp", "1970 01 05 0:00:00", "Monday", "1970 01 05 0:00:00", | |
| 1669 "cccc", "fp", "1970 01 06 0:00:00", "Tuesday", "1970 01 06 0:00:00", | |
| 1670 "cccc", "fp", "1970 01 07 0:00:00", "Wednesday", "1970 01 07 0:00:00", | |
| 1671 "cccc", "fp", "1970 01 01 0:00:00", "Thursday", "1970 01 01 0:00:00", | |
| 1672 "cccc", "fp", "1970 01 02 0:00:00", "Friday", "1970 01 02 0:00:00", | |
| 1673 "cccc", "fp", "1970 01 03 0:00:00", "Saturday", "1970 01 03 0:00:00", | |
| 1674 | |
| 1675 "ccc", "fp", "1970 01 04 0:00:00", "Sun", "1970 01 04 0:00:00", | |
| 1676 "ccc", "fp", "1970 01 05 0:00:00", "Mon", "1970 01 05 0:00:00", | |
| 1677 "ccc", "fp", "1970 01 06 0:00:00", "Tue", "1970 01 06 0:00:00", | |
| 1678 "ccc", "fp", "1970 01 07 0:00:00", "Wed", "1970 01 07 0:00:00", | |
| 1679 "ccc", "fp", "1970 01 01 0:00:00", "Thu", "1970 01 01 0:00:00", | |
| 1680 "ccc", "fp", "1970 01 02 0:00:00", "Fri", "1970 01 02 0:00:00", | |
| 1681 "ccc", "fp", "1970 01 03 0:00:00", "Sat", "1970 01 03 0:00:00", | |
| 1682 }; | |
| 1683 | |
| 1684 const char *CS_DATA[] = { | |
| 1685 "yyyy MM dd HH:mm:ss", | |
| 1686 | |
| 1687 "cccc", "fp", "1970 01 04 0:00:00", "ned\\u011Ble", "1970 01 04 0:
00:00", | |
| 1688 "cccc", "fp", "1970 01 05 0:00:00", "pond\\u011Bl\\u00ED", "1970 01 05 0
:00:00", | |
| 1689 "cccc", "fp", "1970 01 06 0:00:00", "\\u00FAter\\u00FD", "1970 01 06 0
:00:00", | |
| 1690 "cccc", "fp", "1970 01 07 0:00:00", "st\\u0159eda", "1970 01 07 0:
00:00", | |
| 1691 "cccc", "fp", "1970 01 01 0:00:00", "\\u010Dtvrtek", "1970 01 01 0:
00:00", | |
| 1692 "cccc", "fp", "1970 01 02 0:00:00", "p\\u00E1tek", "1970 01 02 0:
00:00", | |
| 1693 "cccc", "fp", "1970 01 03 0:00:00", "sobota", "1970 01 03 0:0
0:00", | |
| 1694 | |
| 1695 "ccc", "fp", "1970 01 04 0:00:00", "ne", "1970 01 04 0:00:00", | |
| 1696 "ccc", "fp", "1970 01 05 0:00:00", "po", "1970 01 05 0:00:00", | |
| 1697 "ccc", "fp", "1970 01 06 0:00:00", "\\u00FAt", "1970 01 06 0:00:00", | |
| 1698 "ccc", "fp", "1970 01 07 0:00:00", "st", "1970 01 07 0:00:00", | |
| 1699 "ccc", "fp", "1970 01 01 0:00:00", "\\u010Dt", "1970 01 01 0:00:00", | |
| 1700 "ccc", "fp", "1970 01 02 0:00:00", "p\\u00E1", "1970 01 02 0:00:00", | |
| 1701 "ccc", "fp", "1970 01 03 0:00:00", "so", "1970 01 03 0:00:00", | |
| 1702 }; | |
| 1703 | |
| 1704 expect(EN_DATA, ARRAY_SIZE(EN_DATA), Locale("en", "", "")); | |
| 1705 expect(CS_DATA, ARRAY_SIZE(CS_DATA), Locale("cs", "", "")); | |
| 1706 } | |
| 1707 | |
| 1708 void DateFormatTest::TestShortDays() | |
| 1709 { | |
| 1710 const char *EN_DATA[] = { | |
| 1711 "yyyy MM dd HH:mm:ss", | |
| 1712 | |
| 1713 "EEEEEE, MMM d y", "fp", "2013 01 13 0:00:00", "Su, Jan 13 2013", "2013
01 13 0:00:00", | |
| 1714 "EEEEEE, MMM d y", "fp", "2013 01 16 0:00:00", "We, Jan 16 2013", "2013
01 16 0:00:00", | |
| 1715 "EEEEEE d", "fp", "1970 01 17 0:00:00", "Sa 17", "1970
01 17 0:00:00", | |
| 1716 "cccccc d", "fp", "1970 01 17 0:00:00", "Sa 17", "1970
01 17 0:00:00", | |
| 1717 "cccccc", "fp", "1970 01 03 0:00:00", "Sa", "1970
01 03 0:00:00", | |
| 1718 }; | |
| 1719 const char *SV_DATA[] = { | |
| 1720 "yyyy MM dd HH:mm:ss", | |
| 1721 | |
| 1722 "EEEEEE d MMM y", "fp", "2013 01 13 0:00:00", "s\\u00F6 13 jan. 2013",
"2013 01 13 0:00:00", | |
| 1723 "EEEEEE d MMM y", "fp", "2013 01 16 0:00:00", "on 16 jan. 2013",
"2013 01 16 0:00:00", | |
| 1724 "EEEEEE d", "fp", "1970 01 17 0:00:00", "l\\u00F6 17", "
1970 01 17 0:00:00", | |
| 1725 "cccccc d", "fp", "1970 01 17 0:00:00", "l\\u00F6 17", "
1970 01 17 0:00:00", | |
| 1726 "cccccc", "fp", "1970 01 03 0:00:00", "l\\u00F6", "
1970 01 03 0:00:00", | |
| 1727 }; | |
| 1728 expect(EN_DATA, ARRAY_SIZE(EN_DATA), Locale("en", "", "")); | |
| 1729 expect(SV_DATA, ARRAY_SIZE(SV_DATA), Locale("sv", "", "")); | |
| 1730 } | |
| 1731 | |
| 1732 void DateFormatTest::TestNarrowNames() | |
| 1733 { | |
| 1734 const char *EN_DATA[] = { | |
| 1735 "yyyy MM dd HH:mm:ss", | |
| 1736 | |
| 1737 "yyyy MMMMM dd H:mm:ss", "2004 03 10 16:36:31", "2004 M 10 16:36:31"
, | |
| 1738 "yyyy LLLLL dd H:mm:ss", "2004 03 10 16:36:31", "2004 M 10 16:36:31
", | |
| 1739 | |
| 1740 "MMMMM", "1970 01 01 0:00:00", "J", | |
| 1741 "MMMMM", "1970 02 01 0:00:00", "F", | |
| 1742 "MMMMM", "1970 03 01 0:00:00", "M", | |
| 1743 "MMMMM", "1970 04 01 0:00:00", "A", | |
| 1744 "MMMMM", "1970 05 01 0:00:00", "M", | |
| 1745 "MMMMM", "1970 06 01 0:00:00", "J", | |
| 1746 "MMMMM", "1970 07 01 0:00:00", "J", | |
| 1747 "MMMMM", "1970 08 01 0:00:00", "A", | |
| 1748 "MMMMM", "1970 09 01 0:00:00", "S", | |
| 1749 "MMMMM", "1970 10 01 0:00:00", "O", | |
| 1750 "MMMMM", "1970 11 01 0:00:00", "N", | |
| 1751 "MMMMM", "1970 12 01 0:00:00", "D", | |
| 1752 | |
| 1753 "LLLLL", "1970 01 01 0:00:00", "J", | |
| 1754 "LLLLL", "1970 02 01 0:00:00", "F", | |
| 1755 "LLLLL", "1970 03 01 0:00:00", "M", | |
| 1756 "LLLLL", "1970 04 01 0:00:00", "A", | |
| 1757 "LLLLL", "1970 05 01 0:00:00", "M", | |
| 1758 "LLLLL", "1970 06 01 0:00:00", "J", | |
| 1759 "LLLLL", "1970 07 01 0:00:00", "J", | |
| 1760 "LLLLL", "1970 08 01 0:00:00", "A", | |
| 1761 "LLLLL", "1970 09 01 0:00:00", "S", | |
| 1762 "LLLLL", "1970 10 01 0:00:00", "O", | |
| 1763 "LLLLL", "1970 11 01 0:00:00", "N", | |
| 1764 "LLLLL", "1970 12 01 0:00:00", "D", | |
| 1765 | |
| 1766 "EEEEE", "1970 01 04 0:00:00", "S", | |
| 1767 "EEEEE", "1970 01 05 0:00:00", "M", | |
| 1768 "EEEEE", "1970 01 06 0:00:00", "T", | |
| 1769 "EEEEE", "1970 01 07 0:00:00", "W", | |
| 1770 "EEEEE", "1970 01 01 0:00:00", "T", | |
| 1771 "EEEEE", "1970 01 02 0:00:00", "F", | |
| 1772 "EEEEE", "1970 01 03 0:00:00", "S", | |
| 1773 | |
| 1774 "ccccc", "1970 01 04 0:00:00", "S", | |
| 1775 "ccccc", "1970 01 05 0:00:00", "M", | |
| 1776 "ccccc", "1970 01 06 0:00:00", "T", | |
| 1777 "ccccc", "1970 01 07 0:00:00", "W", | |
| 1778 "ccccc", "1970 01 01 0:00:00", "T", | |
| 1779 "ccccc", "1970 01 02 0:00:00", "F", | |
| 1780 "ccccc", "1970 01 03 0:00:00", "S", | |
| 1781 | |
| 1782 "h:mm a", "2015 01 01 10:00:00", "10:00 AM", | |
| 1783 "h:mm a", "2015 01 01 22:00:00", "10:00 PM", | |
| 1784 "h:mm aaaaa", "2015 01 01 10:00:00", "10:00 a", | |
| 1785 "h:mm aaaaa", "2015 01 01 22:00:00", "10:00 p", | |
| 1786 }; | |
| 1787 | |
| 1788 const char *CS_DATA[] = { | |
| 1789 "yyyy MM dd HH:mm:ss", | |
| 1790 | |
| 1791 "yyyy LLLLL dd H:mm:ss", "2004 04 10 16:36:31", "2004 4 10 16:36:31"
, | |
| 1792 "yyyy MMMMM dd H:mm:ss", "2004 04 10 16:36:31", "2004 4 10 16:36:31"
, | |
| 1793 | |
| 1794 "MMMMM", "1970 01 01 0:00:00", "1", | |
| 1795 "MMMMM", "1970 02 01 0:00:00", "2", | |
| 1796 "MMMMM", "1970 03 01 0:00:00", "3", | |
| 1797 "MMMMM", "1970 04 01 0:00:00", "4", | |
| 1798 "MMMMM", "1970 05 01 0:00:00", "5", | |
| 1799 "MMMMM", "1970 06 01 0:00:00", "6", | |
| 1800 "MMMMM", "1970 07 01 0:00:00", "7", | |
| 1801 "MMMMM", "1970 08 01 0:00:00", "8", | |
| 1802 "MMMMM", "1970 09 01 0:00:00", "9", | |
| 1803 "MMMMM", "1970 10 01 0:00:00", "10", | |
| 1804 "MMMMM", "1970 11 01 0:00:00", "11", | |
| 1805 "MMMMM", "1970 12 01 0:00:00", "12", | |
| 1806 | |
| 1807 "LLLLL", "1970 01 01 0:00:00", "1", | |
| 1808 "LLLLL", "1970 02 01 0:00:00", "2", | |
| 1809 "LLLLL", "1970 03 01 0:00:00", "3", | |
| 1810 "LLLLL", "1970 04 01 0:00:00", "4", | |
| 1811 "LLLLL", "1970 05 01 0:00:00", "5", | |
| 1812 "LLLLL", "1970 06 01 0:00:00", "6", | |
| 1813 "LLLLL", "1970 07 01 0:00:00", "7", | |
| 1814 "LLLLL", "1970 08 01 0:00:00", "8", | |
| 1815 "LLLLL", "1970 09 01 0:00:00", "9", | |
| 1816 "LLLLL", "1970 10 01 0:00:00", "10", | |
| 1817 "LLLLL", "1970 11 01 0:00:00", "11", | |
| 1818 "LLLLL", "1970 12 01 0:00:00", "12", | |
| 1819 | |
| 1820 "EEEEE", "1970 01 04 0:00:00", "N", | |
| 1821 "EEEEE", "1970 01 05 0:00:00", "P", | |
| 1822 "EEEEE", "1970 01 06 0:00:00", "\\u00DA", | |
| 1823 "EEEEE", "1970 01 07 0:00:00", "S", | |
| 1824 "EEEEE", "1970 01 01 0:00:00", "\\u010C", | |
| 1825 "EEEEE", "1970 01 02 0:00:00", "P", | |
| 1826 "EEEEE", "1970 01 03 0:00:00", "S", | |
| 1827 | |
| 1828 "ccccc", "1970 01 04 0:00:00", "N", | |
| 1829 "ccccc", "1970 01 05 0:00:00", "P", | |
| 1830 "ccccc", "1970 01 06 0:00:00", "\\u00DA", | |
| 1831 "ccccc", "1970 01 07 0:00:00", "S", | |
| 1832 "ccccc", "1970 01 01 0:00:00", "\\u010C", | |
| 1833 "ccccc", "1970 01 02 0:00:00", "P", | |
| 1834 "ccccc", "1970 01 03 0:00:00", "S", | |
| 1835 | |
| 1836 "h:mm a", "2015 01 01 10:00:00", "10:00 dop.", | |
| 1837 "h:mm a", "2015 01 01 22:00:00", "10:00 odp.", | |
| 1838 "h:mm aaaaa", "2015 01 01 10:00:00", "10:00 dop.", | |
| 1839 "h:mm aaaaa", "2015 01 01 22:00:00", "10:00 odp.", | |
| 1840 }; | |
| 1841 | |
| 1842 const char *CA_DATA[] = { | |
| 1843 "yyyy MM dd HH:mm:ss", | |
| 1844 | |
| 1845 "h:mm a", "2015 01 01 10:00:00", "10:00 a. m.", | |
| 1846 "h:mm a", "2015 01 01 22:00:00", "10:00 p. m.", | |
| 1847 "h:mm aaaaa", "2015 01 01 10:00:00", "10:00 a. m.", | |
| 1848 "h:mm aaaaa", "2015 01 01 22:00:00", "10:00 p. m.", | |
| 1849 }; | |
| 1850 | |
| 1851 expectFormat(EN_DATA, ARRAY_SIZE(EN_DATA), Locale("en", "", "")); | |
| 1852 expectFormat(CS_DATA, ARRAY_SIZE(CS_DATA), Locale("cs", "", "")); | |
| 1853 expectFormat(CA_DATA, ARRAY_SIZE(CA_DATA), Locale("ca", "", "")); | |
| 1854 } | |
| 1855 | |
| 1856 void DateFormatTest::TestEras() | |
| 1857 { | |
| 1858 const char *EN_DATA[] = { | |
| 1859 "yyyy MM dd", | |
| 1860 | |
| 1861 "MMMM dd yyyy G", "fp", "1951 07 17", "July 17 1951 AD", "19
51 07 17", | |
| 1862 "MMMM dd yyyy GG", "fp", "1951 07 17", "July 17 1951 AD", "19
51 07 17", | |
| 1863 "MMMM dd yyyy GGG", "fp", "1951 07 17", "July 17 1951 AD", "19
51 07 17", | |
| 1864 "MMMM dd yyyy GGGG", "fp", "1951 07 17", "July 17 1951 Anno Domini", "19
51 07 17", | |
| 1865 | |
| 1866 "MMMM dd yyyy G", "fp", "-438 07 17", "July 17 0439 BC", "
-438 07 17", | |
| 1867 "MMMM dd yyyy GG", "fp", "-438 07 17", "July 17 0439 BC", "
-438 07 17", | |
| 1868 "MMMM dd yyyy GGG", "fp", "-438 07 17", "July 17 0439 BC", "
-438 07 17", | |
| 1869 "MMMM dd yyyy GGGG", "fp", "-438 07 17", "July 17 0439 Before Christ", "
-438 07 17", | |
| 1870 }; | |
| 1871 | |
| 1872 expect(EN_DATA, ARRAY_SIZE(EN_DATA), Locale("en", "", "")); | |
| 1873 } | |
| 1874 | |
| 1875 void DateFormatTest::TestQuarters() | |
| 1876 { | |
| 1877 const char *EN_DATA[] = { | |
| 1878 "yyyy MM dd", | |
| 1879 | |
| 1880 "Q", "fp", "1970 01 01", "1", "1970 01 01", | |
| 1881 "QQ", "fp", "1970 04 01", "02", "1970 04 01", | |
| 1882 "QQQ", "fp", "1970 07 01", "Q3", "1970 07 01", | |
| 1883 "QQQQ", "fp", "1970 10 01", "4th quarter", "1970 10 01", | |
| 1884 | |
| 1885 "q", "fp", "1970 01 01", "1", "1970 01 01", | |
| 1886 "qq", "fp", "1970 04 01", "02", "1970 04 01", | |
| 1887 "qqq", "fp", "1970 07 01", "Q3", "1970 07 01", | |
| 1888 "qqqq", "fp", "1970 10 01", "4th quarter", "1970 10 01", | |
| 1889 | |
| 1890 "Qyy", "fp", "2015 04 01", "215", "2015 04 01", | |
| 1891 "QQyy", "fp", "2015 07 01", "0315", "2015 07 01", | |
| 1892 }; | |
| 1893 | |
| 1894 expect(EN_DATA, ARRAY_SIZE(EN_DATA), Locale("en", "", "")); | |
| 1895 } | |
| 1896 | |
| 1897 /** | |
| 1898 * Test parsing. Input is an array that starts with the following | |
| 1899 * header: | |
| 1900 * | |
| 1901 * [0] = pattern string to parse [i+2] with | |
| 1902 * | |
| 1903 * followed by test cases, each of which is 3 array elements: | |
| 1904 * | |
| 1905 * [i] = pattern, or NULL to reuse prior pattern | |
| 1906 * [i+1] = input string | |
| 1907 * [i+2] = expected parse result (parsed with pattern [0]) | |
| 1908 * | |
| 1909 * If expect parse failure, then [i+2] should be NULL. | |
| 1910 */ | |
| 1911 void DateFormatTest::expectParse(const char** data, int32_t data_length, | |
| 1912 const Locale& loc) { | |
| 1913 const UDate FAIL = (UDate) -1; | |
| 1914 const UnicodeString FAIL_STR("parse failure"); | |
| 1915 int32_t i = 0; | |
| 1916 | |
| 1917 UErrorCode ec = U_ZERO_ERROR; | |
| 1918 SimpleDateFormat fmt("", loc, ec); | |
| 1919 SimpleDateFormat ref(data[i++], loc, ec); | |
| 1920 SimpleDateFormat gotfmt("G yyyy MM dd HH:mm:ss z", loc, ec); | |
| 1921 if (U_FAILURE(ec)) { | |
| 1922 dataerrln("FAIL: SimpleDateFormat constructor - %s", u_errorName(ec)); | |
| 1923 return; | |
| 1924 } | |
| 1925 | |
| 1926 const char* currentPat = NULL; | |
| 1927 while (i<data_length) { | |
| 1928 const char* pattern = data[i++]; | |
| 1929 const char* input = data[i++]; | |
| 1930 const char* expected = data[i++]; | |
| 1931 | |
| 1932 ec = U_ZERO_ERROR; | |
| 1933 if (pattern != NULL) { | |
| 1934 fmt.applyPattern(pattern); | |
| 1935 currentPat = pattern; | |
| 1936 } | |
| 1937 UDate got = fmt.parse(input, ec); | |
| 1938 UnicodeString gotstr(FAIL_STR); | |
| 1939 if (U_FAILURE(ec)) { | |
| 1940 got = FAIL; | |
| 1941 } else { | |
| 1942 gotstr.remove(); | |
| 1943 gotfmt.format(got, gotstr); | |
| 1944 } | |
| 1945 | |
| 1946 UErrorCode ec2 = U_ZERO_ERROR; | |
| 1947 UDate exp = FAIL; | |
| 1948 UnicodeString expstr(FAIL_STR); | |
| 1949 if (expected != NULL) { | |
| 1950 expstr = expected; | |
| 1951 exp = ref.parse(expstr, ec2); | |
| 1952 if (U_FAILURE(ec2)) { | |
| 1953 // This only happens if expected is in wrong format -- | |
| 1954 // should never happen once test is debugged. | |
| 1955 errln("FAIL: Internal test error"); | |
| 1956 return; | |
| 1957 } | |
| 1958 } | |
| 1959 | |
| 1960 if (got == exp) { | |
| 1961 logln((UnicodeString)"Ok: " + input + " x " + | |
| 1962 currentPat + " => " + gotstr); | |
| 1963 } else { | |
| 1964 errln((UnicodeString)"FAIL: " + input + " x " + | |
| 1965 currentPat + " => " + gotstr + ", expected " + | |
| 1966 expstr); | |
| 1967 } | |
| 1968 } | |
| 1969 } | |
| 1970 | |
| 1971 /** | |
| 1972 * Test formatting and parsing. Input is an array that starts | |
| 1973 * with the following header: | |
| 1974 * | |
| 1975 * [0] = pattern string to parse [i+2] with | |
| 1976 * | |
| 1977 * followed by test cases, each of which is 3 array elements: | |
| 1978 * | |
| 1979 * [i] = pattern, or null to reuse prior pattern | |
| 1980 * [i+1] = control string, either "fp", "pf", or "F". | |
| 1981 * [i+2..] = data strings | |
| 1982 * | |
| 1983 * The number of data strings depends on the control string. | |
| 1984 * Examples: | |
| 1985 * 1. "y/M/d H:mm:ss.SS", "fp", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.5
6", "2004 03 10 16:36:31.560", | |
| 1986 * 'f': Format date [i+2] (as parsed using pattern [0]) and expect string [i+3]. | |
| 1987 * 'p': Parse string [i+3] and expect date [i+4]. | |
| 1988 * | |
| 1989 * 2. "y/M/d H:mm:ss.SSS", "F", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.5
67" | |
| 1990 * 'F': Format date [i+2] and expect string [i+3], | |
| 1991 * then parse string [i+3] and expect date [i+2]. | |
| 1992 * | |
| 1993 * 3. "y/M/d H:mm:ss.SSSS", "pf", "2004/3/10 16:36:31.5679", "2004 03 10 16:36:3
1.567", "2004/3/10 16:36:31.5670", | |
| 1994 * 'p': Parse string [i+2] and expect date [i+3]. | |
| 1995 * 'f': Format date [i+3] and expect string [i+4]. | |
| 1996 */ | |
| 1997 void DateFormatTest::expect(const char** data, int32_t data_length, | |
| 1998 const Locale& loc) { | |
| 1999 int32_t i = 0; | |
| 2000 UErrorCode ec = U_ZERO_ERROR; | |
| 2001 UnicodeString str, str2; | |
| 2002 SimpleDateFormat fmt("", loc, ec); | |
| 2003 SimpleDateFormat ref(data[i++], loc, ec); | |
| 2004 SimpleDateFormat univ("EE G yyyy MM dd HH:mm:ss.SSS z", loc, ec); | |
| 2005 if (U_FAILURE(ec)) { | |
| 2006 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(ec)); | |
| 2007 return; | |
| 2008 } | |
| 2009 | |
| 2010 UnicodeString currentPat; | |
| 2011 while (i<data_length) { | |
| 2012 const char* pattern = data[i++]; | |
| 2013 if (pattern != NULL) { | |
| 2014 fmt.applyPattern(pattern); | |
| 2015 currentPat = pattern; | |
| 2016 } | |
| 2017 | |
| 2018 const char* control = data[i++]; | |
| 2019 | |
| 2020 if (uprv_strcmp(control, "fp") == 0) { | |
| 2021 // 'f' | |
| 2022 const char* datestr = data[i++]; | |
| 2023 const char* string = data[i++]; | |
| 2024 UDate date = ref.parse(ctou(datestr), ec); | |
| 2025 if (!assertSuccess("parse", ec)) return; | |
| 2026 assertEquals((UnicodeString)"\"" + currentPat + "\".format(" + dates
tr + ")", | |
| 2027 ctou(string), | |
| 2028 fmt.format(date, str.remove())); | |
| 2029 // 'p' | |
| 2030 datestr = data[i++]; | |
| 2031 date = ref.parse(ctou(datestr), ec); | |
| 2032 if (!assertSuccess("parse", ec)) return; | |
| 2033 UDate parsedate = fmt.parse(ctou(string), ec); | |
| 2034 if (assertSuccess((UnicodeString)"\"" + currentPat + "\".parse(" + s
tring + ")", ec)) { | |
| 2035 assertEquals((UnicodeString)"\"" + currentPat + "\".parse(" + st
ring + ")", | |
| 2036 univ.format(date, str.remove()), | |
| 2037 univ.format(parsedate, str2.remove())); | |
| 2038 } | |
| 2039 } | |
| 2040 | |
| 2041 else if (uprv_strcmp(control, "pf") == 0) { | |
| 2042 // 'p' | |
| 2043 const char* string = data[i++]; | |
| 2044 const char* datestr = data[i++]; | |
| 2045 UDate date = ref.parse(ctou(datestr), ec); | |
| 2046 if (!assertSuccess("parse", ec)) return; | |
| 2047 UDate parsedate = fmt.parse(ctou(string), ec); | |
| 2048 if (assertSuccess((UnicodeString)"\"" + currentPat + "\".parse(" + s
tring + ")", ec)) { | |
| 2049 assertEquals((UnicodeString)"\"" + currentPat + "\".parse(" + st
ring + ")", | |
| 2050 univ.format(date, str.remove()), | |
| 2051 univ.format(parsedate, str2.remove())); | |
| 2052 } | |
| 2053 // 'f' | |
| 2054 string = data[i++]; | |
| 2055 assertEquals((UnicodeString)"\"" + currentPat + "\".format(" + dates
tr + ")", | |
| 2056 ctou(string), | |
| 2057 fmt.format(date, str.remove())); | |
| 2058 } | |
| 2059 | |
| 2060 else if (uprv_strcmp(control, "F") == 0) { | |
| 2061 const char* datestr = data[i++]; | |
| 2062 const char* string = data[i++]; | |
| 2063 UDate date = ref.parse(ctou(datestr), ec); | |
| 2064 if (!assertSuccess("parse", ec)) return; | |
| 2065 assertEquals((UnicodeString)"\"" + currentPat + "\".format(" + dates
tr + ")", | |
| 2066 ctou(string), | |
| 2067 fmt.format(date, str.remove())); | |
| 2068 | |
| 2069 UDate parsedate = fmt.parse(string, ec); | |
| 2070 if (assertSuccess((UnicodeString)"\"" + currentPat + "\".parse(" + s
tring + ")", ec)) { | |
| 2071 assertEquals((UnicodeString)"\"" + currentPat + "\".parse(" + st
ring + ")", | |
| 2072 univ.format(date, str.remove()), | |
| 2073 univ.format(parsedate, str2.remove())); | |
| 2074 } | |
| 2075 } | |
| 2076 | |
| 2077 else { | |
| 2078 errln((UnicodeString)"FAIL: Invalid control string " + control); | |
| 2079 return; | |
| 2080 } | |
| 2081 } | |
| 2082 } | |
| 2083 | |
| 2084 /** | |
| 2085 * Test formatting. Input is an array that starts | |
| 2086 * with the following header: | |
| 2087 * | |
| 2088 * [0] = pattern string to parse [i+2] with | |
| 2089 * | |
| 2090 * followed by test cases, each of which is 3 array elements: | |
| 2091 * | |
| 2092 * [i] = pattern, or null to reuse prior pattern | |
| 2093 * [i+1] = data string a | |
| 2094 * [i+2] = data string b | |
| 2095 * | |
| 2096 * Examples: | |
| 2097 * Format date [i+1] and expect string [i+2]. | |
| 2098 * | |
| 2099 * "y/M/d H:mm:ss.SSSS", "2004/3/10 16:36:31.5679", "2004 03 10 16:36:31.567" | |
| 2100 */ | |
| 2101 void DateFormatTest::expectFormat(const char** data, int32_t data_length, | |
| 2102 const Locale& loc) { | |
| 2103 int32_t i = 0; | |
| 2104 UErrorCode ec = U_ZERO_ERROR; | |
| 2105 UnicodeString str, str2; | |
| 2106 SimpleDateFormat fmt("", loc, ec); | |
| 2107 SimpleDateFormat ref(data[i++], loc, ec); | |
| 2108 SimpleDateFormat univ("EE G yyyy MM dd HH:mm:ss.SSS z", loc, ec); | |
| 2109 if (U_FAILURE(ec)) { | |
| 2110 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(ec)); | |
| 2111 return; | |
| 2112 } | |
| 2113 | |
| 2114 UnicodeString currentPat; | |
| 2115 | |
| 2116 while (i<data_length) { | |
| 2117 const char* pattern = data[i++]; | |
| 2118 if (pattern != NULL) { | |
| 2119 fmt.applyPattern(pattern); | |
| 2120 currentPat = pattern; | |
| 2121 } | |
| 2122 | |
| 2123 const char* datestr = data[i++]; | |
| 2124 const char* string = data[i++]; | |
| 2125 UDate date = ref.parse(ctou(datestr), ec); | |
| 2126 if (!assertSuccess("parse", ec)) return; | |
| 2127 assertEquals((UnicodeString)"\"" + currentPat + "\".format(" + datestr +
")", | |
| 2128 ctou(string), | |
| 2129 fmt.format(date, str.remove())); | |
| 2130 } | |
| 2131 } | |
| 2132 | |
| 2133 void DateFormatTest::TestGenericTime() { | |
| 2134 const Locale en("en"); | |
| 2135 // Note: We no longer parse strings in different styles. | |
| 2136 /* | |
| 2137 const char* ZDATA[] = { | |
| 2138 "yyyy MM dd HH:mm zzz", | |
| 2139 // round trip | |
| 2140 "y/M/d H:mm zzzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific S
tandard Time", | |
| 2141 "y/M/d H:mm zzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PST", | |
| 2142 "y/M/d H:mm vvvv", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific T
ime", | |
| 2143 "y/M/d H:mm v", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PT", | |
| 2144 // non-generic timezone string influences dst offset even if wrong for d
ate/time | |
| 2145 "y/M/d H:mm zzz", "pf", "2004/1/1 1:00 PDT", "2004 01 01 01:00 PDT", "20
04/1/1 0:00 PST", | |
| 2146 "y/M/d H:mm vvvv", "pf", "2004/1/1 1:00 PDT", "2004 01 01 01:00 PDT", "2
004/1/1 0:00 Pacific Time", | |
| 2147 "y/M/d H:mm zzz", "pf", "2004/7/1 1:00 PST", "2004 07 01 02:00 PDT", "20
04/7/1 2:00 PDT", | |
| 2148 "y/M/d H:mm vvvv", "pf", "2004/7/1 1:00 PST", "2004 07 01 02:00 PDT", "2
004/7/1 2:00 Pacific Time", | |
| 2149 // generic timezone generates dst offset appropriate for local time | |
| 2150 "y/M/d H:mm zzz", "pf", "2004/1/1 1:00 PT", "2004 01 01 01:00 PST", "200
4/1/1 1:00 PST", | |
| 2151 "y/M/d H:mm vvvv", "pf", "2004/1/1 1:00 PT", "2004 01 01 01:00 PST", "20
04/1/1 1:00 Pacific Time", | |
| 2152 "y/M/d H:mm zzz", "pf", "2004/7/1 1:00 PT", "2004 07 01 01:00 PDT", "200
4/7/1 1:00 PDT", | |
| 2153 "y/M/d H:mm vvvv", "pf", "2004/7/1 1:00 PT", "2004 07 01 01:00 PDT", "20
04/7/1 1:00 Pacific Time", | |
| 2154 // daylight savings time transition edge cases. | |
| 2155 // time to parse does not really exist, PT interpreted as earlier time | |
| 2156 "y/M/d H:mm zzz", "pf", "2005/4/3 2:30 PT", "2005 04 03 03:30 PDT", "200
5/4/3 3:30 PDT", | |
| 2157 "y/M/d H:mm zzz", "pf", "2005/4/3 2:30 PST", "2005 04 03 03:30 PDT", "20
05/4/3 3:30 PDT", | |
| 2158 "y/M/d H:mm zzz", "pf", "2005/4/3 2:30 PDT", "2005 04 03 01:30 PST", "20
05/4/3 1:30 PST", | |
| 2159 "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", | |
| 2160 "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", | |
| 2161 "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", | |
| 2162 "y/M/d H:mm", "pf", "2005/4/3 2:30", "2005 04 03 03:30 PDT", "2005/4/3 3
:30", | |
| 2163 // time to parse is ambiguous, PT interpreted as later time | |
| 2164 "y/M/d H:mm zzz", "pf", "2005/10/30 1:30 PT", "2005 10 30 01:30 PST", "2
005/10/30 1:30 PST", | |
| 2165 "y/M/d H:mm v", "pf", "2005/10/30 1:30 PT", "2005 10 30 01:30 PST", "20
05/10/30 1:30 PT", | |
| 2166 "y/M/d H:mm", "pf", "2005/10/30 1:30 PT", "2005 10 30 01:30 PST", "2005/
10/30 1:30", | |
| 2167 | |
| 2168 "y/M/d H:mm zzz", "pf", "2004/10/31 1:30 PT", "2004 10 31 01:30 PST", "2
004/10/31 1:30 PST", | |
| 2169 "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", | |
| 2170 "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", | |
| 2171 "y/M/d H:mm v", "pf", "2004/10/31 1:30 PT", "2004 10 31 01:30 PST", "200
4/10/31 1:30 PT", | |
| 2172 "y/M/d H:mm v", "pf", "2004/10/31 1:30 PST", "2004 10 31 01:30 PST", "20
04/10/31 1:30 PT", | |
| 2173 "y/M/d H:mm v", "pf", "2004/10/31 1:30 PDT", "2004 10 31 01:30 PDT", "20
04/10/31 1:30 PT", | |
| 2174 "y/M/d H:mm", "pf", "2004/10/31 1:30", "2004 10 31 01:30 PST", "2004/10/
31 1:30", | |
| 2175 }; | |
| 2176 */ | |
| 2177 const char* ZDATA[] = { | |
| 2178 "yyyy MM dd HH:mm zzz", | |
| 2179 // round trip | |
| 2180 "y/M/d H:mm zzzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific S
tandard Time", | |
| 2181 "y/M/d H:mm zzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PST", | |
| 2182 "y/M/d H:mm vvvv", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific T
ime", | |
| 2183 "y/M/d H:mm v", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PT", | |
| 2184 // non-generic timezone string influences dst offset even if wrong for d
ate/time | |
| 2185 "y/M/d H:mm zzz", "pf", "2004/1/1 1:00 PDT", "2004 01 01 01:00 PDT", "20
04/1/1 0:00 PST", | |
| 2186 "y/M/d H:mm zzz", "pf", "2004/7/1 1:00 PST", "2004 07 01 02:00 PDT", "20
04/7/1 2:00 PDT", | |
| 2187 // generic timezone generates dst offset appropriate for local time | |
| 2188 "y/M/d H:mm zzz", "pf", "2004/1/1 1:00 PST", "2004 01 01 01:00 PST", "20
04/1/1 1:00 PST", | |
| 2189 "y/M/d H:mm vvvv", "pf", "2004/1/1 1:00 Pacific Time", "2004 01 01 01:00
PST", "2004/1/1 1:00 Pacific Time", | |
| 2190 "y/M/d H:mm zzz", "pf", "2004/7/1 1:00 PDT", "2004 07 01 01:00 PDT", "20
04/7/1 1:00 PDT", | |
| 2191 "y/M/d H:mm vvvv", "pf", "2004/7/1 1:00 Pacific Time", "2004 07 01 01:00
PDT", "2004/7/1 1:00 Pacific Time", | |
| 2192 // daylight savings time transition edge cases. | |
| 2193 // time to parse does not really exist, PT interpreted as earlier time | |
| 2194 "y/M/d H:mm zzz", "pf", "2005/4/3 2:30 PST", "2005 04 03 03:30 PDT", "20
05/4/3 3:30 PDT", | |
| 2195 "y/M/d H:mm zzz", "pf", "2005/4/3 2:30 PDT", "2005 04 03 01:30 PST", "20
05/4/3 1:30 PST", | |
| 2196 "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", | |
| 2197 "y/M/d H:mm", "pf", "2005/4/3 2:30", "2005 04 03 03:30 PDT", "2005/4/3 3
:30", | |
| 2198 // time to parse is ambiguous, PT interpreted as later time | |
| 2199 "y/M/d H:mm v", "pf", "2005/10/30 1:30 PT", "2005 10 30 01:30 PST", "20
05/10/30 1:30 PT", | |
| 2200 "y/M/d H:mm", "pf", "2005/10/30 1:30 PT", "2005 10 30 01:30 PST", "2005/
10/30 1:30", | |
| 2201 | |
| 2202 "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", | |
| 2203 "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", | |
| 2204 "y/M/d H:mm v", "pf", "2004/10/31 1:30 PT", "2004 10 31 01:30 PST", "200
4/10/31 1:30 PT", | |
| 2205 "y/M/d H:mm", "pf", "2004/10/31 1:30", "2004 10 31 01:30 PST", "2004/10/
31 1:30", | |
| 2206 }; | |
| 2207 | |
| 2208 const int32_t ZDATA_length = sizeof(ZDATA)/ sizeof(ZDATA[0]); | |
| 2209 expect(ZDATA, ZDATA_length, en); | |
| 2210 | |
| 2211 UErrorCode status = U_ZERO_ERROR; | |
| 2212 | |
| 2213 logln("cross format/parse tests"); // Note: We no longer support cross form
at/parse | |
| 2214 UnicodeString basepat("yy/MM/dd H:mm "); | |
| 2215 SimpleDateFormat formats[] = { | |
| 2216 SimpleDateFormat(basepat + "vvv", en, status), | |
| 2217 SimpleDateFormat(basepat + "vvvv", en, status), | |
| 2218 SimpleDateFormat(basepat + "zzz", en, status), | |
| 2219 SimpleDateFormat(basepat + "zzzz", en, status) | |
| 2220 }; | |
| 2221 if (U_FAILURE(status)) { | |
| 2222 dataerrln("Fail construct SimpleDateFormat: %s", u_errorName(status)); | |
| 2223 return; | |
| 2224 } | |
| 2225 const int32_t formats_length = sizeof(formats)/sizeof(formats[0]); | |
| 2226 | |
| 2227 UnicodeString test; | |
| 2228 SimpleDateFormat univ("yyyy MM dd HH:mm zzz", en, status); | |
| 2229 ASSERT_OK(status); | |
| 2230 const UnicodeString times[] = { | |
| 2231 "2004 01 02 03:04 PST", | |
| 2232 "2004 07 08 09:10 PDT" | |
| 2233 }; | |
| 2234 int32_t times_length = sizeof(times)/sizeof(times[0]); | |
| 2235 for (int i = 0; i < times_length; ++i) { | |
| 2236 UDate d = univ.parse(times[i], status); | |
| 2237 logln(UnicodeString("\ntime: ") + d); | |
| 2238 for (int j = 0; j < formats_length; ++j) { | |
| 2239 test.remove(); | |
| 2240 formats[j].format(d, test); | |
| 2241 logln("\ntest: '" + test + "'"); | |
| 2242 for (int k = 0; k < formats_length; ++k) { | |
| 2243 UDate t = formats[k].parse(test, status); | |
| 2244 if (U_SUCCESS(status)) { | |
| 2245 if (d != t) { | |
| 2246 errln((UnicodeString)"FAIL: format " + k + | |
| 2247 " incorrectly parsed output of format " + j + | |
| 2248 " (" + test + "), returned " + | |
| 2249 dateToString(t) + " instead of " + dateToString(d)); | |
| 2250 } else { | |
| 2251 logln((UnicodeString)"OK: format " + k + " parsed ok"); | |
| 2252 } | |
| 2253 } else if (status == U_PARSE_ERROR) { | |
| 2254 errln((UnicodeString)"FAIL: format " + k + | |
| 2255 " could not parse output of format " + j + | |
| 2256 " (" + test + ")"); | |
| 2257 } | |
| 2258 } | |
| 2259 } | |
| 2260 } | |
| 2261 } | |
| 2262 | |
| 2263 void DateFormatTest::TestGenericTimeZoneOrder() { | |
| 2264 // generic times should parse the same no matter what the placement of the tim
e zone string | |
| 2265 | |
| 2266 // Note: We no longer support cross style format/parse | |
| 2267 | |
| 2268 //const char* XDATA[] = { | |
| 2269 // "yyyy MM dd HH:mm zzz", | |
| 2270 // // standard time, explicit daylight/standard | |
| 2271 // "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", | |
| 2272 // "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", | |
| 2273 // "zzz y/M/d H:mm", "pf", "PT 2004/1/1 1:00", "2004 01 01 01:00 PST", "PST 2
004/1/1 1:00", | |
| 2274 | |
| 2275 // // standard time, generic | |
| 2276 // "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", | |
| 2277 // "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", | |
| 2278 // "vvvv y/M/d H:mm", "pf", "PT 2004/1/1 1:00", "2004 01 01 01:00 PST", "Paci
fic Time 2004/1/1 1:00", | |
| 2279 | |
| 2280 // // dahylight time, explicit daylight/standard | |
| 2281 // "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", | |
| 2282 // "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", | |
| 2283 // "zzz y/M/d H:mm", "pf", "PT 2004/7/1 1:00", "2004 07 01 01:00 PDT", "PDT 2
004/7/1 1:00", | |
| 2284 | |
| 2285 // // daylight time, generic | |
| 2286 // "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", | |
| 2287 // "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", | |
| 2288 // "vvvv y/M/d H:mm", "pf", "PT 2004/7/1 1:00", "2004 07 01 01:00 PDT", "Paci
fic Time 2004/7/1 1:00", | |
| 2289 //}; | |
| 2290 const char* XDATA[] = { | |
| 2291 "yyyy MM dd HH:mm zzz", | |
| 2292 // standard time, explicit daylight/standard | |
| 2293 "y/M/d H:mm zzz", "pf", "2004/1/1 1:00 PST", "2004 01 01 01:00 PST", "2004/1
/1 1:00 PST", | |
| 2294 "y/M/d zzz H:mm", "pf", "2004/1/1 PST 1:00", "2004 01 01 01:00 PST", "2004/1
/1 PST 1:00", | |
| 2295 "zzz y/M/d H:mm", "pf", "PST 2004/1/1 1:00", "2004 01 01 01:00 PST", "PST 20
04/1/1 1:00", | |
| 2296 | |
| 2297 // standard time, generic | |
| 2298 "y/M/d H:mm vvvv", "pf", "2004/1/1 1:00 Pacific Time", "2004 01 01 01:00 PST
", "2004/1/1 1:00 Pacific Time", | |
| 2299 "y/M/d vvvv H:mm", "pf", "2004/1/1 Pacific Time 1:00", "2004 01 01 01:00 PST
", "2004/1/1 Pacific Time 1:00", | |
| 2300 "vvvv y/M/d H:mm", "pf", "Pacific Time 2004/1/1 1:00", "2004 01 01 01:00 PST
", "Pacific Time 2004/1/1 1:00", | |
| 2301 | |
| 2302 // dahylight time, explicit daylight/standard | |
| 2303 "y/M/d H:mm zzz", "pf", "2004/7/1 1:00 PDT", "2004 07 01 01:00 PDT", "2004/7
/1 1:00 PDT", | |
| 2304 "y/M/d zzz H:mm", "pf", "2004/7/1 PDT 1:00", "2004 07 01 01:00 PDT", "2004/7
/1 PDT 1:00", | |
| 2305 "zzz y/M/d H:mm", "pf", "PDT 2004/7/1 1:00", "2004 07 01 01:00 PDT", "PDT 20
04/7/1 1:00", | |
| 2306 | |
| 2307 // daylight time, generic | |
| 2308 "y/M/d H:mm v", "pf", "2004/7/1 1:00 PT", "2004 07 01 01:00 PDT", "2004/7/1
1:00 PT", | |
| 2309 "y/M/d v H:mm", "pf", "2004/7/1 PT 1:00", "2004 07 01 01:00 PDT", "2004/7/1
PT 1:00", | |
| 2310 "v y/M/d H:mm", "pf", "PT 2004/7/1 1:00", "2004 07 01 01:00 PDT", "PT 2004/7
/1 1:00", | |
| 2311 }; | |
| 2312 const int32_t XDATA_length = sizeof(XDATA)/sizeof(XDATA[0]); | |
| 2313 Locale en("en"); | |
| 2314 expect(XDATA, XDATA_length, en); | |
| 2315 } | |
| 2316 | |
| 2317 void DateFormatTest::TestZTimeZoneParsing(void) { | |
| 2318 UErrorCode status = U_ZERO_ERROR; | |
| 2319 const Locale en("en"); | |
| 2320 UnicodeString test; | |
| 2321 //SimpleDateFormat univ("yyyy-MM-dd'T'HH:mm Z", en, status); | |
| 2322 SimpleDateFormat univ("HH:mm Z", en, status); | |
| 2323 if (failure(status, "construct SimpleDateFormat", TRUE)) return; | |
| 2324 const TimeZone *t = TimeZone::getGMT(); | |
| 2325 univ.setTimeZone(*t); | |
| 2326 | |
| 2327 univ.setLenient(false); | |
| 2328 ParsePosition pp(0); | |
| 2329 struct { | |
| 2330 UnicodeString input; | |
| 2331 UnicodeString expected_result; | |
| 2332 } tests[] = { | |
| 2333 { "11:00 -0200", "13:00 +0000" }, | |
| 2334 { "11:00 +0200", "09:00 +0000" }, | |
| 2335 { "11:00 +0400", "07:00 +0000" }, | |
| 2336 { "11:00 +0530", "05:30 +0000" } | |
| 2337 }; | |
| 2338 | |
| 2339 UnicodeString result; | |
| 2340 int32_t tests_length = sizeof(tests)/sizeof(tests[0]); | |
| 2341 for (int i = 0; i < tests_length; ++i) { | |
| 2342 pp.setIndex(0); | |
| 2343 UDate d = univ.parse(tests[i].input, pp); | |
| 2344 if(pp.getIndex() != tests[i].input.length()){ | |
| 2345 errln("Test %i: setZoneString() did not succeed. Consumed: %i instea
d of %i", | |
| 2346 i, pp.getIndex(), tests[i].input.length()); | |
| 2347 return; | |
| 2348 } | |
| 2349 result.remove(); | |
| 2350 univ.format(d, result); | |
| 2351 if(result != tests[i].expected_result) { | |
| 2352 errln("Expected " + tests[i].expected_result | |
| 2353 + " got " + result); | |
| 2354 return; | |
| 2355 } | |
| 2356 logln("SUCCESS: Parsed " + tests[i].input | |
| 2357 + " got " + result | |
| 2358 + " expected " + tests[i].expected_result); | |
| 2359 } | |
| 2360 } | |
| 2361 | |
| 2362 void DateFormatTest::TestHost(void) | |
| 2363 { | |
| 2364 #if U_PLATFORM_HAS_WIN32_API | |
| 2365 Win32DateTimeTest::testLocales(this); | |
| 2366 #endif | |
| 2367 } | |
| 2368 | |
| 2369 // Relative Date Tests | |
| 2370 | |
| 2371 void DateFormatTest::TestRelative(int daysdelta, | |
| 2372 const Locale& loc, | |
| 2373 const char *expectChars) { | |
| 2374 char banner[25]; | |
| 2375 sprintf(banner, "%d", daysdelta); | |
| 2376 UnicodeString bannerStr(banner, ""); | |
| 2377 | |
| 2378 UErrorCode status = U_ZERO_ERROR; | |
| 2379 | |
| 2380 FieldPosition pos(0); | |
| 2381 UnicodeString test; | |
| 2382 Locale en("en"); | |
| 2383 DateFormat *fullrelative = DateFormat::createDateInstance(DateFormat::kFullR
elative, loc); | |
| 2384 | |
| 2385 if (fullrelative == NULL) { | |
| 2386 dataerrln("DateFormat::createDateInstance(DateFormat::kFullRelative, %s)
returned NULL", loc.getName()); | |
| 2387 return; | |
| 2388 } | |
| 2389 | |
| 2390 DateFormat *full = DateFormat::createDateInstance(DateFormat::kFull
, loc); | |
| 2391 | |
| 2392 if (full == NULL) { | |
| 2393 errln("DateFormat::createDateInstance(DateFormat::kFull, %s) returned NU
LL", loc.getName()); | |
| 2394 return; | |
| 2395 } | |
| 2396 | |
| 2397 DateFormat *en_full = DateFormat::createDateInstance(DateFormat::kFu
ll, en); | |
| 2398 | |
| 2399 if (en_full == NULL) { | |
| 2400 errln("DateFormat::createDateInstance(DateFormat::kFull, en) returned NU
LL"); | |
| 2401 return; | |
| 2402 } | |
| 2403 | |
| 2404 DateFormat *en_fulltime = DateFormat::createDateTimeInstance(DateFor
mat::kFull,DateFormat::kFull,en); | |
| 2405 | |
| 2406 if (en_fulltime == NULL) { | |
| 2407 errln("DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat:
:kFull, en) returned NULL"); | |
| 2408 return; | |
| 2409 } | |
| 2410 | |
| 2411 UnicodeString result; | |
| 2412 UnicodeString normalResult; | |
| 2413 UnicodeString expect; | |
| 2414 UnicodeString parseResult; | |
| 2415 | |
| 2416 Calendar *c = Calendar::createInstance(status); | |
| 2417 | |
| 2418 // Today = Today | |
| 2419 c->setTime(Calendar::getNow(), status); | |
| 2420 if(daysdelta != 0) { | |
| 2421 c->add(Calendar::DATE,daysdelta,status); | |
| 2422 } | |
| 2423 ASSERT_OK(status); | |
| 2424 | |
| 2425 // calculate the expected string | |
| 2426 if(expectChars != NULL) { | |
| 2427 expect = expectChars; | |
| 2428 } else { | |
| 2429 full->format(*c, expect, pos); // expected = normal full | |
| 2430 } | |
| 2431 | |
| 2432 fullrelative ->format(*c, result, pos); | |
| 2433 en_full ->format(*c, normalResult, pos); | |
| 2434 | |
| 2435 if(result != expect) { | |
| 2436 errln("FAIL: Relative Format ["+bannerStr+"] of "+normalResult+" failed,
expected "+expect+" but got " + result); | |
| 2437 } else { | |
| 2438 logln("PASS: Relative Format ["+bannerStr+"] of "+normalResult+" got " +
result); | |
| 2439 } | |
| 2440 | |
| 2441 | |
| 2442 //verify | |
| 2443 UDate d = fullrelative->parse(result, status); | |
| 2444 ASSERT_OK(status); | |
| 2445 | |
| 2446 UnicodeString parseFormat; // parse rel->format full | |
| 2447 en_full->format(d, parseFormat, status); | |
| 2448 | |
| 2449 UnicodeString origFormat; | |
| 2450 en_full->format(*c, origFormat, pos); | |
| 2451 | |
| 2452 if(parseFormat!=origFormat) { | |
| 2453 errln("FAIL: Relative Parse ["+bannerStr+"] of "+result+" failed, expect
ed "+parseFormat+" but got "+origFormat); | |
| 2454 } else { | |
| 2455 logln("PASS: Relative Parse ["+bannerStr+"] of "+result+" passed, got "+
parseFormat); | |
| 2456 } | |
| 2457 | |
| 2458 delete full; | |
| 2459 delete fullrelative; | |
| 2460 delete en_fulltime; | |
| 2461 delete en_full; | |
| 2462 delete c; | |
| 2463 } | |
| 2464 | |
| 2465 | |
| 2466 void DateFormatTest::TestRelative(void) | |
| 2467 { | |
| 2468 Locale en("en"); | |
| 2469 TestRelative( 0, en, "today"); | |
| 2470 TestRelative(-1, en, "yesterday"); | |
| 2471 TestRelative( 1, en, "tomorrow"); | |
| 2472 TestRelative( 2, en, NULL); | |
| 2473 TestRelative( -2, en, NULL); | |
| 2474 TestRelative( 3, en, NULL); | |
| 2475 TestRelative( -3, en, NULL); | |
| 2476 TestRelative( 300, en, NULL); | |
| 2477 TestRelative( -300, en, NULL); | |
| 2478 } | |
| 2479 | |
| 2480 void DateFormatTest::TestRelativeClone(void) | |
| 2481 { | |
| 2482 /* | |
| 2483 Verify that a cloned formatter gives the same results | |
| 2484 and is useable after the original has been deleted. | |
| 2485 */ | |
| 2486 UErrorCode status = U_ZERO_ERROR; | |
| 2487 Locale loc("en"); | |
| 2488 UDate now = Calendar::getNow(); | |
| 2489 DateFormat *full = DateFormat::createDateInstance(DateFormat::kFullRelative,
loc); | |
| 2490 if (full == NULL) { | |
| 2491 dataerrln("FAIL: Can't create Relative date instance"); | |
| 2492 return; | |
| 2493 } | |
| 2494 UnicodeString result1; | |
| 2495 full->format(now, result1, status); | |
| 2496 Format *fullClone = full->clone(); | |
| 2497 delete full; | |
| 2498 full = NULL; | |
| 2499 | |
| 2500 UnicodeString result2; | |
| 2501 fullClone->format(now, result2, status); | |
| 2502 ASSERT_OK(status); | |
| 2503 if (result1 != result2) { | |
| 2504 errln("FAIL: Clone returned different result from non-clone."); | |
| 2505 } | |
| 2506 delete fullClone; | |
| 2507 } | |
| 2508 | |
| 2509 void DateFormatTest::TestHostClone(void) | |
| 2510 { | |
| 2511 /* | |
| 2512 Verify that a cloned formatter gives the same results | |
| 2513 and is useable after the original has been deleted. | |
| 2514 */ | |
| 2515 // This is mainly important on Windows. | |
| 2516 UErrorCode status = U_ZERO_ERROR; | |
| 2517 Locale loc("en_US@compat=host"); | |
| 2518 UDate now = Calendar::getNow(); | |
| 2519 DateFormat *full = DateFormat::createDateInstance(DateFormat::kFull, loc); | |
| 2520 if (full == NULL) { | |
| 2521 dataerrln("FAIL: Can't create host date instance"); | |
| 2522 return; | |
| 2523 } | |
| 2524 UnicodeString result1; | |
| 2525 full->format(now, result1, status); | |
| 2526 Format *fullClone = full->clone(); | |
| 2527 delete full; | |
| 2528 full = NULL; | |
| 2529 | |
| 2530 UnicodeString result2; | |
| 2531 fullClone->format(now, result2, status); | |
| 2532 ASSERT_OK(status); | |
| 2533 if (result1 != result2) { | |
| 2534 errln("FAIL: Clone returned different result from non-clone."); | |
| 2535 } | |
| 2536 delete fullClone; | |
| 2537 } | |
| 2538 | |
| 2539 void DateFormatTest::TestHebrewClone(void) | |
| 2540 { | |
| 2541 /* | |
| 2542 Verify that a cloned formatter gives the same results | |
| 2543 and is useable after the original has been deleted. | |
| 2544 */ | |
| 2545 UErrorCode status = U_ZERO_ERROR; | |
| 2546 Locale loc("he@calendar=hebrew"); | |
| 2547 UDate now = Calendar::getNow(); | |
| 2548 LocalPointer<DateFormat> fmt( | |
| 2549 DateFormat::createDateInstance(DateFormat::kLong, loc)); | |
| 2550 if (fmt.isNull()) { | |
| 2551 dataerrln("FAIL: Can't create Hebrew date instance"); | |
| 2552 return; | |
| 2553 } | |
| 2554 UnicodeString result1; | |
| 2555 fmt->format(now, result1, status); | |
| 2556 LocalPointer<Format> fmtClone(fmt->clone()); | |
| 2557 | |
| 2558 // free fmt to be sure that fmtClone is independent of fmt. | |
| 2559 fmt.adoptInstead(NULL); | |
| 2560 | |
| 2561 UnicodeString result2; | |
| 2562 fmtClone->format(now, result2, status); | |
| 2563 ASSERT_OK(status); | |
| 2564 if (result1 != result2) { | |
| 2565 errln("FAIL: Clone returned different result from non-clone."); | |
| 2566 } | |
| 2567 } | |
| 2568 | |
| 2569 static UBool getActualAndValidLocales( | |
| 2570 const Format &fmt, Locale &valid, Locale &actual) { | |
| 2571 const SimpleDateFormat* dat = dynamic_cast<const SimpleDateFormat*>(&fmt); | |
| 2572 if (dat == NULL) { | |
| 2573 return FALSE; | |
| 2574 } | |
| 2575 const DateFormatSymbols *sym = dat->getDateFormatSymbols(); | |
| 2576 if (sym == NULL) { | |
| 2577 return FALSE; | |
| 2578 } | |
| 2579 UErrorCode status = U_ZERO_ERROR; | |
| 2580 valid = sym->getLocale(ULOC_VALID_LOCALE, status); | |
| 2581 actual = sym->getLocale(ULOC_ACTUAL_LOCALE, status); | |
| 2582 return U_SUCCESS(status); | |
| 2583 } | |
| 2584 | |
| 2585 void DateFormatTest::TestDateFormatSymbolsClone(void) | |
| 2586 { | |
| 2587 /* | |
| 2588 Verify that a cloned formatter gives the same results | |
| 2589 and is useable after the original has been deleted. | |
| 2590 */ | |
| 2591 Locale loc("de_CH_LUCERNE"); | |
| 2592 LocalPointer<DateFormat> fmt( | |
| 2593 DateFormat::createDateInstance(DateFormat::kDefault, loc)); | |
| 2594 Locale valid1; | |
| 2595 Locale actual1; | |
| 2596 if (!getActualAndValidLocales(*fmt, valid1, actual1)) { | |
| 2597 dataerrln("FAIL: Could not fetch valid + actual locales"); | |
| 2598 return; | |
| 2599 } | |
| 2600 LocalPointer<Format> fmtClone(fmt->clone()); | |
| 2601 | |
| 2602 // Free fmt to be sure that fmtClone is really independent of fmt. | |
| 2603 fmt.adoptInstead(NULL); | |
| 2604 Locale valid2; | |
| 2605 Locale actual2; | |
| 2606 if (!getActualAndValidLocales(*fmtClone, valid2, actual2)) { | |
| 2607 errln("FAIL: Could not fetch valid + actual locales"); | |
| 2608 return; | |
| 2609 } | |
| 2610 if (valid1 != valid2 || actual1 != actual2) { | |
| 2611 errln("Date format symbol locales of clone don't match original"); | |
| 2612 } | |
| 2613 } | |
| 2614 | |
| 2615 void DateFormatTest::TestTimeZoneDisplayName() | |
| 2616 { | |
| 2617 // This test data was ported from ICU4J. Don't know why the 6th column in t
here because it's not being | |
| 2618 // used currently. | |
| 2619 const char *fallbackTests[][6] = { | |
| 2620 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8
:00" }, | |
| 2621 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:0
0", "-8:00" }, | |
| 2622 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZZ", "-08:00"
, "-8:00" }, | |
| 2623 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "PST", "Amer
ica/Los_Angeles" }, | |
| 2624 { "en", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "Pacific
Standard Time", "America/Los_Angeles" }, | |
| 2625 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7
:00" }, | |
| 2626 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:0
0", "-7:00" }, | |
| 2627 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "PDT", "Amer
ica/Los_Angeles" }, | |
| 2628 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "Pacific
Daylight Time", "America/Los_Angeles" }, | |
| 2629 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "PT", "Ameri
ca/Los_Angeles" }, | |
| 2630 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "Pacific
Time", "America/Los_Angeles" }, | |
| 2631 { "en", "America/Los_Angeles", "2004-07-15T00:00:00Z", "VVVV", "Los Ange
les Time", "America/Los_Angeles" }, | |
| 2632 { "en_GB", "America/Los_Angeles", "2004-01-15T12:00:00Z", "z", "GMT-8",
"America/Los_Angeles" }, | |
| 2633 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "Z", "-0700", "-7:00"
}, | |
| 2634 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-07:00",
"-7:00" }, | |
| 2635 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "z", "MST", "America/
Phoenix" }, | |
| 2636 { "en", "America/Phoenix", "2004-01-15T00:00:00Z", "zzzz", "Mountain Sta
ndard Time", "America/Phoenix" }, | |
| 2637 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "Z", "-0700", "-7:00"
}, | |
| 2638 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:00",
"-7:00" }, | |
| 2639 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "z", "MST", "America/
Phoenix" }, | |
| 2640 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "zzzz", "Mountain Sta
ndard Time", "America/Phoenix" }, | |
| 2641 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "v", "MST", "America/
Phoenix" }, | |
| 2642 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "vvvv", "Mountain Sta
ndard Time", "America/Phoenix" }, | |
| 2643 { "en", "America/Phoenix", "2004-07-15T00:00:00Z", "VVVV", "Phoenix Time
", "America/Phoenix" }, | |
| 2644 | |
| 2645 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "
-0300", "-3:00" }, | |
| 2646 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ"
, "GMT-03:00", "-3:00" }, | |
| 2647 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "
GMT-3", "-3:00" }, | |
| 2648 { "en", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz"
, "Argentina Standard Time", "-3:00" }, | |
| 2649 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "
-0300", "-3:00" }, | |
| 2650 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ"
, "GMT-03:00", "-3:00" }, | |
| 2651 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "
GMT-3", "-3:00" }, | |
| 2652 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz"
, "Argentina Standard Time", "-3:00" }, | |
| 2653 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "
Buenos Aires Time", "America/Buenos_Aires" }, | |
| 2654 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv"
, "Argentina Standard Time", "America/Buenos_Aires" }, | |
| 2655 { "en", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "VVVV"
, "Buenos Aires Time", "America/Buenos_Aires" }, | |
| 2656 | |
| 2657 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-
3:00" }, | |
| 2658 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:
00", "-3:00" }, | |
| 2659 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-
3:00" }, | |
| 2660 { "en", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argenti
na Standard Time", "-3:00" }, | |
| 2661 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-
3:00" }, | |
| 2662 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:
00", "-3:00" }, | |
| 2663 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-
3:00" }, | |
| 2664 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argenti
na Standard Time", "-3:00" }, | |
| 2665 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Air
es Time", "America/Buenos_Aires" }, | |
| 2666 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argenti
na Standard Time", "America/Buenos_Aires" }, | |
| 2667 { "en", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "VVVV", "Buenos
Aires Time", "America/Buenos_Aires" }, | |
| 2668 | |
| 2669 { "en", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00"
}, | |
| 2670 { "en", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "
-5:00" }, | |
| 2671 { "en", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00"
}, | |
| 2672 { "en", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "Cuba Standard
Time", "-5:00" }, | |
| 2673 { "en", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00"
}, | |
| 2674 { "en", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "
-4:00" }, | |
| 2675 { "en", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00"
}, | |
| 2676 { "en", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "Cuba Daylight
Time", "-4:00" }, | |
| 2677 { "en", "America/Havana", "2004-07-15T00:00:00Z", "v", "Cuba Time", "Ame
rica/Havana" }, | |
| 2678 { "en", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "Cuba Time", "
America/Havana" }, | |
| 2679 { "en", "America/Havana", "2004-07-15T00:00:00Z", "VVVV", "Cuba Time", "
America/Havana" }, | |
| 2680 | |
| 2681 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00"
}, | |
| 2682 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+
11:00" }, | |
| 2683 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00"
}, | |
| 2684 { "en", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "Australian Eas
tern Daylight Time", "+11:00" }, | |
| 2685 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00"
}, | |
| 2686 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+
10:00" }, | |
| 2687 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00"
}, | |
| 2688 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "Australian Eas
tern Standard Time", "+10:00" }, | |
| 2689 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "Sydney Time", "Au
stralia/Sydney" }, | |
| 2690 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "Eastern Austra
lia Time", "Australia/Sydney" }, | |
| 2691 { "en", "Australia/ACT", "2004-07-15T00:00:00Z", "VVVV", "Sydney Time",
"Australia/Sydney" }, | |
| 2692 | |
| 2693 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:0
0" }, | |
| 2694 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00",
"+11:00" }, | |
| 2695 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:
00" }, | |
| 2696 { "en", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "Australian
Eastern Daylight Time", "+11:00" }, | |
| 2697 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:0
0" }, | |
| 2698 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00",
"+10:00" }, | |
| 2699 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:
00" }, | |
| 2700 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "Australian
Eastern Standard Time", "+10:00" }, | |
| 2701 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "Sydney Time",
"Australia/Sydney" }, | |
| 2702 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "Eastern Aus
tralia Time", "Australia/Sydney" }, | |
| 2703 { "en", "Australia/Sydney", "2004-07-15T00:00:00Z", "VVVV", "Sydney Time
", "Australia/Sydney" }, | |
| 2704 | |
| 2705 { "en", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" }
, | |
| 2706 { "en", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00"
}, | |
| 2707 { "en", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" }, | |
| 2708 { "en", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "Greenwich Mean
Time", "+0:00" }, | |
| 2709 { "en", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" }
, | |
| 2710 { "en", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+
1:00" }, | |
| 2711 { "en", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "Europe/L
ondon" }, | |
| 2712 { "en", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "British Summer
Time", "Europe/London" }, | |
| 2713 // icu en.txt has exemplar city for this time zone | |
| 2714 { "en", "Europe/London", "2004-07-15T00:00:00Z", "v", "United Kingdom Ti
me", "Europe/London" }, | |
| 2715 { "en", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "United Kingdom
Time", "Europe/London" }, | |
| 2716 { "en", "Europe/London", "2004-07-15T00:00:00Z", "VVVV", "United Kingdom
Time", "Europe/London" }, | |
| 2717 | |
| 2718 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, | |
| 2719 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00
" }, | |
| 2720 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" }, | |
| 2721 { "en", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00
" }, | |
| 2722 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, | |
| 2723 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00
" }, | |
| 2724 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" }, | |
| 2725 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00
" }, | |
| 2726 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" }, | |
| 2727 { "en", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00
" }, | |
| 2728 | |
| 2729 // JB#5150 | |
| 2730 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" }
, | |
| 2731 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+
5:30" }, | |
| 2732 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+5:30", "+5:30
" }, | |
| 2733 { "en", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "India Standard
Time", "+5:30" }, | |
| 2734 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" }
, | |
| 2735 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+
5:30" }, | |
| 2736 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+5:30", "+05:3
0" }, | |
| 2737 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "India Standard
Time", "+5:30" }, | |
| 2738 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "India Time", "Asi
a/Calcutta" }, | |
| 2739 { "en", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "India Standard
Time", "Asia/Calcutta" }, | |
| 2740 | |
| 2741 // Proper CLDR primary zone support #9733 | |
| 2742 { "en", "America/Santiago", "2013-01-01T00:00:00Z", "VVVV", "Chile Time"
, "America/Santiago" }, | |
| 2743 { "en", "Pacific/Easter", "2013-01-01T00:00:00Z", "VVVV", "Easter Time",
"Pacific/Easter" }, | |
| 2744 | |
| 2745 // ========== | |
| 2746 | |
| 2747 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8
:00" }, | |
| 2748 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:0
0", "-8:00" }, | |
| 2749 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-8", "-8
:00" }, | |
| 2750 { "de", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "Nordamer
ikanische Westk\\u00fcsten-Normalzeit", "-8:00" }, | |
| 2751 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7
:00" }, | |
| 2752 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:0
0", "-7:00" }, | |
| 2753 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-7", "-7
:00" }, | |
| 2754 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "Nordamer
ikanische Westk\\u00fcsten-Sommerzeit", "-7:00" }, | |
| 2755 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "Los Angeles
Zeit", "America/Los_Angeles" }, | |
| 2756 { "de", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "Nordamer
ikanische Westk\\u00fcstenzeit", "America/Los_Angeles" }, | |
| 2757 | |
| 2758 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "
-0300", "-3:00" }, | |
| 2759 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ"
, "GMT-03:00", "-3:00" }, | |
| 2760 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "
GMT-3", "-3:00" }, | |
| 2761 { "de", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz"
, "Argentinische Normalzeit", "-3:00" }, | |
| 2762 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "
-0300", "-3:00" }, | |
| 2763 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ"
, "GMT-03:00", "-3:00" }, | |
| 2764 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "
GMT-3", "-3:00" }, | |
| 2765 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz"
, "Argentinische Normalzeit", "-3:00" }, | |
| 2766 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "
Buenos Aires Zeit", "America/Buenos_Aires" }, | |
| 2767 { "de", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv"
, "Argentinische Normalzeit", "America/Buenos_Aires" }, | |
| 2768 | |
| 2769 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-
3:00" }, | |
| 2770 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:
00", "-3:00" }, | |
| 2771 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-
3:00" }, | |
| 2772 { "de", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "Argenti
nische Normalzeit", "-3:00" }, | |
| 2773 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-
3:00" }, | |
| 2774 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:
00", "-3:00" }, | |
| 2775 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-
3:00" }, | |
| 2776 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "Argenti
nische Normalzeit", "-3:00" }, | |
| 2777 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Air
es Zeit", "America/Buenos_Aires" }, | |
| 2778 { "de", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Argenti
nische Normalzeit", "America/Buenos_Aires" }, | |
| 2779 | |
| 2780 { "de", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00"
}, | |
| 2781 { "de", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "
-5:00" }, | |
| 2782 { "de", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00"
}, | |
| 2783 { "de", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "Kubanische No
rmalzeit", "-5:00" }, | |
| 2784 { "de", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00"
}, | |
| 2785 { "de", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "
-4:00" }, | |
| 2786 { "de", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00"
}, | |
| 2787 { "de", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "Kubanische So
mmerzeit", "-4:00" }, | |
| 2788 { "de", "America/Havana", "2004-07-15T00:00:00Z", "v", "Kuba Zeit", "Ame
rica/Havana" }, | |
| 2789 { "de", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "Kubanische Ze
it", "America/Havana" }, | |
| 2790 // added to test proper fallback of country name | |
| 2791 { "de_CH", "America/Havana", "2004-07-15T00:00:00Z", "v", "Kuba Zeit", "
America/Havana" }, | |
| 2792 { "de_CH", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "Kubanische
Zeit", "America/Havana" }, | |
| 2793 | |
| 2794 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00"
}, | |
| 2795 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+
11:00" }, | |
| 2796 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00"
}, | |
| 2797 { "de", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "Ostaustralisch
e Sommerzeit", "+11:00" }, | |
| 2798 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00"
}, | |
| 2799 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+
10:00" }, | |
| 2800 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00"
}, | |
| 2801 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "Ostaustralisch
e Normalzeit", "+10:00" }, | |
| 2802 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "Sydney Zeit", "Au
stralia/Sydney" }, | |
| 2803 { "de", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "Ostaustralisch
e Zeit", "Australia/Sydney" }, | |
| 2804 | |
| 2805 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:0
0" }, | |
| 2806 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00",
"+11:00" }, | |
| 2807 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:
00" }, | |
| 2808 { "de", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "Ostaustrali
sche Sommerzeit", "+11:00" }, | |
| 2809 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:0
0" }, | |
| 2810 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00",
"+10:00" }, | |
| 2811 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:
00" }, | |
| 2812 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "Ostaustrali
sche Normalzeit", "+10:00" }, | |
| 2813 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "Sydney Zeit",
"Australia/Sydney" }, | |
| 2814 { "de", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "Ostaustrali
sche Zeit", "Australia/Sydney" }, | |
| 2815 | |
| 2816 { "de", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" }
, | |
| 2817 { "de", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00"
}, | |
| 2818 { "de", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" }, | |
| 2819 { "de", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "Mittlere Green
wich-Zeit", "+0:00" }, | |
| 2820 { "de", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" }
, | |
| 2821 { "de", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+
1:00" }, | |
| 2822 { "de", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "+1:00" }
, | |
| 2823 { "de", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "Britische Somm
erzeit", "+1:00" }, | |
| 2824 { "de", "Europe/London", "2004-07-15T00:00:00Z", "v", "Vereinigtes K\\u0
0f6nigreich Zeit", "Europe/London" }, | |
| 2825 { "de", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "Vereinigtes K\
\u00f6nigreich Zeit", "Europe/London" }, | |
| 2826 | |
| 2827 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, | |
| 2828 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00
" }, | |
| 2829 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" }, | |
| 2830 { "de", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00
" }, | |
| 2831 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, | |
| 2832 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00
" }, | |
| 2833 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" }, | |
| 2834 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00
" }, | |
| 2835 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" }, | |
| 2836 { "de", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00
" }, | |
| 2837 | |
| 2838 // JB#5150 | |
| 2839 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" }
, | |
| 2840 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+
5:30" }, | |
| 2841 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+5:30", "+5:30
" }, | |
| 2842 { "de", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "Indische Zeit"
, "+5:30" }, | |
| 2843 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" }
, | |
| 2844 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+
5:30" }, | |
| 2845 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+5:30", "+05:3
0" }, | |
| 2846 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "Indische Zeit"
, "+5:30" }, | |
| 2847 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "Indien Zeit", "As
ia/Calcutta" }, | |
| 2848 { "de", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "Indische Zeit"
, "Asia/Calcutta" }, | |
| 2849 | |
| 2850 // ========== | |
| 2851 | |
| 2852 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8
:00" }, | |
| 2853 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:0
0", "-8:00" }, | |
| 2854 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-8", "Am
erica/Los_Angeles" }, | |
| 2855 { "zh", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\\u5317\
\u7f8e\\u592a\\u5e73\\u6d0b\\u6807\\u51c6\\u65f6\\u95f4", "America/Los_Angeles"
}, | |
| 2856 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7
:00" }, | |
| 2857 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:0
0", "-7:00" }, | |
| 2858 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-7", "Am
erica/Los_Angeles" }, | |
| 2859 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\\u5317\
\u7f8e\\u592a\\u5e73\\u6d0b\\u590f\\u4ee4\\u65f6\\u95f4", "America/Los_Angeles"
}, | |
| 2860 // icu zh.txt has exemplar city for this time zone | |
| 2861 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\\u6D1B\\u6
749\\u77F6\\u65F6\\u95F4", "America/Los_Angeles" }, | |
| 2862 { "zh", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\\u5317\
\u7f8e\\u592a\\u5e73\\u6d0b\\u65f6\\u95f4", "America/Los_Angeles" }, | |
| 2863 | |
| 2864 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "
-0300", "-3:00" }, | |
| 2865 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ"
, "GMT-03:00", "-3:00" }, | |
| 2866 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "
GMT-3", "-3:00" }, | |
| 2867 { "zh", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz"
, "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "-3:00" }, | |
| 2868 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "
-0300", "-3:00" }, | |
| 2869 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ"
, "GMT-03:00", "-3:00" }, | |
| 2870 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "
GMT-3", "-3:00" }, | |
| 2871 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz"
, "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "-3:00" }, | |
| 2872 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "
\\u5E03\\u5B9C\\u8BFA\\u65AF\\u827E\\u5229\\u65AF\\u65F6\\u95F4", "America/Bueno
s_Aires" }, | |
| 2873 { "zh", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv"
, "\\u963f\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "America/Buenos_Aires" }, | |
| 2874 | |
| 2875 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-
3:00" }, | |
| 2876 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:
00", "-3:00" }, | |
| 2877 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-
3:00" }, | |
| 2878 { "zh", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u963f
\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "-3:00" }, | |
| 2879 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-
3:00" }, | |
| 2880 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:
00", "-3:00" }, | |
| 2881 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-
3:00" }, | |
| 2882 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u963f
\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "-3:00" }, | |
| 2883 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u5E03\\u
5B9C\\u8BFA\\u65AF\\u827E\\u5229\\u65AF\\u65F6\\u95F4", "America/Buenos_Aires" }
, | |
| 2884 { "zh", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u963f
\\u6839\\u5ef7\\u6807\\u51c6\\u65f6\\u95f4", "America/Buenos_Aires" }, | |
| 2885 | |
| 2886 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00"
}, | |
| 2887 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "
-5:00" }, | |
| 2888 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00"
}, | |
| 2889 { "zh", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\\u53e4\\u5df
4\\u6807\\u51c6\\u65f6\\u95f4", "-5:00" }, | |
| 2890 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00"
}, | |
| 2891 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "
-4:00" }, | |
| 2892 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00"
}, | |
| 2893 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\\u53e4\\u5df
4\\u590f\\u4ee4\\u65f6\\u95f4", "-4:00" }, | |
| 2894 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "v", "\\u53e4\\u5df4\\
u65f6\\u95f4", "America/Havana" }, | |
| 2895 { "zh", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\\u53e4\\u5df
4\\u65f6\\u95f4", "America/Havana" }, | |
| 2896 | |
| 2897 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00"
}, | |
| 2898 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+
11:00" }, | |
| 2899 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00"
}, | |
| 2900 { "zh", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\\u6fb3\\u5927
\\u5229\\u4e9a\\u4e1c\\u90e8\\u590f\\u4ee4\\u65f6\\u95f4", "+11:00" }, | |
| 2901 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00"
}, | |
| 2902 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+
10:00" }, | |
| 2903 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00"
}, | |
| 2904 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\\u6fb3\\u5927
\\u5229\\u4e9a\\u4e1c\\u90e8\\u6807\\u51c6\\u65f6\\u95f4", "+10:00" }, | |
| 2905 // icu zh.txt does not have info for this time zone | |
| 2906 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\\u6089\\u5C3C\\u
65F6\\u95F4", "Australia/Sydney" }, | |
| 2907 { "zh", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\\u6fb3\\u5927
\\u5229\\u4e9a\\u4e1c\\u90e8\\u65f6\\u95f4", "Australia/Sydney" }, | |
| 2908 | |
| 2909 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:0
0" }, | |
| 2910 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00",
"+11:00" }, | |
| 2911 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:
00" }, | |
| 2912 { "zh", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\\u6fb3\\u5
927\\u5229\\u4e9a\\u4e1c\\u90e8\\u590f\\u4ee4\\u65f6\\u95f4", "+11:00" }, | |
| 2913 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:0
0" }, | |
| 2914 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00",
"+10:00" }, | |
| 2915 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:
00" }, | |
| 2916 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\\u6fb3\\u5
927\\u5229\\u4e9a\\u4e1c\\u90e8\\u6807\\u51c6\\u65f6\\u95f4", "+10:00" }, | |
| 2917 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\\u6089\\u5C3C
\\u65F6\\u95F4", "Australia/Sydney" }, | |
| 2918 { "zh", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\\u6fb3\\u5
927\\u5229\\u4e9a\\u4e1c\\u90e8\\u65f6\\u95f4", "Australia/Sydney" }, | |
| 2919 | |
| 2920 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" }
, | |
| 2921 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00"
}, | |
| 2922 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" }, | |
| 2923 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00"
}, | |
| 2924 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" }, | |
| 2925 { "zh", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\\u683C\\u6797
\\u5C3C\\u6CBB\\u6807\\u51C6\\u65F6\\u95F4", "+0:00" }, | |
| 2926 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" }
, | |
| 2927 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+
1:00" }, | |
| 2928 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "+1:00" }
, | |
| 2929 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "\\u82f1\\u56fd
\\u590f\\u4ee4\\u65f6\\u95f4", "+1:00" }, | |
| 2930 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "v", "\\u82f1\\u56fd\\u
65f6\\u95f4", "Europe/London" }, | |
| 2931 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\\u82f1\\u56fd
\\u65f6\\u95f4", "Europe/London" }, | |
| 2932 { "zh", "Europe/London", "2004-07-15T00:00:00Z", "VVVV", "\\u82f1\\u56fd
\\u65f6\\u95f4", "Europe/London" }, | |
| 2933 | |
| 2934 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, | |
| 2935 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00
" }, | |
| 2936 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" }, | |
| 2937 { "zh", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00
" }, | |
| 2938 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, | |
| 2939 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00
" }, | |
| 2940 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" }, | |
| 2941 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00
" }, | |
| 2942 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" }, | |
| 2943 { "zh", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00
" }, | |
| 2944 | |
| 2945 // JB#5150 | |
| 2946 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" }
, | |
| 2947 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+
5:30" }, | |
| 2948 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+5:30", "+5:30
" }, | |
| 2949 { "zh", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\\u5370\\u5ea6
\\u65f6\\u95f4", "+5:30" }, | |
| 2950 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" }
, | |
| 2951 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+
5:30" }, | |
| 2952 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+5:30", "+05:3
0" }, | |
| 2953 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\\u5370\\u5ea6
\\u65f6\\u95f4", "+5:30" }, | |
| 2954 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "\\u5370\\u5ea6\\u
65f6\\u95f4", "Asia/Calcutta" }, | |
| 2955 { "zh", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\\u5370\\u5ea6
\\u65f6\\u95f4", "Asia/Calcutta" }, | |
| 2956 | |
| 2957 // ========== | |
| 2958 | |
| 2959 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8
:00" }, | |
| 2960 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:0
0", "-8:00" }, | |
| 2961 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-8", "-8
:00" }, | |
| 2962 { "hi", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\\u0909\
\u0924\\u094d\\u0924\\u0930\\u0940 \\u0905\\u092e\\u0947\\u0930\\u093f\\u0915\\u
0940 \\u092a\\u094d\\u0930\\u0936\\u093e\\u0902\\u0924 \\u092e\\u093e\\u0928\\u0
915 \\u0938\\u092e\\u092f", "-8:00" }, | |
| 2963 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7
:00" }, | |
| 2964 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:0
0", "-7:00" }, | |
| 2965 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-7", "-7
:00" }, | |
| 2966 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\\u0909\
\u0924\\u094d\\u0924\\u0930\\u0940 \\u0905\\u092e\\u0947\\u0930\\u093f\\u0915\\u
0940 \\u092a\\u094d\\u0930\\u0936\\u093e\\u0902\\u0924 \\u0921\\u0947\\u0932\\u0
93e\\u0907\\u091f \\u0938\\u092e\\u092f", "-7:00" }, | |
| 2967 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\\u0932\\u
0949\\u0938 \\u090f\\u0902\\u091c\\u093f\\u0932\\u094d\\u0938 \\u0938\\u092e\\u0
92f", "America/Los_Angeles" }, | |
| 2968 { "hi", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\\u0909\
\u0924\\u094d\\u0924\\u0930\\u0940 \\u0905\\u092e\\u0947\\u0930\\u093f\\u0915\\u
0940 \\u092a\\u094d\\u0930\\u0936\\u093e\\u0902\\u0924 \\u0938\\u092e\\u092f", "
America/Los_Angeles" }, | |
| 2969 | |
| 2970 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "
-0300", "-3:00" }, | |
| 2971 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ"
, "GMT-03:00", "-3:00" }, | |
| 2972 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "
GMT-3", "-3:00" }, | |
| 2973 { "hi", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz"
, "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u092
E\\u093E\\u0928\\u0915 \\u0938\\u092E\\u092F", "-3:00" }, | |
| 2974 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "
-0300", "-3:00" }, | |
| 2975 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ"
, "GMT-03:00", "-3:00" }, | |
| 2976 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "
GMT-3", "-3:00" }, | |
| 2977 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz"
, "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u092
E\\u093E\\u0928\\u0915 \\u0938\\u092E\\u092F", "-3:00" }, | |
| 2978 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "
\\u092C\\u094D\\u092F\\u0942\\u0928\\u0938 \\u0906\\u092F\\u0930\\u0938 \\u0938\
\u092E\\u092F", "America/Buenos_Aires" }, | |
| 2979 { "hi", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv"
, "\\u0905\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u092
E\\u093E\\u0928\\u0915 \\u0938\\u092E\\u092F", "America/Buenos_Aires" }, | |
| 2980 | |
| 2981 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-
3:00" }, | |
| 2982 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:
00", "-3:00" }, | |
| 2983 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-
3:00" }, | |
| 2984 { "hi", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u0905
\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u092E\\u093E\\
u0928\\u0915 \\u0938\\u092E\\u092F", "-3:00" }, | |
| 2985 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-
3:00" }, | |
| 2986 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:
00", "-3:00" }, | |
| 2987 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-
3:00" }, | |
| 2988 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u0905
\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u092E\\u093E\\
u0928\\u0915 \\u0938\\u092E\\u092F", "-3:00" }, | |
| 2989 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u092C\\u
094D\\u092F\\u0942\\u0928\\u0938 \\u0906\\u092F\\u0930\\u0938 \\u0938\\u092E\\u0
92F", "America/Buenos_Aires" }, | |
| 2990 { "hi", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u0905
\\u0930\\u094D\\u091C\\u0947\\u0902\\u091F\\u0940\\u0928\\u093E \\u092E\\u093E\\
u0928\\u0915 \\u0938\\u092E\\u092F", "America/Buenos_Aires" }, | |
| 2991 | |
| 2992 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00"
}, | |
| 2993 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "
-5:00" }, | |
| 2994 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00"
}, | |
| 2995 { "hi", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\\u0915\\u094
d\\u092f\\u0942\\u092c\\u093e \\u092e\\u093e\\u0928\\u0915 \\u0938\\u092e\\u092f
", "-5:00" }, | |
| 2996 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00"
}, | |
| 2997 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "
-4:00" }, | |
| 2998 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00"
}, | |
| 2999 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\\u0915\\u094
d\\u092f\\u0942\\u092c\\u093e \\u0921\\u0947\\u0932\\u093e\\u0907\\u091f \\u0938
\\u092e\\u092f", "-4:00" }, | |
| 3000 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "v", "\\u0915\\u094d\\
u092f\\u0942\\u092c\\u093e \\u0938\\u092E\\u092F", "America/Havana" }, | |
| 3001 { "hi", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\\u0915\\u094
d\\u092f\\u0942\\u092c\\u093e \\u0938\\u092e\\u092f", "America/Havana" }, | |
| 3002 | |
| 3003 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00"
}, | |
| 3004 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+
11:00" }, | |
| 3005 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00"
}, | |
| 3006 { "hi", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\\u0911\\u0938
\\u094d\\u200d\\u091f\\u094d\\u0930\\u0947\\u0932\\u093f\\u092f\\u093e\\u0908 \\
u092a\\u0942\\u0930\\u094d\\u0935\\u0940 \\u0921\\u0947\\u0932\\u093e\\u0907\\u0
91f \\u0938\\u092e\\u092f", "+11:00" }, | |
| 3007 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00"
}, | |
| 3008 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+
10:00" }, | |
| 3009 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00"
}, | |
| 3010 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\\u0911\\u0938
\\u094d\\u200d\\u091f\\u094d\\u0930\\u0947\\u0932\\u093f\\u092f\\u093e\\u0908 \\
u092a\\u0942\\u0930\\u094d\\u0935\\u0940 \\u092e\\u093e\\u0928\\u0915 \\u0938\\u
092e\\u092f", "+10:00" }, | |
| 3011 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\\u0938\\u093F\\u
0921\\u0928\\u0940 \\u0938\\u092E\\u092F", "Australia/Sydney" }, | |
| 3012 { "hi", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\\u092a\\u0942
\\u0930\\u094d\\u0935\\u0940 \\u0911\\u0938\\u094d\\u091f\\u094d\\u0930\\u0947\\
u0932\\u093f\\u092f\\u093e \\u0938\\u092e\\u092f", "Australia/Sydney" }, | |
| 3013 | |
| 3014 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:0
0" }, | |
| 3015 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00",
"+11:00" }, | |
| 3016 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:
00" }, | |
| 3017 { "hi", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\\u0911\\u0
938\\u094d\\u200d\\u091f\\u094d\\u0930\\u0947\\u0932\\u093f\\u092f\\u093e\\u0908
\\u092a\\u0942\\u0930\\u094d\\u0935\\u0940 \\u0921\\u0947\\u0932\\u093e\\u0907\
\u091f \\u0938\\u092e\\u092f", "+11:00" }, | |
| 3018 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:0
0" }, | |
| 3019 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00",
"+10:00" }, | |
| 3020 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:
00" }, | |
| 3021 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\\u0911\\u0
938\\u094d\\u200d\\u091f\\u094d\\u0930\\u0947\\u0932\\u093f\\u092f\\u093e\\u0908
\\u092a\\u0942\\u0930\\u094d\\u0935\\u0940 \\u092e\\u093e\\u0928\\u0915 \\u0938
\\u092e\\u092f", "+10:00" }, | |
| 3022 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\\u0938\\u093F
\\u0921\\u0928\\u0940 \\u0938\\u092E\\u092F", "Australia/Sydney" }, | |
| 3023 { "hi", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\\u092a\\u0
942\\u0930\\u094d\\u0935\\u0940 \\u0911\\u0938\\u094d\\u091f\\u094d\\u0930\\u094
7\\u0932\\u093f\\u092f\\u093e \\u0938\\u092e\\u092f", "Australia/Sydney" }, | |
| 3024 | |
| 3025 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" }
, | |
| 3026 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00"
}, | |
| 3027 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" }, | |
| 3028 { "hi", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\\u0917\\u094d
\\u0930\\u0940\\u0928\\u0935\\u093f\\u091a \\u092e\\u0940\\u0928 \\u091f\\u093e\
\u0907\\u092e", "+0:00" }, | |
| 3029 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" }
, | |
| 3030 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+
1:00" }, | |
| 3031 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "+1:00" }
, | |
| 3032 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "\\u092c\\u094d
\\u0930\\u093f\\u091f\\u093f\\u0936 \\u0917\\u094d\\u0930\\u0940\\u0937\\u094d\\
u092e\\u0915\\u093e\\u0932\\u0940\\u0928 \\u0938\\u092e\\u092f", "+1:00" }, | |
| 3033 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "v", "\\u092f\\u0942\\u
0928\\u093e\\u0907\\u091f\\u0947\\u0921 \\u0915\\u093f\\u0902\\u0917\\u0921\\u09
2e \\u0938\\u092e\\u092f", "Europe/London" }, | |
| 3034 { "hi", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\\u092f\\u0942
\\u0928\\u093e\\u0907\\u091f\\u0947\\u0921 \\u0915\\u093f\\u0902\\u0917\\u0921\\
u092e \\u0938\\u092e\\u092f", "Europe/London" }, | |
| 3035 | |
| 3036 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, | |
| 3037 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00
" }, | |
| 3038 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" }, | |
| 3039 { "hi", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00
" }, | |
| 3040 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, | |
| 3041 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00
" }, | |
| 3042 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" }, | |
| 3043 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00
" }, | |
| 3044 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" }, | |
| 3045 { "hi", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00
" }, | |
| 3046 | |
| 3047 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" }
, | |
| 3048 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+
5:30" }, | |
| 3049 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "IST", "+5:30" }, | |
| 3050 { "hi", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\\u092D\\u093E
\\u0930\\u0924\\u0940\\u092F \\u092E\\u093E\\u0928\\u0915 \\u0938\\u092E\\u092F"
, "+5:30" }, | |
| 3051 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" }
, | |
| 3052 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+
5:30" }, | |
| 3053 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "IST", "+05:30" }, | |
| 3054 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\\u092D\\u093E
\\u0930\\u0924\\u0940\\u092F \\u092E\\u093E\\u0928\\u0915 \\u0938\\u092E\\u092F"
, "+5:30" }, | |
| 3055 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "IST", "Asia/Calcu
tta" }, | |
| 3056 { "hi", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\\u092D\\u093E
\\u0930\\u0924\\u0940\\u092F \\u092E\\u093E\\u0928\\u0915 \\u0938\\u092E\\u092F"
, "Asia/Calcutta" }, | |
| 3057 | |
| 3058 // ========== | |
| 3059 | |
| 3060 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8
:00" }, | |
| 3061 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\
\u0440\\u0438\\u043D\\u0443\\u0438\\u0447-08:00", "-8:00" }, | |
| 3062 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0
440\\u0438\\u043D\\u0443\\u0438\\u0447-8", "America/Los_Angeles" }, | |
| 3063 { "bg", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\\u0421\
\u0435\\u0432\\u0435\\u0440\\u043d\\u043e\\u0430\\u043c\\u0435\\u0440\\u0438\\u0
43a\\u0430\\u043d\\u0441\\u043a\\u043e \\u0442\\u0438\\u0445\\u043e\\u043e\\u043
a\\u0435\\u0430\\u043d\\u0441\\u043a\\u043e \\u0441\\u0442\\u0430\\u043d\\u0434\
\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435", "Americ
a/Los_Angeles" }, | |
| 3064 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7
:00" }, | |
| 3065 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\
\u0440\\u0438\\u043D\\u0443\\u0438\\u0447-07:00", "-7:00" }, | |
| 3066 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0
440\\u0438\\u043D\\u0443\\u0438\\u0447-7", "America/Los_Angeles" }, | |
| 3067 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\\u0421\
\u0435\\u0432\\u0435\\u0440\\u043d\\u043e\\u0430\\u043c\\u0435\\u0440\\u0438\\u0
43a\\u0430\\u043d\\u0441\\u043a\\u043e \\u0442\\u0438\\u0445\\u043e\\u043e\\u043
a\\u0435\\u0430\\u043d\\u0441\\u043a\\u043e \\u043b\\u044f\\u0442\\u043d\\u043e
\\u0447\\u0430\\u0441\\u043e\\u0432\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435",
"America/Los_Angeles" }, | |
| 3068 // icu bg.txt has exemplar city for this time zone | |
| 3069 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\\u041B\\u0
43E\\u0441 \\u0410\\u043D\\u0434\\u0436\\u0435\\u043B\\u0438\\u0441", "America/L
os_Angeles" }, | |
| 3070 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\\u0421\
\u0435\\u0432\\u0435\\u0440\\u043d\\u043e\\u0430\\u043c\\u0435\\u0440\\u0438\\u0
43a\\u0430\\u043d\\u0441\\u043a\\u043e \\u0442\\u0438\\u0445\\u043e\\u043e\\u043
a\\u0435\\u0430\\u043d\\u0441\\u043a\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435"
, "America/Los_Angeles" }, | |
| 3071 { "bg", "America/Los_Angeles", "2004-07-15T00:00:00Z", "VVVV", "\\u041B\
\u043E\\u0441 \\u0410\\u043D\\u0434\\u0436\\u0435\\u043B\\u0438\\u0441", "Americ
a/Los_Angeles" }, | |
| 3072 | |
| 3073 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "
-0300", "-3:00" }, | |
| 3074 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ"
, "\\u0413\\u0440\\u0438\\u043D\\u0443\\u0438\\u0447-03:00", "-3:00" }, | |
| 3075 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "
\\u0413\\u0440\\u0438\\u043D\\u0443\\u0438\\u0447-3", "-3:00" }, | |
| 3076 { "bg", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz"
, "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0441\\u043a\\u043e
\\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\
\u0440\\u0435\\u043c\\u0435", "-3:00" }, | |
| 3077 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "
-0300", "-3:00" }, | |
| 3078 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ"
, "\\u0413\\u0440\\u0438\\u043D\\u0443\\u0438\\u0447-03:00", "-3:00" }, | |
| 3079 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "
\\u0413\\u0440\\u0438\\u043D\\u0443\\u0438\\u0447-3", "-3:00" }, | |
| 3080 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz"
, "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0441\\u043a\\u043e
\\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\
\u0440\\u0435\\u043c\\u0435", "-3:00" }, | |
| 3081 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "
\\u0411\\u0443\\u0435\\u043D\\u043E\\u0441 \\u0410\\u0439\\u0440\\u0435\\u0441",
"America/Buenos_Aires" }, | |
| 3082 { "bg", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv"
, "\\u0410\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0441\\u043a\\u043e
\\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\
\u0440\\u0435\\u043c\\u0435", "America/Buenos_Aires" }, | |
| 3083 | |
| 3084 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-
3:00" }, | |
| 3085 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413
\\u0440\\u0438\\u043D\\u0443\\u0438\\u0447-03:00", "-3:00" }, | |
| 3086 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "\\u0413\\u
0440\\u0438\\u043D\\u0443\\u0438\\u0447-3", "-3:00" }, | |
| 3087 { "bg", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u0410
\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0441\\u043a\\u043e \\u0441\\
u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0
435\\u043c\\u0435", "-3:00" }, | |
| 3088 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-
3:00" }, | |
| 3089 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413
\\u0440\\u0438\\u043D\\u0443\\u0438\\u0447-03:00", "-3:00" }, | |
| 3090 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "\\u0413\\u
0440\\u0438\\u043D\\u0443\\u0438\\u0447-3", "-3:00" }, | |
| 3091 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u0410
\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0441\\u043a\\u043e \\u0441\\
u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0
435\\u043c\\u0435", "-3:00" }, | |
| 3092 // icu bg.txt does not have info for this time zone | |
| 3093 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u0411\\u
0443\\u0435\\u043D\\u043E\\u0441 \\u0410\\u0439\\u0440\\u0435\\u0441", "America/
Buenos_Aires" }, | |
| 3094 { "bg", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u0410
\\u0440\\u0436\\u0435\\u043D\\u0442\\u0438\\u043D\\u0441\\u043a\\u043e \\u0441\\
u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0
435\\u043c\\u0435", "America/Buenos_Aires" }, | |
| 3095 | |
| 3096 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00"
}, | |
| 3097 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u044
0\\u0438\\u043D\\u0443\\u0438\\u0447-05:00", "-5:00" }, | |
| 3098 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\
u0438\\u043D\\u0443\\u0438\\u0447-5", "-5:00" }, | |
| 3099 { "bg", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\\u041a\\u044
3\\u0431\\u0438\\u043d\\u0441\\u043a\\u043e \\u0441\\u0442\\u0430\\u043d\\u0434\
\u0430\\u0440\\u0442\\u043d\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435", "-5:00"
}, | |
| 3100 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00"
}, | |
| 3101 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u044
0\\u0438\\u043D\\u0443\\u0438\\u0447-04:00", "-4:00" }, | |
| 3102 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\
u0438\\u043D\\u0443\\u0438\\u0447-4", "-4:00" }, | |
| 3103 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\\u041a\\u044
3\\u0431\\u0438\\u043d\\u0441\\u043a\\u043e \\u043b\\u044f\\u0442\\u043d\\u043e
\\u0447\\u0430\\u0441\\u043e\\u0432\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435",
"-4:00" }, | |
| 3104 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "v", "\\u041a\\u0443\\
u0431\\u0430", "America/Havana" }, | |
| 3105 { "bg", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\\u041a\\u044
3\\u0431\\u0438\\u043d\\u0441\\u043a\\u043e \\u0432\\u0440\\u0435\\u043C\\u0435"
, "America/Havana" }, | |
| 3106 | |
| 3107 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00"
}, | |
| 3108 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440
\\u0438\\u043D\\u0443\\u0438\\u0447+11:00", "+11:00" }, | |
| 3109 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u
0438\\u043D\\u0443\\u0438\\u0447+11", "+11:00" }, | |
| 3110 { "bg", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\\u0410\\u0432
\\u0441\\u0442\\u0440\\u0430\\u043B\\u0438\\u044F \\u2013 \\u0438\\u0437\\u0442\
\u043E\\u0447\\u043D\\u043E \\u043B\\u044F\\u0442\\u043D\\u043E \\u0447\\u0430\\
u0441\\u043E\\u0432\\u043E \\u0432\\u0440\\u0435\\u043C\\u0435", "+11:00" }, | |
| 3111 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00"
}, | |
| 3112 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440
\\u0438\\u043D\\u0443\\u0438\\u0447+10:00", "+10:00" }, | |
| 3113 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u
0438\\u043D\\u0443\\u0438\\u0447+10", "+10:00" }, | |
| 3114 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\\u0410\\u0432
\\u0441\\u0442\\u0440\\u0430\\u043B\\u0438\\u044F \\u2013 \\u0438\\u0437\\u0442\
\u043E\\u0447\\u043D\\u043E \\u0441\\u0442\\u0430\\u043D\\u0434\\u0430\\u0440\\u
0442\\u043D\\u043E \\u0432\\u0440\\u0435\\u043C\\u0435", "+10:00" }, | |
| 3115 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\\u0421\\u0438\\u
0434\\u043D\\u0438", "Australia/Sydney" }, | |
| 3116 { "bg", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\\u0410\\u0432
\\u0441\\u0442\\u0440\\u0430\\u043B\\u0438\\u044F \\u2013 \\u0438\\u0437\\u0442\
\u043E\\u0447\\u043D\\u043E \\u0432\\u0440\\u0435\\u043C\\u0435", "Australia/Syd
ney" }, | |
| 3117 | |
| 3118 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:0
0" }, | |
| 3119 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0
440\\u0438\\u043D\\u0443\\u0438\\u0447+11:00", "+11:00" }, | |
| 3120 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440
\\u0438\\u043D\\u0443\\u0438\\u0447+11", "+11:00" }, | |
| 3121 { "bg", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\\u0410\\u0
432\\u0441\\u0442\\u0440\\u0430\\u043B\\u0438\\u044F \\u2013 \\u0438\\u0437\\u04
42\\u043E\\u0447\\u043D\\u043E \\u043B\\u044F\\u0442\\u043D\\u043E \\u0447\\u043
0\\u0441\\u043E\\u0432\\u043E \\u0432\\u0440\\u0435\\u043C\\u0435", "+11:00" }, | |
| 3122 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:0
0" }, | |
| 3123 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0
440\\u0438\\u043D\\u0443\\u0438\\u0447+10:00", "+10:00" }, | |
| 3124 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440
\\u0438\\u043D\\u0443\\u0438\\u0447+10", "+10:00" }, | |
| 3125 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\\u0410\\u0
432\\u0441\\u0442\\u0440\\u0430\\u043B\\u0438\\u044F \\u2013 \\u0438\\u0437\\u04
42\\u043E\\u0447\\u043D\\u043E \\u0441\\u0442\\u0430\\u043D\\u0434\\u0430\\u0440
\\u0442\\u043D\\u043E \\u0432\\u0440\\u0435\\u043C\\u0435", "+10:00" }, | |
| 3126 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\\u0421\\u0438
\\u0434\\u043D\\u0438", "Australia/Sydney" }, | |
| 3127 { "bg", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\\u0410\\u0
432\\u0441\\u0442\\u0440\\u0430\\u043B\\u0438\\u044F \\u2013 \\u0438\\u0437\\u04
42\\u043E\\u0447\\u043D\\u043E \\u0432\\u0440\\u0435\\u043C\\u0435", "Australia/
Sydney" }, | |
| 3128 | |
| 3129 { "bg", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" }
, | |
| 3130 { "bg", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440
\\u0438\\u043D\\u0443\\u0438\\u0447", "+0:00" }, | |
| 3131 { "bg", "Europe/London", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u
0438\\u043D\\u0443\\u0438\\u0447", "+0:00" }, | |
| 3132 { "bg", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\\u0421\\u0440
\\u0435\\u0434\\u043d\\u043e \\u0433\\u0440\\u0438\\u043d\\u0443\\u0438\\u0447\\
u043a\\u043e \\u0432\\u0440\\u0435\\u043c\\u0435", "+0:00" }, | |
| 3133 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" }
, | |
| 3134 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440
\\u0438\\u043D\\u0443\\u0438\\u0447+01:00", "+1:00" }, | |
| 3135 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u
0438\\u043D\\u0443\\u0438\\u0447+1", "+1:00" }, | |
| 3136 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "\\u0411\\u0440
\\u0438\\u0442\\u0430\\u043d\\u0441\\u043a\\u043e \\u043b\\u044f\\u0442\\u043d\\
u043e \\u0447\\u0430\\u0441\\u043e\\u0432\\u043e \\u0432\\u0440\\u0435\\u043c\\u
0435", "+1:00" }, | |
| 3137 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "v", "\\u041E\\u0431\\u
0435\\u0434\\u0438\\u043D\\u0435\\u043D\\u043E\\u0442\\u043E \\u043A\\u0440\\u04
30\\u043B\\u0441\\u0442\\u0432\\u043E", "Europe/London" }, | |
| 3138 { "bg", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\\u041E\\u0431
\\u0435\\u0434\\u0438\\u043D\\u0435\\u043D\\u043E\\u0442\\u043E \\u043A\\u0440\\
u0430\\u043B\\u0441\\u0442\\u0432\\u043E", "Europe/London" }, | |
| 3139 | |
| 3140 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, | |
| 3141 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0
438\\u043D\\u0443\\u0438\\u0447-03:00", "-3:00" }, | |
| 3142 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438
\\u043D\\u0443\\u0438\\u0447-3", "-3:00" }, | |
| 3143 { "bg", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "\\u0413\\u0440\\u0
438\\u043D\\u0443\\u0438\\u0447-03:00", "-3:00" }, | |
| 3144 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, | |
| 3145 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440\\u0
438\\u043D\\u0443\\u0438\\u0447-03:00", "-3:00" }, | |
| 3146 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u0438
\\u043D\\u0443\\u0438\\u0447-3", "-3:00" }, | |
| 3147 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "\\u0413\\u0440\\u0
438\\u043D\\u0443\\u0438\\u0447-03:00", "-3:00" }, | |
| 3148 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "\\u0413\\u0440\\u0438
\\u043D\\u0443\\u0438\\u0447-3", "-3:00" }, | |
| 3149 { "bg", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "\\u0413\\u0440\\u0
438\\u043D\\u0443\\u0438\\u0447-03:00", "-3:00" }, | |
| 3150 | |
| 3151 // JB#5150 | |
| 3152 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" }
, | |
| 3153 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440
\\u0438\\u043D\\u0443\\u0438\\u0447+05:30", "+5:30" }, | |
| 3154 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "\\u0413\\u0440\\u
0438\\u043D\\u0443\\u0438\\u0447+5:30", "+5:30" }, | |
| 3155 { "bg", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\\u0418\\u043d
\\u0434\\u0438\\u0439\\u0441\\u043a\\u043e \\u0441\\u0442\\u0430\\u043D\\u0434\\
u0430\\u0440\\u0442\\u043D\\u043E \\u0432\\u0440\\u0435\\u043c\\u0435", "+5:30"
}, | |
| 3156 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" }
, | |
| 3157 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "\\u0413\\u0440
\\u0438\\u043D\\u0443\\u0438\\u0447+05:30", "+5:30" }, | |
| 3158 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "\\u0413\\u0440\\u
0438\\u043D\\u0443\\u0438\\u0447+5:30", "+05:30" }, | |
| 3159 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\\u0418\\u043d
\\u0434\\u0438\\u0439\\u0441\\u043a\\u043e \\u0441\\u0442\\u0430\\u043D\\u0434\\
u0430\\u0440\\u0442\\u043D\\u043E \\u0432\\u0440\\u0435\\u043c\\u0435", "+5:30"
}, | |
| 3160 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "\\u0418\\u043D\\u
0434\\u0438\\u044F", "Asia/Calcutta" }, | |
| 3161 { "bg", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\\u0418\\u043d
\\u0434\\u0438\\u0439\\u0441\\u043a\\u043e \\u0441\\u0442\\u0430\\u043D\\u0434\\
u0430\\u0440\\u0442\\u043D\\u043E \\u0432\\u0440\\u0435\\u043c\\u0435", "Asia/Ca
lcutta" }, | |
| 3162 // ========== | |
| 3163 | |
| 3164 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8
:00" }, | |
| 3165 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:0
0", "-8:00" }, | |
| 3166 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-8", "Am
erica/Los_Angeles" }, | |
| 3167 { "ja", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "\\u30a2\
\u30e1\\u30ea\\u30ab\\u592a\\u5e73\\u6d0b\\u6a19\\u6e96\\u6642", "America/Los_An
geles" }, | |
| 3168 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7
00" }, | |
| 3169 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:0
0", "-7:00" }, | |
| 3170 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-7", "Am
erica/Los_Angeles" }, | |
| 3171 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "\\u30a2\
\u30e1\\u30ea\\u30ab\\u592a\\u5e73\\u6d0b\\u590f\\u6642\\u9593", "America/Los_An
geles" }, | |
| 3172 // icu ja.txt has exemplar city for this time zone | |
| 3173 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "\\u30ED\\u3
0B5\\u30F3\\u30BC\\u30EB\\u30B9\\u6642\\u9593", "America/Los_Angeles" }, | |
| 3174 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "\\u30A2\
\u30E1\\u30EA\\u30AB\\u592A\\u5e73\\u6D0B\\u6642\\u9593", "America/Los_Angeles"
}, | |
| 3175 { "ja", "America/Los_Angeles", "2004-07-15T00:00:00Z", "VVVV", "\\u30ED\
\u30B5\\u30F3\\u30BC\\u30EB\\u30B9\\u6642\\u9593", "America/Los_Angeles" }, | |
| 3176 | |
| 3177 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "
-0300", "-3:00" }, | |
| 3178 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ"
, "GMT-03:00", "-3:00" }, | |
| 3179 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "
GMT-3", "-3:00" }, | |
| 3180 { "ja", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz"
, "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "-3:00" }, | |
| 3181 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "
-0300", "-3:00" }, | |
| 3182 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ"
, "GMT-03:00", "-3:00" }, | |
| 3183 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "
GMT-3", "-3:00" }, | |
| 3184 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz"
, "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "-3:00" }, | |
| 3185 // icu ja.txt does not have info for this time zone | |
| 3186 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "
\\u30D6\\u30A8\\u30CE\\u30B9\\u30A2\\u30A4\\u30EC\\u30B9\\u6642\\u9593", "Americ
a/Buenos_Aires" }, | |
| 3187 { "ja", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv"
, "\\u30A2\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "America/Bu
enos_Aires" }, | |
| 3188 | |
| 3189 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-
3:00" }, | |
| 3190 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:
00", "-3:00" }, | |
| 3191 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-
3:00" }, | |
| 3192 { "ja", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "\\u30A2
\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "-3:00" }, | |
| 3193 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-
3:00" }, | |
| 3194 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:
00", "-3:00" }, | |
| 3195 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-
3:00" }, | |
| 3196 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "\\u30A2
\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "-3:00" }, | |
| 3197 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "\\u30D6\\u
30A8\\u30CE\\u30B9\\u30A2\\u30A4\\u30EC\\u30B9\\u6642\\u9593", "America/Buenos_A
ires" }, | |
| 3198 { "ja", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "\\u30A2
\\u30EB\\u30BC\\u30F3\\u30C1\\u30F3\\u6A19\\u6E96\\u6642", "America/Buenos_Aires
" }, | |
| 3199 | |
| 3200 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00"
}, | |
| 3201 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "
-5:00" }, | |
| 3202 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00"
}, | |
| 3203 { "ja", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "\\u30AD\\u30E
5\\u30FC\\u30D0\\u6A19\\u6E96\\u6642", "-5:00" }, | |
| 3204 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00"
}, | |
| 3205 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "
-4:00" }, | |
| 3206 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00"
}, | |
| 3207 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "\\u30AD\\u30E
5\\u30FC\\u30D0\\u590F\\u6642\\u9593", "-4:00" }, | |
| 3208 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "v", "\\u30ad\\u30e5\\
u30fc\\u30d0\\u6642\\u9593", "America/Havana" }, | |
| 3209 { "ja", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "\\u30ad\\u30e
5\\u30fc\\u30d0\\u6642\\u9593", "America/Havana" }, | |
| 3210 | |
| 3211 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00"
}, | |
| 3212 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+
11:00" }, | |
| 3213 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00"
}, | |
| 3214 { "ja", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "\\u30AA\\u30FC
\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u590F\\u6642\\u9593", "+11:00
" }, | |
| 3215 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00"
}, | |
| 3216 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+
10:00" }, | |
| 3217 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00"
}, | |
| 3218 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "\\u30AA\\u30FC
\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u6A19\\u6E96\\u6642", "+10:00
" }, | |
| 3219 // icu ja.txt does not have info for this time zone | |
| 3220 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "\\u30B7\\u30C9\\u
30CB\\u30FC\\u6642\\u9593", "Australia/Sydney" }, | |
| 3221 { "ja", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "\\u30AA\\u30FC
\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u6642\\u9593", "Australia/Syd
ney" }, | |
| 3222 | |
| 3223 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:0
0" }, | |
| 3224 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00",
"+11:00" }, | |
| 3225 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:
00" }, | |
| 3226 { "ja", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "\\u30AA\\u3
0FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u590F\\u6642\\u9593", "+11
:00" }, | |
| 3227 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:0
0" }, | |
| 3228 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00",
"+10:00" }, | |
| 3229 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:
00" }, | |
| 3230 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "\\u30AA\\u3
0FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u6A19\\u6E96\\u6642", "+10
:00" }, | |
| 3231 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "\\u30B7\\u30C9
\\u30CB\\u30FC\\u6642\\u9593", "Australia/Sydney" }, | |
| 3232 { "ja", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "\\u30AA\\u3
0FC\\u30B9\\u30C8\\u30E9\\u30EA\\u30A2\\u6771\\u90E8\\u6642\\u9593", "Australia/
Sydney" }, | |
| 3233 | |
| 3234 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" }
, | |
| 3235 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00"
}, | |
| 3236 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" }, | |
| 3237 { "ja", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "\\u30B0\\u30EA
\\u30CB\\u30C3\\u30B8\\u6A19\\u6E96\\u6642", "+0:00" }, | |
| 3238 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" }
, | |
| 3239 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+
1:00" }, | |
| 3240 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "+1:00" }
, | |
| 3241 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "\\u82f1\\u56fd
\\u590f\\u6642\\u9593", "+1:00" }, | |
| 3242 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "v", "\\u30a4\\u30ae\\u
30ea\\u30b9\\u6642\\u9593", "Europe/London" }, | |
| 3243 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "\\u30a4\\u30ae
\\u30ea\\u30b9\\u6642\\u9593", "Europe/London" }, | |
| 3244 { "ja", "Europe/London", "2004-07-15T00:00:00Z", "VVVV", "\\u30a4\\u30ae
\\u30ea\\u30b9\\u6642\\u9593", "Europe/London" }, | |
| 3245 | |
| 3246 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, | |
| 3247 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00
" }, | |
| 3248 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" }, | |
| 3249 { "ja", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00
" }, | |
| 3250 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, | |
| 3251 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00
" }, | |
| 3252 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" }, | |
| 3253 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00
" }, | |
| 3254 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" }, | |
| 3255 { "ja", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00
" }, | |
| 3256 | |
| 3257 // JB#5150 | |
| 3258 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" }
, | |
| 3259 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+
5:30" }, | |
| 3260 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+5:30", "+5:30
" }, | |
| 3261 { "ja", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "\\u30A4\\u30F3
\\u30C9\\u6A19\\u6E96\\u6642", "+5:30" }, | |
| 3262 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" }
, | |
| 3263 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+
5:30" }, | |
| 3264 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+5:30", "+05:3
0" }, | |
| 3265 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "\\u30A4\\u30F3
\\u30C9\\u6A19\\u6E96\\u6642", "+5:30" }, | |
| 3266 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "\\u30A4\\u30F3\\u
30C9\\u6642\\u9593", "Asia/Calcutta" }, | |
| 3267 { "ja", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "\\u30A4\\u30F3
\\u30C9\\u6A19\\u6E96\\u6642", "Asia/Calcutta" }, | |
| 3268 | |
| 3269 // ========== | |
| 3270 | |
| 3271 { "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "Z", "-0800", "-8
:00" }, | |
| 3272 { "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-08:0
0", "-8:00" }, | |
| 3273 { "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "z", "GMT-8", "-8
:00" }, | |
| 3274 { "ti", "America/Los_Angeles", "2004-01-15T00:00:00Z", "zzzz", "GMT-08:0
0", "-8:00" }, | |
| 3275 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "Z", "-0700", "-7
:00" }, | |
| 3276 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-07:0
0", "-7:00" }, | |
| 3277 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "z", "GMT-7", "-7
:00" }, | |
| 3278 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "zzzz", "GMT-07:0
0", "-7:00" }, | |
| 3279 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "v", "Los Angeles
", "America/Los_Angeles" }, | |
| 3280 { "ti", "America/Los_Angeles", "2004-07-15T00:00:00Z", "vvvv", "Los Ange
les", "America/Los_Angeles" }, | |
| 3281 | |
| 3282 { "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "
-0300", "-3:00" }, | |
| 3283 { "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ"
, "GMT-03:00", "-3:00" }, | |
| 3284 { "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "
GMT-3", "-3:00" }, | |
| 3285 { "ti", "America/Argentina/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz"
, "GMT-03:00", "-3:00" }, | |
| 3286 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "
-0300", "-3:00" }, | |
| 3287 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ"
, "GMT-03:00", "-3:00" }, | |
| 3288 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "
GMT-3", "-3:00" }, | |
| 3289 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz"
, "GMT-03:00", "-3:00" }, | |
| 3290 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "
Buenos Aires", "America/Buenos_Aires" }, | |
| 3291 { "ti", "America/Argentina/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv"
, "Buenos Aires", "America/Buenos_Aires" }, | |
| 3292 | |
| 3293 { "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "Z", "-0300", "-
3:00" }, | |
| 3294 { "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:
00", "-3:00" }, | |
| 3295 { "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "z", "GMT-3", "-
3:00" }, | |
| 3296 { "ti", "America/Buenos_Aires", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:
00", "-3:00" }, | |
| 3297 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "Z", "-0300", "-
3:00" }, | |
| 3298 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:
00", "-3:00" }, | |
| 3299 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "z", "GMT-3", "-
3:00" }, | |
| 3300 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:
00", "-3:00" }, | |
| 3301 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "v", "Buenos Air
es", "America/Buenos_Aires" }, | |
| 3302 { "ti", "America/Buenos_Aires", "2004-07-15T00:00:00Z", "vvvv", "Buenos
Aires", "America/Buenos_Aires" }, | |
| 3303 | |
| 3304 { "ti", "America/Havana", "2004-01-15T00:00:00Z", "Z", "-0500", "-5:00"
}, | |
| 3305 { "ti", "America/Havana", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-05:00", "
-5:00" }, | |
| 3306 { "ti", "America/Havana", "2004-01-15T00:00:00Z", "z", "GMT-5", "-5:00"
}, | |
| 3307 { "ti", "America/Havana", "2004-01-15T00:00:00Z", "zzzz", "GMT-05:00", "
-5:00" }, | |
| 3308 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "Z", "-0400", "-4:00"
}, | |
| 3309 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-04:00", "
-4:00" }, | |
| 3310 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "z", "GMT-4", "-4:00"
}, | |
| 3311 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "zzzz", "GMT-04:00", "
-4:00" }, | |
| 3312 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "v", "CU", "America/Ha
vana" }, | |
| 3313 { "ti", "America/Havana", "2004-07-15T00:00:00Z", "vvvv", "CU", "America
/Havana" }, | |
| 3314 | |
| 3315 { "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:00"
}, | |
| 3316 { "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00", "+
11:00" }, | |
| 3317 { "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:00"
}, | |
| 3318 { "ti", "Australia/ACT", "2004-01-15T00:00:00Z", "zzzz", "GMT+11:00", "+
11:00" }, | |
| 3319 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:00"
}, | |
| 3320 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00", "+
10:00" }, | |
| 3321 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:00"
}, | |
| 3322 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "zzzz", "GMT+10:00", "+
10:00" }, | |
| 3323 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "v", "Sydney", "Austral
ia/Sydney" }, | |
| 3324 { "ti", "Australia/ACT", "2004-07-15T00:00:00Z", "vvvv", "Sydney", "Aust
ralia/Sydney" }, | |
| 3325 | |
| 3326 { "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "Z", "+1100", "+11:0
0" }, | |
| 3327 { "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+11:00",
"+11:00" }, | |
| 3328 { "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "z", "GMT+11", "+11:
00" }, | |
| 3329 { "ti", "Australia/Sydney", "2004-01-15T00:00:00Z", "zzzz", "GMT+11:00",
"+11:00" }, | |
| 3330 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "Z", "+1000", "+10:0
0" }, | |
| 3331 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+10:00",
"+10:00" }, | |
| 3332 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "z", "GMT+10", "+10:
00" }, | |
| 3333 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "zzzz", "GMT+10:00",
"+10:00" }, | |
| 3334 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "v", "Sydney", "Aust
ralia/Sydney" }, | |
| 3335 { "ti", "Australia/Sydney", "2004-07-15T00:00:00Z", "vvvv", "Sydney", "A
ustralia/Sydney" }, | |
| 3336 | |
| 3337 { "ti", "Europe/London", "2004-01-15T00:00:00Z", "Z", "+0000", "+0:00" }
, | |
| 3338 { "ti", "Europe/London", "2004-01-15T00:00:00Z", "ZZZZ", "GMT", "+0:00"
}, | |
| 3339 { "ti", "Europe/London", "2004-01-15T00:00:00Z", "z", "GMT", "+0:00" }, | |
| 3340 { "ti", "Europe/London", "2004-01-15T00:00:00Z", "zzzz", "GMT", "+0:00"
}, | |
| 3341 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "Z", "+0100", "+1:00" }
, | |
| 3342 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+01:00", "+
1:00" }, | |
| 3343 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "z", "GMT+1", "+1:00" }
, | |
| 3344 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "zzzz", "GMT+01:00", "+
1:00" }, | |
| 3345 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "v", "GB", "Europe/Lond
on" }, | |
| 3346 { "ti", "Europe/London", "2004-07-15T00:00:00Z", "vvvv", "GB", "Europe/L
ondon" }, | |
| 3347 | |
| 3348 { "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "Z", "-0300", "-3:00" }, | |
| 3349 { "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00
" }, | |
| 3350 { "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "z", "GMT-3", "-3:00" }, | |
| 3351 { "ti", "Etc/GMT+3", "2004-01-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00
" }, | |
| 3352 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "Z", "-0300", "-3:00" }, | |
| 3353 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "ZZZZ", "GMT-03:00", "-3:00
" }, | |
| 3354 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "z", "GMT-3", "-3:00" }, | |
| 3355 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "zzzz", "GMT-03:00", "-3:00
" }, | |
| 3356 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "v", "GMT-3", "-3:00" }, | |
| 3357 { "ti", "Etc/GMT+3", "2004-07-15T00:00:00Z", "vvvv", "GMT-03:00", "-3:00
" }, | |
| 3358 | |
| 3359 // JB#5150 | |
| 3360 { "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "Z", "+0530", "+5:30" }
, | |
| 3361 { "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+
5:30" }, | |
| 3362 { "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "z", "GMT+5:30", "+5:30
" }, | |
| 3363 { "ti", "Asia/Calcutta", "2004-01-15T00:00:00Z", "zzzz", "GMT+05:30", "+
5:30" }, | |
| 3364 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "Z", "+0530", "+5:30" }
, | |
| 3365 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "ZZZZ", "GMT+05:30", "+
5:30" }, | |
| 3366 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "z", "GMT+5:30", "+05:3
0" }, | |
| 3367 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "zzzz", "GMT+05:30", "+
5:30" }, | |
| 3368 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "v", "IN", "Alna/Calcut
ta" }, | |
| 3369 { "ti", "Asia/Calcutta", "2004-07-15T00:00:00Z", "vvvv", "IN", "Asia/Cal
cutta" }, | |
| 3370 | |
| 3371 // Ticket#8589 Partial location name to use country name if the zone is
the golden | |
| 3372 // zone for the time zone's country. | |
| 3373 { "en_MX", "America/Chicago", "1995-07-15T00:00:00Z", "vvvv", "Central T
ime (United States)", "America/Chicago"}, | |
| 3374 | |
| 3375 // Tests proper handling of time zones that should have empty sets when
inherited from the parent. | |
| 3376 // For example, en_GB understands CET as Central European Time, but en_H
K, which inherits from en_GB | |
| 3377 // does not | |
| 3378 { "en_GB", "Europe/Paris", "2004-01-15T00:00:00Z", "zzzz", "Central Euro
pean Standard Time", "+1:00"}, | |
| 3379 { "en_GB", "Europe/Paris", "2004-07-15T00:00:00Z", "zzzz", "Central Euro
pean Summer Time", "+2:00"}, | |
| 3380 { "en_GB", "Europe/Paris", "2004-01-15T00:00:00Z", "z", "CET", "+1:00"}, | |
| 3381 { "en_GB", "Europe/Paris", "2004-07-15T00:00:00Z", "z", "CEST", "+2:00"}
, | |
| 3382 { "en_HK", "Europe/Paris", "2004-01-15T00:00:00Z", "zzzz", "Central Euro
pean Standard Time", "+1:00"}, | |
| 3383 { "en_HK", "Europe/Paris", "2004-07-15T00:00:00Z", "zzzz", "Central Euro
pean Summer Time", "+2:00"}, | |
| 3384 { "en_HK", "Europe/Paris", "2004-01-15T00:00:00Z", "z", "GMT+1", "+1:00"
}, | |
| 3385 { "en_HK", "Europe/Paris", "2004-07-15T00:00:00Z", "z", "GMT+2", "+2:00"
}, | |
| 3386 | |
| 3387 { NULL, NULL, NULL, NULL, NULL, NULL }, | |
| 3388 }; | |
| 3389 | |
| 3390 UErrorCode status = U_ZERO_ERROR; | |
| 3391 Calendar *cal = GregorianCalendar::createInstance(status); | |
| 3392 if (failure(status, "GregorianCalendar::createInstance", TRUE)) return; | |
| 3393 SimpleDateFormat testfmt(UnicodeString("yyyy-MM-dd'T'HH:mm:ss'Z'"), status); | |
| 3394 if (failure(status, "SimpleDateFormat constructor", TRUE)) return; | |
| 3395 testfmt.setTimeZone(*TimeZone::getGMT()); | |
| 3396 | |
| 3397 for (int i = 0; fallbackTests[i][0]; i++) { | |
| 3398 const char **testLine = fallbackTests[i]; | |
| 3399 UnicodeString info[5]; | |
| 3400 for ( int j = 0 ; j < 5 ; j++ ) { | |
| 3401 info[j] = UnicodeString(testLine[j], -1, US_INV); | |
| 3402 } | |
| 3403 info[4] = info[4].unescape(); | |
| 3404 logln("%s;%s;%s;%s", testLine[0], testLine[1], testLine[2], testLine[3])
; | |
| 3405 | |
| 3406 TimeZone *tz = TimeZone::createTimeZone(info[1]); | |
| 3407 | |
| 3408 UDate d = testfmt.parse(testLine[2], status); | |
| 3409 cal->setTime(d, status); | |
| 3410 if (U_FAILURE(status)) { | |
| 3411 errln(UnicodeString("Failed to set date: ") + testLine[2]); | |
| 3412 } | |
| 3413 | |
| 3414 SimpleDateFormat fmt(info[3], Locale(testLine[0]),status); | |
| 3415 ASSERT_OK(status); | |
| 3416 cal->adoptTimeZone(tz); | |
| 3417 UnicodeString result; | |
| 3418 FieldPosition pos(0); | |
| 3419 fmt.format(*cal,result,pos); | |
| 3420 if (result != info[4]) { | |
| 3421 errln(info[0] + ";" + info[1] + ";" + info[2] + ";" + info[3] + " ex
pected: '" + | |
| 3422 info[4] + "' but got: '" + result + "'"); | |
| 3423 } | |
| 3424 } | |
| 3425 delete cal; | |
| 3426 } | |
| 3427 | |
| 3428 void DateFormatTest::TestRoundtripWithCalendar(void) { | |
| 3429 UErrorCode status = U_ZERO_ERROR; | |
| 3430 | |
| 3431 TimeZone *tz = TimeZone::createTimeZone("Europe/Paris"); | |
| 3432 TimeZone *gmt = TimeZone::createTimeZone("Etc/GMT"); | |
| 3433 | |
| 3434 Calendar *calendars[] = { | |
| 3435 Calendar::createInstance(*tz, Locale("und@calendar=gregorian"), status), | |
| 3436 Calendar::createInstance(*tz, Locale("und@calendar=buddhist"), status), | |
| 3437 // Calendar::createInstance(*tz, Locale("und@calendar=hebrew"), status), | |
| 3438 Calendar::createInstance(*tz, Locale("und@calendar=islamic"), status), | |
| 3439 Calendar::createInstance(*tz, Locale("und@calendar=japanese"), status), | |
| 3440 NULL | |
| 3441 }; | |
| 3442 if (U_FAILURE(status)) { | |
| 3443 dataerrln("Failed to initialize calendars: %s", u_errorName(status)); | |
| 3444 for (int i = 0; calendars[i] != NULL; i++) { | |
| 3445 delete calendars[i]; | |
| 3446 } | |
| 3447 return; | |
| 3448 } | |
| 3449 | |
| 3450 //FIXME The formatters commented out below are currently failing because of | |
| 3451 // the calendar calculation problem reported by #6691 | |
| 3452 | |
| 3453 // The order of test formatters must match the order of calendars above. | |
| 3454 DateFormat *formatters[] = { | |
| 3455 DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull,
Locale("en_US")), //calendar=gregorian | |
| 3456 DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull,
Locale("th_TH")), //calendar=buddhist | |
| 3457 // DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFul
l, Locale("he_IL@calendar=hebrew")), | |
| 3458 DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull,
Locale("ar_EG@calendar=islamic")), | |
| 3459 // DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFul
l, Locale("ja_JP@calendar=japanese")), | |
| 3460 NULL | |
| 3461 }; | |
| 3462 | |
| 3463 UDate d = Calendar::getNow(); | |
| 3464 UnicodeString buf; | |
| 3465 FieldPosition fpos; | |
| 3466 ParsePosition ppos; | |
| 3467 | |
| 3468 for (int i = 0; formatters[i] != NULL; i++) { | |
| 3469 buf.remove(); | |
| 3470 fpos.setBeginIndex(0); | |
| 3471 fpos.setEndIndex(0); | |
| 3472 calendars[i]->setTime(d, status); | |
| 3473 | |
| 3474 // Normal case output - the given calendar matches the calendar | |
| 3475 // used by the formatter | |
| 3476 formatters[i]->format(*calendars[i], buf, fpos); | |
| 3477 UnicodeString refStr(buf); | |
| 3478 | |
| 3479 for (int j = 0; calendars[j] != NULL; j++) { | |
| 3480 if (j == i) { | |
| 3481 continue; | |
| 3482 } | |
| 3483 buf.remove(); | |
| 3484 fpos.setBeginIndex(0); | |
| 3485 fpos.setEndIndex(0); | |
| 3486 calendars[j]->setTime(d, status); | |
| 3487 | |
| 3488 // Even the different calendar type is specified, | |
| 3489 // we should get the same result. | |
| 3490 formatters[i]->format(*calendars[j], buf, fpos); | |
| 3491 if (refStr != buf) { | |
| 3492 errln((UnicodeString)"FAIL: Different format result with a diffe
rent calendar for the same time -" | |
| 3493 + "\n Reference calendar type=" + calendars[i]->getType(
) | |
| 3494 + "\n Another calendar type=" + calendars[j]->getType() | |
| 3495 + "\n Expected result=" + refStr | |
| 3496 + "\n Actual result=" + buf); | |
| 3497 } | |
| 3498 } | |
| 3499 | |
| 3500 calendars[i]->setTimeZone(*gmt); | |
| 3501 calendars[i]->clear(); | |
| 3502 ppos.setErrorIndex(-1); | |
| 3503 ppos.setIndex(0); | |
| 3504 | |
| 3505 // Normal case parse result - the given calendar matches the calendar | |
| 3506 // used by the formatter | |
| 3507 formatters[i]->parse(refStr, *calendars[i], ppos); | |
| 3508 | |
| 3509 for (int j = 0; calendars[j] != NULL; j++) { | |
| 3510 if (j == i) { | |
| 3511 continue; | |
| 3512 } | |
| 3513 calendars[j]->setTimeZone(*gmt); | |
| 3514 calendars[j]->clear(); | |
| 3515 ppos.setErrorIndex(-1); | |
| 3516 ppos.setIndex(0); | |
| 3517 | |
| 3518 // Even the different calendar type is specified, | |
| 3519 // we should get the same time and time zone. | |
| 3520 formatters[i]->parse(refStr, *calendars[j], ppos); | |
| 3521 if (calendars[i]->getTime(status) != calendars[j]->getTime(status) | |
| 3522 || calendars[i]->getTimeZone() != calendars[j]->getTimeZone()) { | |
| 3523 UnicodeString tzid; | |
| 3524 errln((UnicodeString)"FAIL: Different parse result with a differ
ent calendar for the same string -" | |
| 3525 + "\n Reference calendar type=" + calendars[i]->getType(
) | |
| 3526 + "\n Another calendar type=" + calendars[j]->getType() | |
| 3527 + "\n Date string=" + refStr | |
| 3528 + "\n Expected time=" + calendars[i]->getTime(status) | |
| 3529 + "\n Expected time zone=" + calendars[i]->getTimeZone()
.getID(tzid) | |
| 3530 + "\n Actual time=" + calendars[j]->getTime(status) | |
| 3531 + "\n Actual time zone=" + calendars[j]->getTimeZone().g
etID(tzid)); | |
| 3532 } | |
| 3533 } | |
| 3534 if (U_FAILURE(status)) { | |
| 3535 errln((UnicodeString)"FAIL: " + u_errorName(status)); | |
| 3536 break; | |
| 3537 } | |
| 3538 } | |
| 3539 | |
| 3540 delete tz; | |
| 3541 delete gmt; | |
| 3542 for (int i = 0; calendars[i] != NULL; i++) { | |
| 3543 delete calendars[i]; | |
| 3544 } | |
| 3545 for (int i = 0; formatters[i] != NULL; i++) { | |
| 3546 delete formatters[i]; | |
| 3547 } | |
| 3548 } | |
| 3549 | |
| 3550 /* | |
| 3551 void DateFormatTest::TestRelativeError(void) | |
| 3552 { | |
| 3553 UErrorCode status; | |
| 3554 Locale en("en"); | |
| 3555 | |
| 3556 DateFormat *en_reltime_reldate = DateFormat::createDateTimeInstance(
DateFormat::kFullRelative,DateFormat::kFullRelative,en); | |
| 3557 if(en_reltime_reldate == NULL) { | |
| 3558 logln("PASS: rel date/rel time failed"); | |
| 3559 } else { | |
| 3560 errln("FAIL: rel date/rel time created, should have failed."); | |
| 3561 delete en_reltime_reldate; | |
| 3562 } | |
| 3563 } | |
| 3564 | |
| 3565 void DateFormatTest::TestRelativeOther(void) | |
| 3566 { | |
| 3567 logln("Nothing in this test. When we get more data from CLDR, put in some te
sts of -2, +2, etc. "); | |
| 3568 } | |
| 3569 */ | |
| 3570 | |
| 3571 void DateFormatTest::Test6338(void) | |
| 3572 { | |
| 3573 UErrorCode status = U_ZERO_ERROR; | |
| 3574 | |
| 3575 SimpleDateFormat *fmt1 = new SimpleDateFormat(UnicodeString("y-M-d"), Locale
("ar"), status); | |
| 3576 if (failure(status, "new SimpleDateFormat", TRUE)) return; | |
| 3577 | |
| 3578 UDate dt1 = date(2008-1900, UCAL_JUNE, 10, 12, 00); | |
| 3579 UnicodeString str1; | |
| 3580 str1 = fmt1->format(dt1, str1); | |
| 3581 logln(str1); | |
| 3582 | |
| 3583 UDate dt11 = fmt1->parse(str1, status); | |
| 3584 failure(status, "fmt->parse"); | |
| 3585 | |
| 3586 UnicodeString str11; | |
| 3587 str11 = fmt1->format(dt11, str11); | |
| 3588 logln(str11); | |
| 3589 | |
| 3590 if (str1 != str11) { | |
| 3591 errln((UnicodeString)"FAIL: Different dates str1:" + str1 | |
| 3592 + " str2:" + str11); | |
| 3593 } | |
| 3594 delete fmt1; | |
| 3595 | |
| 3596 ///////////////// | |
| 3597 | |
| 3598 status = U_ZERO_ERROR; | |
| 3599 SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("y M d"), Locale
("ar"), status); | |
| 3600 failure(status, "new SimpleDateFormat"); | |
| 3601 | |
| 3602 UDate dt2 = date(2008-1900, UCAL_JUNE, 10, 12, 00); | |
| 3603 UnicodeString str2; | |
| 3604 str2 = fmt2->format(dt2, str2); | |
| 3605 logln(str2); | |
| 3606 | |
| 3607 UDate dt22 = fmt2->parse(str2, status); | |
| 3608 failure(status, "fmt->parse"); | |
| 3609 | |
| 3610 UnicodeString str22; | |
| 3611 str22 = fmt2->format(dt22, str22); | |
| 3612 logln(str22); | |
| 3613 | |
| 3614 if (str2 != str22) { | |
| 3615 errln((UnicodeString)"FAIL: Different dates str1:" + str2 | |
| 3616 + " str2:" + str22); | |
| 3617 } | |
| 3618 delete fmt2; | |
| 3619 | |
| 3620 ///////////////// | |
| 3621 | |
| 3622 status = U_ZERO_ERROR; | |
| 3623 SimpleDateFormat *fmt3 = new SimpleDateFormat(UnicodeString("y-M-d"), Locale
("en-us"), status); | |
| 3624 failure(status, "new SimpleDateFormat"); | |
| 3625 | |
| 3626 UDate dt3 = date(2008-1900, UCAL_JUNE, 10, 12, 00); | |
| 3627 UnicodeString str3; | |
| 3628 str3 = fmt3->format(dt3, str3); | |
| 3629 logln(str3); | |
| 3630 | |
| 3631 UDate dt33 = fmt3->parse(str3, status); | |
| 3632 failure(status, "fmt->parse"); | |
| 3633 | |
| 3634 UnicodeString str33; | |
| 3635 str33 = fmt3->format(dt33, str33); | |
| 3636 logln(str33); | |
| 3637 | |
| 3638 if (str3 != str33) { | |
| 3639 errln((UnicodeString)"FAIL: Different dates str1:" + str3 | |
| 3640 + " str2:" + str33); | |
| 3641 } | |
| 3642 delete fmt3; | |
| 3643 | |
| 3644 ///////////////// | |
| 3645 | |
| 3646 status = U_ZERO_ERROR; | |
| 3647 SimpleDateFormat *fmt4 = new SimpleDateFormat(UnicodeString("y M d"), Local
e("en-us"), status); | |
| 3648 failure(status, "new SimpleDateFormat"); | |
| 3649 | |
| 3650 UDate dt4 = date(2008-1900, UCAL_JUNE, 10, 12, 00); | |
| 3651 UnicodeString str4; | |
| 3652 str4 = fmt4->format(dt4, str4); | |
| 3653 logln(str4); | |
| 3654 | |
| 3655 UDate dt44 = fmt4->parse(str4, status); | |
| 3656 failure(status, "fmt->parse"); | |
| 3657 | |
| 3658 UnicodeString str44; | |
| 3659 str44 = fmt4->format(dt44, str44); | |
| 3660 logln(str44); | |
| 3661 | |
| 3662 if (str4 != str44) { | |
| 3663 errln((UnicodeString)"FAIL: Different dates str1:" + str4 | |
| 3664 + " str2:" + str44); | |
| 3665 } | |
| 3666 delete fmt4; | |
| 3667 | |
| 3668 } | |
| 3669 | |
| 3670 void DateFormatTest::Test6726(void) | |
| 3671 { | |
| 3672 // status | |
| 3673 // UErrorCode status = U_ZERO_ERROR; | |
| 3674 | |
| 3675 // fmtf, fmtl, fmtm, fmts; | |
| 3676 UnicodeString strf, strl, strm, strs; | |
| 3677 UDate dt = date(2008-1900, UCAL_JUNE, 10, 12, 00); | |
| 3678 | |
| 3679 Locale loc("ja"); | |
| 3680 DateFormat* fmtf = DateFormat::createDateTimeInstance(DateFormat::FULL, Date
Format::FULL, loc); | |
| 3681 DateFormat* fmtl = DateFormat::createDateTimeInstance(DateFormat::LONG, Date
Format::FULL, loc); | |
| 3682 DateFormat* fmtm = DateFormat::createDateTimeInstance(DateFormat::MEDIUM, Da
teFormat::FULL, loc); | |
| 3683 DateFormat* fmts = DateFormat::createDateTimeInstance(DateFormat::SHORT, Dat
eFormat::FULL, loc); | |
| 3684 if (fmtf == NULL || fmtl == NULL || fmtm == NULL || fmts == NULL) { | |
| 3685 dataerrln("Unable to create DateFormat. got NULL."); | |
| 3686 /* It may not be true that if one is NULL all is NULL. Just to be safe.
*/ | |
| 3687 delete fmtf; | |
| 3688 delete fmtl; | |
| 3689 delete fmtm; | |
| 3690 delete fmts; | |
| 3691 | |
| 3692 return; | |
| 3693 } | |
| 3694 strf = fmtf->format(dt, strf); | |
| 3695 strl = fmtl->format(dt, strl); | |
| 3696 strm = fmtm->format(dt, strm); | |
| 3697 strs = fmts->format(dt, strs); | |
| 3698 | |
| 3699 | |
| 3700 logln("strm.charAt(10)=%04X wanted 0x20\n", strm.charAt(10)); | |
| 3701 if (strm.charAt(10) != UChar(0x0020)) { | |
| 3702 errln((UnicodeString)"FAIL: Improper formatted date: " + strm ); | |
| 3703 } | |
| 3704 logln("strs.charAt(10)=%04X wanted 0x20\n", strs.charAt(8)); | |
| 3705 if (strs.charAt(10) != UChar(0x0020)) { | |
| 3706 errln((UnicodeString)"FAIL: Improper formatted date: " + strs); | |
| 3707 } | |
| 3708 | |
| 3709 delete fmtf; | |
| 3710 delete fmtl; | |
| 3711 delete fmtm; | |
| 3712 delete fmts; | |
| 3713 | |
| 3714 return; | |
| 3715 } | |
| 3716 | |
| 3717 /** | |
| 3718 * Test DateFormat's parsing of default GMT variants. See ticket#6135 | |
| 3719 */ | |
| 3720 void DateFormatTest::TestGMTParsing() { | |
| 3721 const char* DATA[] = { | |
| 3722 "HH:mm:ss Z", | |
| 3723 | |
| 3724 // pattern, input, expected output (in quotes) | |
| 3725 "HH:mm:ss Z", "10:20:30 GMT+03:00", "10:20:30 +0300", | |
| 3726 "HH:mm:ss Z", "10:20:30 UT-02:00", "10:20:30 -0200", | |
| 3727 "HH:mm:ss Z", "10:20:30 GMT", "10:20:30 +0000", | |
| 3728 "HH:mm:ss vvvv", "10:20:30 UT+10:00", "10:20:30 +1000", | |
| 3729 "HH:mm:ss zzzz", "10:20:30 UTC", "10:20:30 +0000", // stand
alone "UTC" | |
| 3730 "ZZZZ HH:mm:ss", "UT 10:20:30", "10:20:30 +0000", | |
| 3731 "z HH:mm:ss", "UT+0130 10:20:30", "10:20:30 +0130", | |
| 3732 "z HH:mm:ss", "UTC+0130 10:20:30", "10:20:30 +0130", | |
| 3733 // Note: GMT-1100 no longer works because of the introduction of the sho
rt | |
| 3734 // localized GMT support. Previous implementation support this level of | |
| 3735 // leniency (no separator char in localized GMT format), but the new | |
| 3736 // implementation handles GMT-11 as the legitimate short localized GMT f
ormat | |
| 3737 // and stop at there. Otherwise, roundtrip would be broken. | |
| 3738 //"HH mm Z ss", "10 20 GMT-1100 30", "10:20:30 -1100", | |
| 3739 "HH mm Z ss", "10 20 GMT-11 30", "10:20:30 -1100", | |
| 3740 "HH:mm:ssZZZZZ", "14:25:45Z", "14:25:45 +0000", | |
| 3741 "HH:mm:ssZZZZZ", "15:00:00-08:00", "15:00:00 -0800", | |
| 3742 }; | |
| 3743 const int32_t DATA_len = sizeof(DATA)/sizeof(DATA[0]); | |
| 3744 expectParse(DATA, DATA_len, Locale("en")); | |
| 3745 } | |
| 3746 | |
| 3747 // Test case for localized GMT format parsing | |
| 3748 // with no delimitters in offset format (Chinese locale) | |
| 3749 void DateFormatTest::Test6880() { | |
| 3750 UErrorCode status = U_ZERO_ERROR; | |
| 3751 UDate d1, d2, dp1, dp2, dexp1, dexp2; | |
| 3752 UnicodeString s1, s2; | |
| 3753 | |
| 3754 TimeZone *tz = TimeZone::createTimeZone("Asia/Shanghai"); | |
| 3755 GregorianCalendar gcal(*tz, status); | |
| 3756 if (failure(status, "construct GregorianCalendar", TRUE)) return; | |
| 3757 | |
| 3758 gcal.clear(); | |
| 3759 gcal.set(1900, UCAL_JULY, 1, 12, 00); // offset 8:05:43 | |
| 3760 d1 = gcal.getTime(status); | |
| 3761 | |
| 3762 gcal.clear(); | |
| 3763 gcal.set(1950, UCAL_JULY, 1, 12, 00); // offset 8:00 | |
| 3764 d2 = gcal.getTime(status); | |
| 3765 | |
| 3766 gcal.clear(); | |
| 3767 gcal.set(1970, UCAL_JANUARY, 1, 12, 00); | |
| 3768 dexp2 = gcal.getTime(status); | |
| 3769 dexp1 = dexp2 - (5*60 + 43)*1000; // subtract 5m43s | |
| 3770 | |
| 3771 if (U_FAILURE(status)) { | |
| 3772 errln("FAIL: Gregorian calendar error"); | |
| 3773 } | |
| 3774 | |
| 3775 DateFormat *fmt = DateFormat::createTimeInstance(DateFormat::kFull, Locale("
zh")); | |
| 3776 if (fmt == NULL) { | |
| 3777 dataerrln("Unable to create DateFormat. Got NULL."); | |
| 3778 return; | |
| 3779 } | |
| 3780 fmt->adoptTimeZone(tz); | |
| 3781 | |
| 3782 fmt->format(d1, s1); | |
| 3783 fmt->format(d2, s2); | |
| 3784 | |
| 3785 dp1 = fmt->parse(s1, status); | |
| 3786 dp2 = fmt->parse(s2, status); | |
| 3787 | |
| 3788 if (U_FAILURE(status)) { | |
| 3789 errln("FAIL: Parse failure"); | |
| 3790 } | |
| 3791 | |
| 3792 if (dp1 != dexp1) { | |
| 3793 errln("FAIL: Failed to parse " + s1 + " parsed: " + dp1 + " expected: "
+ dexp1); | |
| 3794 } | |
| 3795 if (dp2 != dexp2) { | |
| 3796 errln("FAIL: Failed to parse " + s2 + " parsed: " + dp2 + " expected: "
+ dexp2); | |
| 3797 } | |
| 3798 | |
| 3799 delete fmt; | |
| 3800 } | |
| 3801 | |
| 3802 typedef struct { | |
| 3803 const char * localeStr; | |
| 3804 UBool lenient; | |
| 3805 UBool expectFail; | |
| 3806 UnicodeString datePattern; | |
| 3807 UnicodeString dateString; | |
| 3808 } NumAsStringItem; | |
| 3809 | |
| 3810 void DateFormatTest::TestNumberAsStringParsing() | |
| 3811 { | |
| 3812 const NumAsStringItem items[] = { | |
| 3813 // loc lenient fail? datePattern
dateString | |
| 3814 { "", FALSE, TRUE, UnicodeString("y MMMM d HH:mm:ss"),
UnicodeString("2009 7 14 08:43:57") }, | |
| 3815 { "", TRUE, FALSE, UnicodeString("y MMMM d HH:mm:ss"),
UnicodeString("2009 7 14 08:43:57") }, | |
| 3816 { "en", FALSE, FALSE, UnicodeString("MMM d, y"),
UnicodeString("Jul 14, 2009") }, | |
| 3817 { "en", TRUE, FALSE, UnicodeString("MMM d, y"),
UnicodeString("Jul 14, 2009") }, | |
| 3818 { "en", FALSE, TRUE, UnicodeString("MMM d, y"),
UnicodeString("7 14, 2009") }, | |
| 3819 { "en", TRUE, FALSE, UnicodeString("MMM d, y"),
UnicodeString("7 14, 2009") }, | |
| 3820 { "ja", FALSE, FALSE, UnicodeString("yyyy/MM/dd"),
UnicodeString("2009/07/14") }, | |
| 3821 { "ja", TRUE, FALSE, UnicodeString("yyyy/MM/dd"),
UnicodeString("2009/07/14") }, | |
| 3822 //{ "ja", FALSE, FALSE, UnicodeString("yyyy/MMMMM/d"),
UnicodeString("2009/7/14") }, // #8860 covers test failure | |
| 3823 { "ja", TRUE, FALSE, UnicodeString("yyyy/MMMMM/d"),
UnicodeString("2009/7/14") }, | |
| 3824 { "ja", FALSE, FALSE, CharsToUnicodeString("y\\u5E74M\\u6708d\\u65E5"),
CharsToUnicodeString("2009\\u5E747\\u670814\\u65E5") }, | |
| 3825 { "ja", TRUE, FALSE, CharsToUnicodeString("y\\u5E74M\\u6708d\\u65E5"),
CharsToUnicodeString("2009\\u5E747\\u670814\\u65E5") }, | |
| 3826 { "ja", FALSE, FALSE, CharsToUnicodeString("y\\u5E74MMMd\\u65E5"),
CharsToUnicodeString("2009\\u5E747\\u670814\\u65E5") }, | |
| 3827 { "ja", TRUE, FALSE, CharsToUnicodeString("y\\u5E74MMMd\\u65E5"),
CharsToUnicodeString("2009\\u5E747\\u670814\\u65E5") }, // #8820 fixes test
failure | |
| 3828 { "ko", FALSE, FALSE, UnicodeString("yyyy. M. d."),
UnicodeString("2009. 7. 14.") }, | |
| 3829 { "ko", TRUE, FALSE, UnicodeString("yyyy. M. d."),
UnicodeString("2009. 7. 14.") }, | |
| 3830 { "ko", FALSE, FALSE, UnicodeString("yyyy. MMMMM d."),
CharsToUnicodeString("2009. 7\\uC6D4 14.") }, | |
| 3831 { "ko", TRUE, FALSE, UnicodeString("yyyy. MMMMM d."),
CharsToUnicodeString("2009. 7\\uC6D4 14.") }, // #8820 fixes test
failure | |
| 3832 { "ko", FALSE, FALSE, CharsToUnicodeString("y\\uB144 M\\uC6D4 d\\uC77C")
, CharsToUnicodeString("2009\\uB144 7\\uC6D4 14\\uC77C") }, | |
| 3833 { "ko", TRUE, FALSE, CharsToUnicodeString("y\\uB144 M\\uC6D4 d\\uC77C")
, CharsToUnicodeString("2009\\uB144 7\\uC6D4 14\\uC77C") }, | |
| 3834 { "ko", FALSE, FALSE, CharsToUnicodeString("y\\uB144 MMM d\\uC77C"),
CharsToUnicodeString("2009\\uB144 7\\uC6D4 14\\uC77C") }, | |
| 3835 { "ko", TRUE, FALSE, CharsToUnicodeString("y\\uB144 MMM d\\uC77C"),
CharsToUnicodeString("2009\\uB144 7\\uC6D4 14\\uC77C") }, // #8820 fixes test
failure | |
| 3836 { NULL, FALSE, FALSE, UnicodeString(""),
UnicodeString("") } | |
| 3837 }; | |
| 3838 const NumAsStringItem * itemPtr; | |
| 3839 for (itemPtr = items; itemPtr->localeStr != NULL; itemPtr++ ) { | |
| 3840 Locale locale = Locale::createFromName(itemPtr->localeStr); | |
| 3841 UErrorCode status = U_ZERO_ERROR; | |
| 3842 SimpleDateFormat *formatter = new SimpleDateFormat(itemPtr->datePattern,
locale, status); | |
| 3843 if (formatter == NULL || U_FAILURE(status)) { | |
| 3844 dataerrln("Unable to create SimpleDateFormat - %s", u_errorName(stat
us)); | |
| 3845 return; | |
| 3846 } | |
| 3847 | |
| 3848 formatter->setLenient(itemPtr->lenient); | |
| 3849 formatter->setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, itemPtr->len
ient, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, itemPtr->lenient, st
atus); | |
| 3850 UDate date1 = formatter->parse(itemPtr->dateString, status); | |
| 3851 if (U_FAILURE(status)) { | |
| 3852 if (!itemPtr->expectFail) { | |
| 3853 errln("FAIL, err when expected success: Locale \"" + UnicodeStri
ng(itemPtr->localeStr) + "\", lenient " + itemPtr->lenient + | |
| 3854 ": using pattern \"" + itemPtr->datePattern + "\", could
not parse \"" + itemPtr->dateString + "\"; err: " + u_errorName(status) ); | |
| 3855 } | |
| 3856 } else if (itemPtr->expectFail) { | |
| 3857 errln("FAIL, expected err but got none: Locale \"" + UnicodeStri
ng(itemPtr->localeStr) + "\", lenient " + itemPtr->lenient + | |
| 3858 ": using pattern \"" + itemPtr->datePattern + "\", did p
arse \"" + itemPtr->dateString + "\"." ); | |
| 3859 } else if (!itemPtr->lenient) { | |
| 3860 UnicodeString formatted; | |
| 3861 formatter->format(date1, formatted); | |
| 3862 if (formatted != itemPtr->dateString) { | |
| 3863 errln("FAIL, mismatch formatting parsed date: Locale \"" + Unico
deString(itemPtr->localeStr) + "\", lenient " + itemPtr->lenient + | |
| 3864 ": using pattern \"" + itemPtr->datePattern + "\", did p
arse \"" + itemPtr->dateString + "\", formatted result \"" + formatted + "\"."); | |
| 3865 } | |
| 3866 } | |
| 3867 | |
| 3868 delete formatter; | |
| 3869 } | |
| 3870 } | |
| 3871 | |
| 3872 void DateFormatTest::TestISOEra() { | |
| 3873 | |
| 3874 const char* data[] = { | |
| 3875 // input, output | |
| 3876 "BC 4004-10-23T07:00:00Z", "BC 4004-10-23T07:00:00Z", | |
| 3877 "AD 4004-10-23T07:00:00Z", "AD 4004-10-23T07:00:00Z", | |
| 3878 "-4004-10-23T07:00:00Z" , "BC 4005-10-23T07:00:00Z", | |
| 3879 "4004-10-23T07:00:00Z" , "AD 4004-10-23T07:00:00Z", | |
| 3880 }; | |
| 3881 | |
| 3882 int32_t numData = 8; | |
| 3883 | |
| 3884 UErrorCode status = U_ZERO_ERROR; | |
| 3885 | |
| 3886 // create formatter | |
| 3887 SimpleDateFormat *fmt1 = new SimpleDateFormat(UnicodeString("GGG yyyy-MM-dd'
T'HH:mm:ss'Z"), status); | |
| 3888 failure(status, "new SimpleDateFormat", TRUE); | |
| 3889 if (status == U_MISSING_RESOURCE_ERROR) { | |
| 3890 if (fmt1 != NULL) { | |
| 3891 delete fmt1; | |
| 3892 } | |
| 3893 return; | |
| 3894 } | |
| 3895 for(int i=0; i < numData; i+=2) { | |
| 3896 // create input string | |
| 3897 UnicodeString in = data[i]; | |
| 3898 | |
| 3899 // parse string to date | |
| 3900 UDate dt1 = fmt1->parse(in, status); | |
| 3901 failure(status, "fmt->parse", TRUE); | |
| 3902 | |
| 3903 // format date back to string | |
| 3904 UnicodeString out; | |
| 3905 out = fmt1->format(dt1, out); | |
| 3906 logln(out); | |
| 3907 | |
| 3908 // check that roundtrip worked as expected | |
| 3909 UnicodeString expected = data[i+1]; | |
| 3910 if (out != expected) { | |
| 3911 dataerrln((UnicodeString)"FAIL: " + in + " -> " + out + " expected -
> " + expected); | |
| 3912 } | |
| 3913 } | |
| 3914 | |
| 3915 delete fmt1; | |
| 3916 } | |
| 3917 void DateFormatTest::TestFormalChineseDate() { | |
| 3918 | |
| 3919 UErrorCode status = U_ZERO_ERROR; | |
| 3920 UnicodeString pattern ("y\\u5e74M\\u6708d\\u65e5", -1, US_INV ); | |
| 3921 pattern = pattern.unescape(); | |
| 3922 UnicodeString override ("y=hanidec;M=hans;d=hans", -1, US_INV ); | |
| 3923 | |
| 3924 // create formatter | |
| 3925 SimpleDateFormat *sdf = new SimpleDateFormat(pattern,override,Locale::getChi
na(),status); | |
| 3926 if (failure(status, "new SimpleDateFormat with override", TRUE)) { | |
| 3927 return; | |
| 3928 } | |
| 3929 | |
| 3930 UDate thedate = date(2009-1900, UCAL_JULY, 28); | |
| 3931 FieldPosition pos(0); | |
| 3932 UnicodeString result; | |
| 3933 sdf->format(thedate,result,pos); | |
| 3934 | |
| 3935 UnicodeString expected = "\\u4e8c\\u3007\\u3007\\u4e5d\\u5e74\\u4e03\\u6708\
\u4e8c\\u5341\\u516b\\u65e5"; | |
| 3936 expected = expected.unescape(); | |
| 3937 if (result != expected) { | |
| 3938 dataerrln((UnicodeString)"FAIL: -> " + result + " expected -> " + expect
ed); | |
| 3939 } | |
| 3940 | |
| 3941 UDate parsedate = sdf->parse(expected,status); | |
| 3942 if ( parsedate != thedate ) { | |
| 3943 UnicodeString pat1 ("yyyy-MM-dd'T'HH:mm:ss'Z'", -1, US_INV ); | |
| 3944 SimpleDateFormat *usf = new SimpleDateFormat(pat1,Locale::getEnglish(),s
tatus); | |
| 3945 UnicodeString parsedres,expres; | |
| 3946 usf->format(parsedate,parsedres,pos); | |
| 3947 usf->format(thedate,expres,pos); | |
| 3948 dataerrln((UnicodeString)"FAIL: parsed -> " + parsedres + " expected ->
" + expres); | |
| 3949 delete usf; | |
| 3950 } | |
| 3951 delete sdf; | |
| 3952 } | |
| 3953 | |
| 3954 // Test case for #8675 | |
| 3955 // Incorrect parse offset with stand alone GMT string on 2nd or later iteration. | |
| 3956 void DateFormatTest::TestStandAloneGMTParse() { | |
| 3957 UErrorCode status = U_ZERO_ERROR; | |
| 3958 SimpleDateFormat *sdf = new SimpleDateFormat("ZZZZ", Locale(""), status); | |
| 3959 | |
| 3960 if (U_SUCCESS(status)) { | |
| 3961 | |
| 3962 UnicodeString inText("GMT$$$"); | |
| 3963 for (int32_t i = 0; i < 10; i++) { | |
| 3964 ParsePosition pos(0); | |
| 3965 sdf->parse(inText, pos); | |
| 3966 if (pos.getIndex() != 3) { | |
| 3967 errln((UnicodeString)"FAIL: Incorrect output parse position: act
ual=" + pos.getIndex() + " expected=3"); | |
| 3968 } | |
| 3969 } | |
| 3970 | |
| 3971 delete sdf; | |
| 3972 } else { | |
| 3973 dataerrln("Unable to create SimpleDateFormat - %s", u_errorName(status))
; | |
| 3974 } | |
| 3975 } | |
| 3976 | |
| 3977 void DateFormatTest::TestParsePosition() { | |
| 3978 const char* TestData[][4] = { | |
| 3979 // {<pattern>, <lead>, <date string>, <trail>} | |
| 3980 {"yyyy-MM-dd HH:mm:ssZ", "", "2010-01-10 12:30:00+0500", ""}, | |
| 3981 {"yyyy-MM-dd HH:mm:ss ZZZZ", "", "2010-01-10 12:30:00 GMT+05:00", ""}, | |
| 3982 {"Z HH:mm:ss", "", "-0100 13:20:30", ""}, | |
| 3983 {"y-M-d Z", "", "2011-8-25 -0400", " Foo"}, | |
| 3984 {"y/M/d H:mm:ss z", "", "2011/7/1 12:34:00 PDT", ""}, | |
| 3985 {"y/M/d H:mm:ss z", "+123", "2011/7/1 12:34:00 PDT", " PST"}, | |
| 3986 {"vvvv a h:mm:ss", "", "Pacific Time AM 10:21:45", ""}, | |
| 3987 {"HH:mm v M/d", "111", "14:15 PT 8/10", " 12345"}, | |
| 3988 {"'time zone:' VVVV 'date:' yyyy-MM-dd", "xxxx", "time zone: Los Angeles
Time date: 2010-02-25", "xxxx"}, | |
| 3989 {"yG", "", "2012AD", ""}, | |
| 3990 {"yG", "", "2012", "x"}, | |
| 3991 {0, 0, 0, 0}, | |
| 3992 }; | |
| 3993 | |
| 3994 for (int32_t i = 0; TestData[i][0]; i++) { | |
| 3995 UErrorCode status = U_ZERO_ERROR; | |
| 3996 SimpleDateFormat *sdf = new SimpleDateFormat(UnicodeString(TestData[i][0
]), status); | |
| 3997 if (failure(status, "new SimpleDateFormat", TRUE)) return; | |
| 3998 | |
| 3999 int32_t startPos, resPos; | |
| 4000 | |
| 4001 // lead text | |
| 4002 UnicodeString input(TestData[i][1]); | |
| 4003 startPos = input.length(); | |
| 4004 | |
| 4005 // date string | |
| 4006 input += TestData[i][2]; | |
| 4007 resPos = input.length(); | |
| 4008 | |
| 4009 // trail text | |
| 4010 input += TestData[i][3]; | |
| 4011 | |
| 4012 ParsePosition pos(startPos); | |
| 4013 //UDate d = sdf->parse(input, pos); | |
| 4014 (void)sdf->parse(input, pos); | |
| 4015 | |
| 4016 if (pos.getIndex() != resPos) { | |
| 4017 errln(UnicodeString("FAIL: Parsing [") + input + "] with pattern ["
+ TestData[i][0] + "] returns position - " | |
| 4018 + pos.getIndex() + ", expected - " + resPos); | |
| 4019 } | |
| 4020 | |
| 4021 delete sdf; | |
| 4022 } | |
| 4023 } | |
| 4024 | |
| 4025 | |
| 4026 typedef struct { | |
| 4027 int32_t era; | |
| 4028 int32_t year; | |
| 4029 int32_t month; // 1-based | |
| 4030 int32_t isLeapMonth; | |
| 4031 int32_t day; | |
| 4032 } ChineseCalTestDate; | |
| 4033 | |
| 4034 #define NUM_TEST_DATES 3 | |
| 4035 | |
| 4036 typedef struct { | |
| 4037 const char * locale; | |
| 4038 int32_t style; // <0 => custom | |
| 4039 UnicodeString dateString[NUM_TEST_DATES]; | |
| 4040 } MonthPatternItem; | |
| 4041 | |
| 4042 void DateFormatTest::TestMonthPatterns() | |
| 4043 { | |
| 4044 const ChineseCalTestDate dates[NUM_TEST_DATES] = { | |
| 4045 // era yr mo lp da | |
| 4046 { 78, 29, 4, 0, 2 }, // (in chinese era 78) gregorian 2012-4-22 | |
| 4047 { 78, 29, 4, 1, 2 }, // (in chinese era 78) gregorian 2012-5-22 | |
| 4048 { 78, 29, 5, 0, 2 }, // (in chinese era 78) gregorian 2012-6-20 | |
| 4049 }; | |
| 4050 | |
| 4051 const MonthPatternItem items[] = { | |
| 4052 // locale date style; expected formats for
the 3 dates above | |
| 4053 { "root@calendar=chinese", DateFormat::kLong, { UnicodeString("2012(
ren-chen) M04 2"), UnicodeString("2012(ren-chen) M04bis 2"), UnicodeString("20
12(ren-chen) M05 2") } }, | |
| 4054 { "root@calendar=chinese", DateFormat::kShort, { UnicodeString("2012-
04-02"), UnicodeString("2012-04bis-02"), UnicodeString("2012-05-02")
} }, | |
| 4055 { "root@calendar=chinese", -1, { UnicodeString("29-4-
2"), UnicodeString("29-4bis-2"), UnicodeString("29-5-2") } }, | |
| 4056 { "root@calendar=chinese", -2, { UnicodeString("78x29
-4-2"), UnicodeString("78x29-4bis-2"), UnicodeString("78x29-5-2") }
}, | |
| 4057 { "root@calendar=chinese", -3, { UnicodeString("ren-c
hen-4-2"), UnicodeString("ren-chen-4bis-2"), UnicodeString("ren-chen-5-2"
) } }, | |
| 4058 { "root@calendar=chinese", -4, { UnicodeString("ren-c
hen M04 2"), UnicodeString("ren-chen M04bis 2"), UnicodeString("ren-chen M05
2") } }, | |
| 4059 { "en@calendar=gregorian", -3, { UnicodeString("2012-
4-22"), UnicodeString("2012-5-22"), UnicodeString("2012-6-20") }
}, | |
| 4060 { "en@calendar=chinese", DateFormat::kLong, { UnicodeString("Month
4 2, 2012(ren-chen)"), UnicodeString("Month4bis 2, 2012(ren-chen)"), UnicodeStri
ng("Month5 2, 2012(ren-chen)") } }, | |
| 4061 { "en@calendar=chinese", DateFormat::kShort, { UnicodeString("4/2/2
012"), UnicodeString("4bis/2/2012"), UnicodeString("5/2/2012") }
}, | |
| 4062 { "zh@calendar=chinese", DateFormat::kLong, { CharsToUnicodeString
("2012\\u58EC\\u8FB0\\u5E74\\u56DB\\u6708\\u521D\\u4E8C"), | |
| 4063 CharsToUnicodeString
("2012\\u58EC\\u8FB0\\u5E74\\u95F0\\u56DB\\u6708\\u521D\\u4E8C"), | |
| 4064 CharsToUnicodeString
("2012\\u58EC\\u8FB0\\u5E74\\u4E94\\u6708\\u521D\\u4E8C") } }, | |
| 4065 { "zh@calendar=chinese", DateFormat::kShort, { CharsToUnicodeString
("2012-4-2"), | |
| 4066 CharsToUnicodeString
("2012-\\u95F04-2"), | |
| 4067 CharsToUnicodeString
("2012-5-2") } }, | |
| 4068 { "zh@calendar=chinese", -3, { CharsToUnicodeString
("\\u58EC\\u8FB0-4-2"), | |
| 4069 CharsToUnicodeString
("\\u58EC\\u8FB0-\\u95F04-2"), | |
| 4070 CharsToUnicodeString
("\\u58EC\\u8FB0-5-2") } }, | |
| 4071 { "zh@calendar=chinese", -4, { CharsToUnicodeString
("\\u58EC\\u8FB0 \\u56DB\\u6708 2"), | |
| 4072 CharsToUnicodeString
("\\u58EC\\u8FB0 \\u95F0\\u56DB\\u6708 2"), | |
| 4073 CharsToUnicodeString
("\\u58EC\\u8FB0 \\u4E94\\u6708 2") } }, | |
| 4074 { "zh_Hant@calendar=chinese", DateFormat::kLong, { CharsToUnicodeString
("2012\\u58EC\\u8FB0\\u5E74\\u56DB\\u6708\\u521D\\u4E8C"), | |
| 4075 CharsToUnicodeString
("2012\\u58EC\\u8FB0\\u5E74\\u958F\\u56DB\\u6708\\u521D\\u4E8C"), | |
| 4076 CharsToUnicodeString
("2012\\u58EC\\u8FB0\\u5E74\\u4E94\\u6708\\u521D\\u4E8C") } }, | |
| 4077 { "zh_Hant@calendar=chinese", DateFormat::kShort, { CharsToUnicodeString
("2012/4/2"), | |
| 4078 CharsToUnicodeString
("2012/\\u958F4/2"), | |
| 4079 CharsToUnicodeString
("2012/5/2") } }, | |
| 4080 { "fr@calendar=chinese", DateFormat::kLong, { CharsToUnicodeString
("2 s\\u00ECyu\\u00E8 ren-chen"), | |
| 4081 CharsToUnicodeString
("2 s\\u00ECyu\\u00E8bis ren-chen"), | |
| 4082 CharsToUnicodeString
("2 w\\u01D4yu\\u00E8 ren-chen") } }, | |
| 4083 { "fr@calendar=chinese", DateFormat::kShort, { UnicodeString("2/4/2
9"), UnicodeString("2/4bis/29"), UnicodeString("2/5/29") } }, | |
| 4084 { "en@calendar=dangi", DateFormat::kLong, { UnicodeString("Month
3bis 2, 2012(29)"), UnicodeString("Month4 2, 2012(29)"), UnicodeString("M
onth5 1, 2012(29)") } }, | |
| 4085 { "en@calendar=dangi", DateFormat::kShort, { UnicodeString("3bis/
2/2012"), UnicodeString("4/2/2012"), UnicodeString("5/1/2012") }
}, | |
| 4086 { "en@calendar=dangi", -2, { UnicodeString("78x29
-3bis-2"), UnicodeString("78x29-4-2"), UnicodeString("78x29-5-1") }
}, | |
| 4087 { "ko@calendar=dangi", DateFormat::kLong, { CharsToUnicodeString
("\\uC784\\uC9C4\\uB144 \\uC7243\\uC6D4 2\\uC77C"), | |
| 4088 CharsToUnicodeString
("\\uC784\\uC9C4\\uB144 4\\uC6D4 2\\uC77C"), | |
| 4089 CharsToUnicodeString
("\\uC784\\uC9C4\\uB144 5\\uC6D4 1\\uC77C") } }, | |
| 4090 { "ko@calendar=dangi", DateFormat::kShort, { CharsToUnicodeString
("29. \\uC7243. 2."), | |
| 4091 CharsToUnicodeString
("29. 4. 2."), | |
| 4092 CharsToUnicodeString
("29. 5. 1.") } }, | |
| 4093 // terminator | |
| 4094 { NULL, 0, { UnicodeString(""), U
nicodeString(""), UnicodeString("") } } | |
| 4095 }; | |
| 4096 | |
| 4097 //. style: -1 -2 -3 -4 | |
| 4098 const UnicodeString customPatterns[] = { "y-Ml-d", "G'x'y-Ml-d", "U-M-d", "U
MMM d" }; // like old root pattern, using 'l' | |
| 4099 | |
| 4100 UErrorCode status = U_ZERO_ERROR; | |
| 4101 Locale rootChineseCalLocale = Locale::createFromName("root@calendar=chinese"
); | |
| 4102 Calendar * rootChineseCalendar = Calendar::createInstance(rootChineseCalLoca
le, status); | |
| 4103 if (U_SUCCESS(status)) { | |
| 4104 const MonthPatternItem * itemPtr; | |
| 4105 for (itemPtr = items; itemPtr->locale != NULL; itemPtr++ ) { | |
| 4106 Locale locale = Locale::createFromName(itemPtr->locale); | |
| 4107 DateFormat * dmft = (itemPtr->style >= 0)? | |
| 4108 DateFormat::createDateInstance((DateFormat::EStyle)itemPtr->
style, locale): | |
| 4109 new SimpleDateFormat(customPatterns[-itemPtr->style - 1], lo
cale, status); | |
| 4110 if ( dmft != NULL ) { | |
| 4111 if (U_SUCCESS(status)) { | |
| 4112 const ChineseCalTestDate * datePtr = dates; | |
| 4113 int32_t idate; | |
| 4114 for (idate = 0; idate < NUM_TEST_DATES; idate++, datePtr++)
{ | |
| 4115 rootChineseCalendar->clear(); | |
| 4116 rootChineseCalendar->set(UCAL_ERA, datePtr->era); | |
| 4117 rootChineseCalendar->set(datePtr->year, datePtr->month-1
, datePtr->day); | |
| 4118 rootChineseCalendar->set(UCAL_IS_LEAP_MONTH, datePtr->is
LeapMonth); | |
| 4119 UnicodeString result; | |
| 4120 FieldPosition fpos(0); | |
| 4121 dmft->format(*rootChineseCalendar, result, fpos); | |
| 4122 if ( result.compare(itemPtr->dateString[idate]) != 0 ) { | |
| 4123 errln( UnicodeString("FAIL: Chinese calendar format
for locale ") + UnicodeString(itemPtr->locale) + ", style " + itemPtr->style + | |
| 4124 ", expected \"" + itemPtr->dateString[idate]
+ "\", got \"" + result + "\""); | |
| 4125 } else { | |
| 4126 // formatted OK, try parse | |
| 4127 ParsePosition ppos(0); | |
| 4128 // ensure we are really parsing the fields we should
be | |
| 4129 rootChineseCalendar->set(UCAL_YEAR, 1); | |
| 4130 rootChineseCalendar->set(UCAL_MONTH, 0); | |
| 4131 rootChineseCalendar->set(UCAL_IS_LEAP_MONTH, 0); | |
| 4132 rootChineseCalendar->set(UCAL_DATE, 1); | |
| 4133 // | |
| 4134 dmft->parse(result, *rootChineseCalendar, ppos); | |
| 4135 int32_t year = rootChineseCalendar->get(UCAL_YEAR, s
tatus); | |
| 4136 int32_t month = rootChineseCalendar->get(UCAL_MONTH,
status) + 1; | |
| 4137 int32_t isLeapMonth = rootChineseCalendar->get(UCAL_
IS_LEAP_MONTH, status); | |
| 4138 int32_t day = rootChineseCalendar->get(UCAL_DATE, st
atus); | |
| 4139 if ( ppos.getIndex() < result.length() || year != da
tePtr->year || month != datePtr->month || isLeapMonth != datePtr->isLeapMonth ||
day != datePtr->day ) { | |
| 4140 errln( UnicodeString("FAIL: Chinese calendar par
se for locale ") + UnicodeString(itemPtr->locale) + ", style " + itemPtr->style
+ | |
| 4141 ", string \"" + result + "\", expected " + d
atePtr->year +"-"+datePtr->month+"("+datePtr->isLeapMonth+")-"+datePtr->day + ",
got pos " + | |
| 4142 ppos.getIndex() + " " + year +"-"+month+"("+
isLeapMonth+")-"+day); | |
| 4143 } | |
| 4144 } | |
| 4145 } | |
| 4146 } else { | |
| 4147 dataerrln("Error creating SimpleDateFormat for Chinese calen
dar- %s", u_errorName(status)); | |
| 4148 } | |
| 4149 delete dmft; | |
| 4150 } else { | |
| 4151 dataerrln("FAIL: Unable to create DateFormat for Chinese calenda
r- %s", u_errorName(status)); | |
| 4152 } | |
| 4153 } | |
| 4154 delete rootChineseCalendar; | |
| 4155 } else { | |
| 4156 errln(UnicodeString("FAIL: Unable to create Calendar for root@calendar=c
hinese")); | |
| 4157 } | |
| 4158 } | |
| 4159 | |
| 4160 typedef struct { | |
| 4161 const char * locale; | |
| 4162 UnicodeString pattern; | |
| 4163 UDisplayContext capitalizationContext; | |
| 4164 UnicodeString expectedFormat; | |
| 4165 } TestContextItem; | |
| 4166 | |
| 4167 void DateFormatTest::TestContext() | |
| 4168 { | |
| 4169 const UDate july022008 = 1215000001979.0; | |
| 4170 const TestContextItem items[] = { | |
| 4171 //locale pattern capitalizationContext
expected formatted date | |
| 4172 { "fr", UnicodeString("MMMM y"), UDISPCTX_CAPITALIZATION_NONE,
UnicodeString("juillet 2008") }, | |
| 4173 #if !UCONFIG_NO_BREAK_ITERATION | |
| 4174 { "fr", UnicodeString("MMMM y"), UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_S
ENTENCE, UnicodeString("juillet 2008") }, | |
| 4175 { "fr", UnicodeString("MMMM y"), UDISPCTX_CAPITALIZATION_FOR_BEGINNING_O
F_SENTENCE, UnicodeString("Juillet 2008") }, | |
| 4176 { "fr", UnicodeString("MMMM y"), UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_
MENU, UnicodeString("juillet 2008") }, | |
| 4177 { "fr", UnicodeString("MMMM y"), UDISPCTX_CAPITALIZATION_FOR_STANDALONE,
UnicodeString("Juillet 2008") }, | |
| 4178 #endif | |
| 4179 { "cs", UnicodeString("LLLL y"), UDISPCTX_CAPITALIZATION_NONE,
CharsToUnicodeString("\\u010Dervenec 2008") }, | |
| 4180 #if !UCONFIG_NO_BREAK_ITERATION | |
| 4181 { "cs", UnicodeString("LLLL y"), UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_S
ENTENCE, CharsToUnicodeString("\\u010Dervenec 2008") }, | |
| 4182 { "cs", UnicodeString("LLLL y"), UDISPCTX_CAPITALIZATION_FOR_BEGINNING_O
F_SENTENCE, CharsToUnicodeString("\\u010Cervenec 2008") }, | |
| 4183 { "cs", UnicodeString("LLLL y"), UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_
MENU, CharsToUnicodeString("\\u010Cervenec 2008") }, | |
| 4184 { "cs", UnicodeString("LLLL y"), UDISPCTX_CAPITALIZATION_FOR_STANDALONE,
CharsToUnicodeString("\\u010Dervenec 2008") }, | |
| 4185 #endif | |
| 4186 // terminator | |
| 4187 { NULL, UnicodeString(""), (UDisplayContext)0, UnicodeString("") } | |
| 4188 }; | |
| 4189 UErrorCode status = U_ZERO_ERROR; | |
| 4190 Calendar* cal = Calendar::createInstance(status); | |
| 4191 if (U_FAILURE(status)) { | |
| 4192 dataerrln(UnicodeString("FAIL: Unable to create Calendar for default tim
ezone and locale.")); | |
| 4193 } else { | |
| 4194 cal->setTime(july022008, status); | |
| 4195 const TestContextItem * itemPtr; | |
| 4196 for (itemPtr = items; itemPtr->locale != NULL; itemPtr++ ) { | |
| 4197 Locale locale = Locale::createFromName(itemPtr->locale); | |
| 4198 status = U_ZERO_ERROR; | |
| 4199 SimpleDateFormat * sdmft = new SimpleDateFormat(itemPtr->pattern, loc
ale, status); | |
| 4200 if (U_FAILURE(status)) { | |
| 4201 dataerrln(UnicodeString("FAIL: Unable to create SimpleDateFormat
for specified pattern with locale ") + UnicodeString(itemPtr->locale)); | |
| 4202 } else { | |
| 4203 sdmft->setContext(itemPtr->capitalizationContext, status); | |
| 4204 UnicodeString result; | |
| 4205 FieldPosition pos(0); | |
| 4206 sdmft->format(*cal, result, pos); | |
| 4207 if (result.compare(itemPtr->expectedFormat) != 0) { | |
| 4208 errln(UnicodeString("FAIL: format for locale ") + UnicodeStri
ng(itemPtr->locale) + | |
| 4209 ", status " + (int)status + | |
| 4210 ", capitalizationContext " + (int)itemPtr->capitaliza
tionContext + | |
| 4211 ", expected " + itemPtr->expectedFormat + ", got " +
result); | |
| 4212 } | |
| 4213 } | |
| 4214 if (sdmft) { | |
| 4215 delete sdmft; | |
| 4216 } | |
| 4217 } | |
| 4218 } | |
| 4219 if (cal) { | |
| 4220 delete cal; | |
| 4221 } | |
| 4222 } | |
| 4223 | |
| 4224 // test item for a particular locale + calendar and date format | |
| 4225 typedef struct { | |
| 4226 int32_t era; | |
| 4227 int32_t year; | |
| 4228 int32_t month; | |
| 4229 int32_t day; | |
| 4230 int32_t hour; | |
| 4231 int32_t minute; | |
| 4232 UnicodeString formattedDate; | |
| 4233 } CalAndFmtTestItem; | |
| 4234 | |
| 4235 // test item giving locale + calendar, date format, and CalAndFmtTestItems | |
| 4236 typedef struct { | |
| 4237 const char * locale; // with calendar | |
| 4238 DateFormat::EStyle style; | |
| 4239 UnicodeString pattern; // ignored unless style == DateFormat::kNone | |
| 4240 const CalAndFmtTestItem *caftItems; | |
| 4241 } TestNonGregoItem; | |
| 4242 | |
| 4243 void DateFormatTest::TestNonGregoFmtParse() | |
| 4244 { | |
| 4245 // test items for he@calendar=hebrew, long date format | |
| 4246 const CalAndFmtTestItem cafti_he_hebrew_long[] = { | |
| 4247 { 0, 4999, 12, 29, 12, 0, CharsToUnicodeString("\\u05DB\\u05F4\\u05D8 \
\u05D1\\u05D0\\u05DC\\u05D5\\u05DC \\u05D3\\u05F3\\u05EA\\u05EA\\u05E7\\u05E6\\u
05F4\\u05D8") }, | |
| 4248 { 0, 5100, 0, 1, 12, 0, CharsToUnicodeString("\\u05D0\\u05F3 \\u05D1\
\u05EA\\u05E9\\u05E8\\u05D9 \\u05E7\\u05F3") }, | |
| 4249 { 0, 5774, 5, 1, 12, 0, CharsToUnicodeString("\\u05D0\\u05F3 \\u05D1\
\u05D0\\u05D3\\u05E8 \\u05D0\\u05F3 \\u05EA\\u05E9\\u05E2\\u05F4\\u05D3") }, | |
| 4250 { 0, 5999, 12, 29, 12, 0, CharsToUnicodeString("\\u05DB\\u05F4\\u05D8 \
\u05D1\\u05D0\\u05DC\\u05D5\\u05DC \\u05EA\\u05EA\\u05E7\\u05E6\\u05F4\\u05D8")
}, | |
| 4251 { 0, 6100, 0, 1, 12, 0, CharsToUnicodeString("\\u05D0\\u05F3 \\u05D1\
\u05EA\\u05E9\\u05E8\\u05D9 \\u05D5\\u05F3\\u05E7\\u05F3") }, | |
| 4252 { 0, 0, 0, 0, 0, 0, UnicodeString("") } // terminator | |
| 4253 }; | |
| 4254 const CalAndFmtTestItem cafti_zh_chinese_custU[] = { | |
| 4255 { 78, 31, 0, 1, 12, 0, CharsToUnicodeString("2014\\u7532\\u5348\\u5E
74\\u6B63\\u67081") }, | |
| 4256 { 77, 31, 0, 1, 12, 0, CharsToUnicodeString("1954\\u7532\\u5348\\u5E
74\\u6B63\\u67081") }, | |
| 4257 { 0, 0, 0, 0, 0, 0, UnicodeString("") } // terminator | |
| 4258 }; | |
| 4259 const CalAndFmtTestItem cafti_zh_chinese_custNoU[] = { | |
| 4260 { 78, 31, 0, 1, 12, 0, CharsToUnicodeString("2014\\u5E74\\u6B63\\u67
081") }, | |
| 4261 { 77, 31, 0, 1, 12, 0, CharsToUnicodeString("1954\\u5E74\\u6B63\\u67
081") }, | |
| 4262 { 0, 0, 0, 0, 0, 0, UnicodeString("") } // terminator | |
| 4263 }; | |
| 4264 const CalAndFmtTestItem cafti_ja_japanese_custGy[] = { | |
| 4265 {235, 26, 2, 5, 12, 0, CharsToUnicodeString("2014(\\u5E73\\u621026)\
\u5E743\\u67085\\u65E5") }, | |
| 4266 {234, 60, 2, 5, 12, 0, CharsToUnicodeString("1985(\\u662D\\u548C60)\
\u5E743\\u67085\\u65E5") }, | |
| 4267 { 0, 0, 0, 0, 0, 0, UnicodeString("") } // terminator | |
| 4268 }; | |
| 4269 const CalAndFmtTestItem cafti_ja_japanese_custNoGy[] = { | |
| 4270 {235, 26, 2, 5, 12, 0, CharsToUnicodeString("2014\\u5E743\\u67085\\u
65E5") }, | |
| 4271 {234, 60, 2, 5, 12, 0, CharsToUnicodeString("1985\\u5E743\\u67085\\u
65E5") }, | |
| 4272 { 0, 0, 0, 0, 0, 0, UnicodeString("") } // terminator | |
| 4273 }; | |
| 4274 const CalAndFmtTestItem cafti_en_islamic_cust[] = { | |
| 4275 { 0, 1384, 0, 1, 12, 0, UnicodeString("1 Muh. 1384 AH, 1964") }, | |
| 4276 { 0, 1436, 0, 1, 12, 0, UnicodeString("1 Muh. 1436 AH, 2014") }, | |
| 4277 { 0, 1487, 0, 1, 12, 0, UnicodeString("1 Muh. 1487 AH, 2064") }, | |
| 4278 { 0, 0, 0, 0, 0, 0, UnicodeString("") } // terminator | |
| 4279 }; | |
| 4280 // overal test items | |
| 4281 const TestNonGregoItem items[] = { | |
| 4282 { "he@calendar=hebrew", DateFormat::kLong, UnicodeString(""),
cafti_he_hebrew_long }, | |
| 4283 { "zh@calendar=chinese", DateFormat::kNone, CharsToUnicodeString("rU\\u
5E74MMMd"), cafti_zh_chinese_custU }, | |
| 4284 { "zh@calendar=chinese", DateFormat::kNone, CharsToUnicodeString("r\\u5
E74MMMd"), cafti_zh_chinese_custNoU }, | |
| 4285 { "ja@calendar=japanese", DateFormat::kNone, CharsToUnicodeString("r(Gy)
\\u5E74M\\u6708d\\u65E5"), cafti_ja_japanese_custGy }, | |
| 4286 { "ja@calendar=japanese", DateFormat::kNone, CharsToUnicodeString("r\\u5
E74M\\u6708d\\u65E5"), cafti_ja_japanese_custNoGy }, | |
| 4287 { "en@calendar=islamic", DateFormat::kNone, UnicodeString("d MMM y G, r
"), cafti_en_islamic_cust }, | |
| 4288 { NULL, DateFormat::kNone, UnicodeString(""), NULL } // terminator | |
| 4289 }; | |
| 4290 const TestNonGregoItem * itemPtr; | |
| 4291 for (itemPtr = items; itemPtr->locale != NULL; itemPtr++) { | |
| 4292 Locale locale = Locale::createFromName(itemPtr->locale); | |
| 4293 DateFormat * dfmt = NULL; | |
| 4294 UErrorCode status = U_ZERO_ERROR; | |
| 4295 if (itemPtr->style != DateFormat::kNone) { | |
| 4296 dfmt = DateFormat::createDateInstance(itemPtr->style, locale); | |
| 4297 } else { | |
| 4298 dfmt = new SimpleDateFormat(itemPtr->pattern, locale, status); | |
| 4299 } | |
| 4300 if (U_FAILURE(status)) { | |
| 4301 dataerrln("new SimpleDateFormat fails for locale %s", itemPtr->local
e); | |
| 4302 } else if (dfmt == NULL) { | |
| 4303 dataerrln("DateFormat::createDateInstance fails for locale %s", item
Ptr->locale); | |
| 4304 } else { | |
| 4305 Calendar * cal = (dfmt->getCalendar())->clone(); | |
| 4306 if (cal == NULL) { | |
| 4307 dataerrln("(DateFormat::getCalendar)->clone() fails for locale %
s", itemPtr->locale); | |
| 4308 } else { | |
| 4309 const CalAndFmtTestItem * caftItemPtr; | |
| 4310 for (caftItemPtr = itemPtr->caftItems; caftItemPtr->year != 0; c
aftItemPtr++) { | |
| 4311 cal->clear(); | |
| 4312 cal->set(UCAL_ERA, caftItemPtr->era); | |
| 4313 cal->set(UCAL_YEAR, caftItemPtr->year); | |
| 4314 cal->set(UCAL_MONTH, caftItemPtr->month); | |
| 4315 cal->set(UCAL_DATE, caftItemPtr->day); | |
| 4316 cal->set(UCAL_HOUR_OF_DAY, caftItemPtr->hour); | |
| 4317 cal->set(UCAL_MINUTE, caftItemPtr->minute); | |
| 4318 UnicodeString result; | |
| 4319 FieldPosition fpos(0); | |
| 4320 dfmt->format(*cal, result, fpos); | |
| 4321 if ( result.compare(caftItemPtr->formattedDate) != 0 ) { | |
| 4322 errln( UnicodeString("FAIL: date format for locale ") +
UnicodeString(itemPtr->locale) + ", style " + itemPtr->style + | |
| 4323 ", expected \"" + caftItemPtr->formattedDate + "
\", got \"" + result + "\""); | |
| 4324 } else { | |
| 4325 // formatted OK, try parse | |
| 4326 ParsePosition ppos(0); | |
| 4327 dfmt->parse(result, *cal, ppos); | |
| 4328 status = U_ZERO_ERROR; | |
| 4329 int32_t era = cal->get(UCAL_ERA, status); | |
| 4330 int32_t year = cal->get(UCAL_YEAR, status); | |
| 4331 int32_t month = cal->get(UCAL_MONTH, status); | |
| 4332 int32_t day = cal->get(UCAL_DATE, status); | |
| 4333 if ( U_FAILURE(status) || ppos.getIndex() < result.lengt
h() || era != caftItemPtr->era || | |
| 4334 year != caftItemPtr->year || month != caftItemPt
r->month || day != caftItemPtr->day ) { | |
| 4335 errln( UnicodeString("FAIL: date parse for locale ")
+ UnicodeString(itemPtr->locale) + | |
| 4336 ", style " + itemPtr->style + ", string \"" + re
sult + "\", expected " + | |
| 4337 caftItemPtr->era +":"+caftItemPtr->year +"-"+caf
tItemPtr->month+"-"+caftItemPtr->day + ", got pos " + | |
| 4338 ppos.getIndex() + " " + year +"-"+month+"-"+day
+ " status " + UnicodeString(u_errorName(status)) ); | |
| 4339 } | |
| 4340 } | |
| 4341 } | |
| 4342 delete cal; | |
| 4343 } | |
| 4344 delete dfmt; | |
| 4345 } | |
| 4346 } | |
| 4347 } | |
| 4348 | |
| 4349 static const UDate TEST_DATE = 1326585600000.; // 2012-jan-15 | |
| 4350 | |
| 4351 void DateFormatTest::TestDotAndAtLeniency() { | |
| 4352 // Test for date/time parsing regression with CLDR 22.1/ICU 50 pattern strin
gs. | |
| 4353 // For details see http://bugs.icu-project.org/trac/ticket/9789 | |
| 4354 static const char *locales[] = { "en", "fr" }; | |
| 4355 for (int32_t i = 0; i < UPRV_LENGTHOF(locales); ++i) { | |
| 4356 Locale locale(locales[i]); | |
| 4357 | |
| 4358 for (DateFormat::EStyle dateStyle = DateFormat::FULL; dateStyle <= DateF
ormat::SHORT; | |
| 4359 dateStyle = static_cast<DateFormat::EStyle>(dateStyle + 1)) { | |
| 4360 LocalPointer<DateFormat> dateFormat(DateFormat::createDateInstance(d
ateStyle, locale)); | |
| 4361 | |
| 4362 for (DateFormat::EStyle timeStyle = DateFormat::FULL; timeStyle <= D
ateFormat::SHORT; | |
| 4363 timeStyle = static_cast<DateFormat::EStyle>(timeStyle + 1)
) { | |
| 4364 LocalPointer<DateFormat> format(DateFormat::createDateTimeInstan
ce(dateStyle, timeStyle, locale)); | |
| 4365 LocalPointer<DateFormat> timeFormat(DateFormat::createTimeInstan
ce(timeStyle, locale)); | |
| 4366 UnicodeString formattedString; | |
| 4367 if (format.isNull()) { | |
| 4368 dataerrln("Unable to create DateFormat"); | |
| 4369 continue; | |
| 4370 } | |
| 4371 format->format(TEST_DATE, formattedString); | |
| 4372 | |
| 4373 if (!showParse(*format, formattedString)) { | |
| 4374 errln(UnicodeString(" with date-time: dateStyle=") + date
Style + " timeStyle=" + timeStyle); | |
| 4375 } | |
| 4376 | |
| 4377 UnicodeString ds, ts; | |
| 4378 formattedString = dateFormat->format(TEST_DATE, ds) + " " + tim
eFormat->format(TEST_DATE, ts); | |
| 4379 if (!showParse(*format, formattedString)) { | |
| 4380 errln(UnicodeString(" with date sp sp time: dateStyle=")
+ dateStyle + " timeStyle=" + timeStyle); | |
| 4381 } | |
| 4382 if (formattedString.indexOf("n ") >= 0) { // will add "." after
the end of text ending in 'n', like Jan. | |
| 4383 UnicodeString plusDot(formattedString); | |
| 4384 plusDot.findAndReplace("n ", "n. ").append("."); | |
| 4385 if (!showParse(*format, plusDot)) { | |
| 4386 errln(UnicodeString(" with date plus-dot time: dateSt
yle=") + dateStyle + " timeStyle=" + timeStyle); | |
| 4387 } | |
| 4388 } | |
| 4389 if (formattedString.indexOf(". ") >= 0) { // will subtract "." a
t the end of strings. | |
| 4390 UnicodeString minusDot(formattedString); | |
| 4391 minusDot.findAndReplace(". ", " "); | |
| 4392 if (!showParse(*format, minusDot)) { | |
| 4393 errln(UnicodeString(" with date minus-dot time: dateS
tyle=") + dateStyle + " timeStyle=" + timeStyle); | |
| 4394 } | |
| 4395 } | |
| 4396 } | |
| 4397 } | |
| 4398 } | |
| 4399 } | |
| 4400 | |
| 4401 UBool DateFormatTest::showParse(DateFormat &format, const UnicodeString &formatt
edString) { | |
| 4402 ParsePosition parsePosition; | |
| 4403 UDate parsed = format.parse(formattedString, parsePosition); | |
| 4404 UBool ok = TEST_DATE == parsed && parsePosition.getIndex() == formattedStrin
g.length(); | |
| 4405 UnicodeString pattern; | |
| 4406 static_cast<SimpleDateFormat &>(format).toPattern(pattern); | |
| 4407 if (ok) { | |
| 4408 logln(pattern + " parsed: " + formattedString); | |
| 4409 } else { | |
| 4410 errln(pattern + " fails to parse: " + formattedString); | |
| 4411 } | |
| 4412 return ok; | |
| 4413 } | |
| 4414 | |
| 4415 | |
| 4416 typedef struct { | |
| 4417 const char * locale; | |
| 4418 UBool leniency; | |
| 4419 UnicodeString parseString; | |
| 4420 UnicodeString pattern; | |
| 4421 UnicodeString expectedResult; // empty string indicates expected error | |
| 4422 } TestDateFormatLeniencyItem; | |
| 4423 | |
| 4424 void DateFormatTest::TestDateFormatLeniency() { | |
| 4425 // For details see http://bugs.icu-project.org/trac/ticket/10261 | |
| 4426 | |
| 4427 const UDate july022008 = 1215000001979.0; | |
| 4428 const TestDateFormatLeniencyItem items[] = { | |
| 4429 //locale leniency parse String pattern
expected result | |
| 4430 { "en", true, UnicodeString("2008-07 02"), UnicodeString("y
yyy-LLLL dd"), UnicodeString("2008-July 02") }, | |
| 4431 { "en", false, UnicodeString("2008-07 02"), UnicodeString("y
yyy-LLLL dd"), UnicodeString("") }, | |
| 4432 { "en", true, UnicodeString("2008-Jan 02"), UnicodeString("y
yyy-LLL. dd"), UnicodeString("2008-Jan. 02") }, | |
| 4433 { "en", false, UnicodeString("2008-Jan 02"), UnicodeString("y
yyy-LLL. dd"), UnicodeString("") }, | |
| 4434 { "en", true, UnicodeString("2008-Jan--02"), UnicodeString("y
yyy-MMM' -- 'dd"), UnicodeString("2008-Jan -- 02") }, | |
| 4435 { "en", false, UnicodeString("2008-Jan--02"), UnicodeString("y
yyy-MMM' -- 'dd"), UnicodeString("") }, | |
| 4436 // terminator | |
| 4437 { NULL, true, UnicodeString(""), UnicodeString(""
), UnicodeString("") } | |
| 4438 }; | |
| 4439 UErrorCode status = U_ZERO_ERROR; | |
| 4440 LocalPointer<Calendar> cal(Calendar::createInstance(status)); | |
| 4441 if (U_FAILURE(status)) { | |
| 4442 dataerrln(UnicodeString("FAIL: Unable to create Calendar for default tim
ezone and locale.")); | |
| 4443 return; | |
| 4444 } | |
| 4445 cal->setTime(july022008, status); | |
| 4446 const TestDateFormatLeniencyItem * itemPtr; | |
| 4447 LocalPointer<SimpleDateFormat> sdmft; | |
| 4448 for (itemPtr = items; itemPtr->locale != NULL; itemPtr++ ) { | |
| 4449 | |
| 4450 Locale locale = Locale::createFromName(itemPtr->locale); | |
| 4451 status = U_ZERO_ERROR; | |
| 4452 ParsePosition pos(0); | |
| 4453 sdmft.adoptInsteadAndCheckErrorCode(new SimpleDateFormat(itemPtr->pattern
, locale, status), status); | |
| 4454 if (U_FAILURE(status)) { | |
| 4455 dataerrln("Unable to create SimpleDateFormat - %s", u_errorName(statu
s)); | |
| 4456 continue; | |
| 4457 } | |
| 4458 sdmft->setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, itemPtr->leniency
, status). | |
| 4459 setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, itemPtr->leniency, s
tatus). | |
| 4460 setBooleanAttribute(UDAT_PARSE_PARTIAL_LITERAL_MATCH, itemPtr->len
iency, status); | |
| 4461 UDate d = sdmft->parse(itemPtr->parseString, pos); | |
| 4462 | |
| 4463 if(itemPtr->expectedResult.length() == 0) { | |
| 4464 if(pos.getErrorIndex() != -1) { | |
| 4465 continue; | |
| 4466 } else { | |
| 4467 errln("error: unexpected parse success - " + itemPtr->parseStrin
g + | |
| 4468 " - pattern " + itemPtr->pattern + | |
| 4469 " - error index " + pos.getErrorIndex() + | |
| 4470 " - leniency " + itemPtr->leniency); | |
| 4471 continue; | |
| 4472 } | |
| 4473 } | |
| 4474 if(pos.getErrorIndex() != -1) { | |
| 4475 errln("error: parse error for string - " + itemPtr->parseString + | |
| 4476 " - pattern " + itemPtr->pattern + | |
| 4477 " - idx " + pos.getIndex() + | |
| 4478 " - error index "+pos.getErrorIndex() + | |
| 4479 " - leniency " + itemPtr->leniency); | |
| 4480 continue; | |
| 4481 } | |
| 4482 | |
| 4483 UnicodeString formatResult(""); | |
| 4484 sdmft->format(d, formatResult); | |
| 4485 if(formatResult.compare(itemPtr->expectedResult) != 0) { | |
| 4486 errln("error: unexpected format result. pattern["+itemPtr->pattern+"]
expected[" + itemPtr->expectedResult + "] but result was[" + formatResult + "]
"); | |
| 4487 continue; | |
| 4488 } else { | |
| 4489 logln("formatted results match! - " + formatResult); | |
| 4490 } | |
| 4491 | |
| 4492 } | |
| 4493 } | |
| 4494 | |
| 4495 | |
| 4496 typedef struct { | |
| 4497 UBool leniency; | |
| 4498 UnicodeString parseString; | |
| 4499 UnicodeString pattern; | |
| 4500 UnicodeString expectedResult; // empty string indicates expected error | |
| 4501 } TestMultiPatternMatchItem; | |
| 4502 | |
| 4503 void DateFormatTest::TestParseMultiPatternMatch() { | |
| 4504 // For details see http://bugs.icu-project.org/trac/ticket/10336 | |
| 4505 const TestMultiPatternMatchItem items[] = { | |
| 4506 // leniency parse String pattern
expected result | |
| 4507 {true, UnicodeString("2013-Sep 13"), UnicodeStr
ing("yyyy-MMM dd"), UnicodeString("2013-Sep 13")}, | |
| 4508 {true, UnicodeString("2013-September 14"), UnicodeStr
ing("yyyy-MMM dd"), UnicodeString("2013-Sep 14")}, | |
| 4509 {false, UnicodeString("2013-September 15"), UnicodeStr
ing("yyyy-MMM dd"), UnicodeString("")}, | |
| 4510 {false, UnicodeString("2013-September 16"), UnicodeStr
ing("yyyy-MMMM dd"), UnicodeString("2013-September 16")}, | |
| 4511 {true, UnicodeString("2013-Sep 17"), UnicodeStr
ing("yyyy-LLL dd"), UnicodeString("2013-Sep 17")}, | |
| 4512 {true, UnicodeString("2013-September 18"), UnicodeStr
ing("yyyy-LLL dd"), UnicodeString("2013-Sep 18")}, | |
| 4513 {false, UnicodeString("2013-September 19"), UnicodeStr
ing("yyyy-LLL dd"), UnicodeString("")}, | |
| 4514 {false, UnicodeString("2013-September 20"), UnicodeStr
ing("yyyy-LLLL dd"), UnicodeString("2013-September 20")}, | |
| 4515 {true, UnicodeString("2013 Sat Sep 21"), UnicodeStr
ing("yyyy EEE MMM dd"), UnicodeString("2013 Sat Sep 21")}, | |
| 4516 {true, UnicodeString("2013 Sunday Sep 22"), UnicodeStr
ing("yyyy EEE MMM dd"), UnicodeString("2013 Sun Sep 22")}, | |
| 4517 {false, UnicodeString("2013 Monday Sep 23"), UnicodeStr
ing("yyyy EEE MMM dd"), UnicodeString("")}, | |
| 4518 {false, UnicodeString("2013 Tuesday Sep 24"), UnicodeStr
ing("yyyy EEEE MMM dd"), UnicodeString("2013 Tuesday Sep 24")}, | |
| 4519 {true, UnicodeString("2013 Wed Sep 25"), UnicodeStr
ing("yyyy eee MMM dd"), UnicodeString("2013 Wed Sep 25")}, | |
| 4520 {true, UnicodeString("2013 Thu Sep 26"), UnicodeStr
ing("yyyy eee MMM dd"), UnicodeString("2013 Thu Sep 26")}, | |
| 4521 {false, UnicodeString("2013 Friday Sep 27"), UnicodeStr
ing("yyyy eee MMM dd"), UnicodeString("")}, | |
| 4522 {false, UnicodeString("2013 Saturday Sep 28"), UnicodeStr
ing("yyyy eeee MMM dd"), UnicodeString("2013 Saturday Sep 28")}, | |
| 4523 {true, UnicodeString("2013 Sun Sep 29"), UnicodeStr
ing("yyyy ccc MMM dd"), UnicodeString("2013 Sun Sep 29")}, | |
| 4524 {true, UnicodeString("2013 Monday Sep 30"), UnicodeStr
ing("yyyy ccc MMM dd"), UnicodeString("2013 Mon Sep 30")}, | |
| 4525 {false, UnicodeString("2013 Sunday Oct 13"), UnicodeStr
ing("yyyy ccc MMM dd"), UnicodeString("")}, | |
| 4526 {false, UnicodeString("2013 Monday Oct 14"), UnicodeStr
ing("yyyy cccc MMM dd"), UnicodeString("2013 Monday Oct 14")}, | |
| 4527 {true, UnicodeString("2013 Oct 15 Q4"), UnicodeStr
ing("yyyy MMM dd QQQ"), UnicodeString("2013 Oct 15 Q4")}, | |
| 4528 {true, UnicodeString("2013 Oct 16 4th quarter"), UnicodeStr
ing("yyyy MMM dd QQQ"), UnicodeString("2013 Oct 16 Q4")}, | |
| 4529 {false, UnicodeString("2013 Oct 17 4th quarter"), UnicodeStr
ing("yyyy MMM dd QQQ"), UnicodeString("")}, | |
| 4530 {false, UnicodeString("2013 Oct 18 Q4"), UnicodeStr
ing("yyyy MMM dd QQQ"), UnicodeString("2013 Oct 18 Q4")}, | |
| 4531 {true, UnicodeString("2013 Oct 19 Q4"), UnicodeStr
ing("yyyy MMM dd qqqq"), UnicodeString("2013 Oct 19 4th quarter")}, | |
| 4532 {true, UnicodeString("2013 Oct 20 4th quarter"), UnicodeStr
ing("yyyy MMM dd qqqq"), UnicodeString("2013 Oct 20 4th quarter")}, | |
| 4533 {false, UnicodeString("2013 Oct 21 Q4"), UnicodeStr
ing("yyyy MMM dd qqqq"), UnicodeString("")}, | |
| 4534 {false, UnicodeString("2013 Oct 22 4th quarter"), UnicodeStr
ing("yyyy MMM dd qqqq"), UnicodeString("2013 Oct 22 4th quarter")}, | |
| 4535 {false, UnicodeString("--end--"), UnicodeStr
ing(""), UnicodeString("")}, | |
| 4536 }; | |
| 4537 | |
| 4538 UErrorCode status = U_ZERO_ERROR; | |
| 4539 LocalPointer<Calendar> cal(Calendar::createInstance(status)); | |
| 4540 if (U_FAILURE(status)) { | |
| 4541 dataerrln(UnicodeString("FAIL: Unable to create Calendar for default tim
ezone and locale.")); | |
| 4542 return; | |
| 4543 } | |
| 4544 const TestMultiPatternMatchItem * itemPtr; | |
| 4545 DateFormat* sdmft = DateFormat::createDateInstance(); | |
| 4546 if (sdmft == NULL) { | |
| 4547 dataerrln(UnicodeString("FAIL: Unable to create DateFormat")); | |
| 4548 return; | |
| 4549 } | |
| 4550 for (itemPtr = items; itemPtr->parseString != "--end--"; itemPtr++ ) { | |
| 4551 status = U_ZERO_ERROR; | |
| 4552 ParsePosition pos(0); | |
| 4553 ((SimpleDateFormat*) sdmft)->applyPattern(itemPtr->pattern); | |
| 4554 if (U_FAILURE(status)) { | |
| 4555 dataerrln("Unable to create SimpleDateFormat - %s", u_errorName(statu
s)); | |
| 4556 continue; | |
| 4557 } | |
| 4558 sdmft->setBooleanAttribute(UDAT_PARSE_MULTIPLE_PATTERNS_FOR_MATCH, itemPt
r->leniency, status); | |
| 4559 UDate d = sdmft->parse(itemPtr->parseString, pos); | |
| 4560 | |
| 4561 if(itemPtr->expectedResult.length() == 0) { | |
| 4562 if(pos.getErrorIndex() != -1) { | |
| 4563 continue; | |
| 4564 } else { | |
| 4565 errln("error: unexpected parse success - " + itemPtr->parseStrin
g + | |
| 4566 " - error index " + pos.getErrorIndex() + | |
| 4567 " - leniency " + itemPtr->leniency); | |
| 4568 continue; | |
| 4569 } | |
| 4570 } | |
| 4571 if(pos.getErrorIndex() != -1) { | |
| 4572 errln("error: parse error for string - " +itemPtr->parseString + " -
- idx["+pos.getIndex()+"] errIdx["+pos.getErrorIndex()+"]"); | |
| 4573 continue; | |
| 4574 } | |
| 4575 | |
| 4576 UnicodeString formatResult(""); | |
| 4577 sdmft->format(d, formatResult); | |
| 4578 if(formatResult.compare(itemPtr->expectedResult) != 0) { | |
| 4579 errln("error: unexpected format result. expected[" + itemPtr->expect
edResult + "] but result was[" + formatResult + "]"); | |
| 4580 } else { | |
| 4581 logln("formatted results match! - " + formatResult); | |
| 4582 } | |
| 4583 } | |
| 4584 delete sdmft; | |
| 4585 } | |
| 4586 | |
| 4587 void DateFormatTest::TestParseLeniencyAPIs() { | |
| 4588 UErrorCode status = U_ZERO_ERROR; | |
| 4589 LocalPointer<DateFormat> dateFormat(DateFormat::createDateInstance()); | |
| 4590 DateFormat *fmt = dateFormat.getAlias(); | |
| 4591 if (fmt == NULL) { | |
| 4592 dataerrln("Failed calling dateFormat.getAlias()"); | |
| 4593 return; | |
| 4594 } | |
| 4595 | |
| 4596 assertTrue("isLenient default", fmt->isLenient()); | |
| 4597 assertTrue("isCalendarLenient default", fmt->isCalendarLenient()); | |
| 4598 assertTrue("ALLOW_WHITESPACE default", fmt->getBooleanAttribute(UDAT_PARSE_A
LLOW_WHITESPACE, status)); | |
| 4599 assertTrue("ALLOW_NUMERIC default", fmt->getBooleanAttribute(UDAT_PARSE_ALLO
W_NUMERIC, status)); | |
| 4600 assertTrue("PARTIAL_MATCH default", fmt->getBooleanAttribute(UDAT_PARSE_PART
IAL_LITERAL_MATCH, status)); | |
| 4601 assertTrue("MULTIPLE_PATTERNS default", fmt->getBooleanAttribute(UDAT_PARSE_
MULTIPLE_PATTERNS_FOR_MATCH, status)); | |
| 4602 | |
| 4603 // Set calendar to strict | |
| 4604 fmt->setCalendarLenient(FALSE); | |
| 4605 | |
| 4606 assertFalse("isLeninent after setCalendarLenient(FALSE)", fmt->isLenient()); | |
| 4607 assertFalse("isCalendarLenient after setCalendarLenient(FALSE)", fmt->isCale
ndarLenient()); | |
| 4608 assertTrue("ALLOW_WHITESPACE after setCalendarLenient(FALSE)", fmt->getBoole
anAttribute(UDAT_PARSE_ALLOW_WHITESPACE, status)); | |
| 4609 assertTrue("ALLOW_NUMERIC after setCalendarLenient(FALSE)", fmt->getBoolean
Attribute(UDAT_PARSE_ALLOW_NUMERIC, status)); | |
| 4610 | |
| 4611 // Set to strict | |
| 4612 fmt->setLenient(FALSE); | |
| 4613 | |
| 4614 assertFalse("isLeninent after setLenient(FALSE)", fmt->isLenient()); | |
| 4615 assertFalse("isCalendarLenient after setLenient(FALSE)", fmt->isCalendarLeni
ent()); | |
| 4616 assertFalse("ALLOW_WHITESPACE after setLenient(FALSE)", fmt->getBooleanAttri
bute(UDAT_PARSE_ALLOW_WHITESPACE, status)); | |
| 4617 assertFalse("ALLOW_NUMERIC after setLenient(FALSE)", fmt->getBooleanAttribu
te(UDAT_PARSE_ALLOW_NUMERIC, status)); | |
| 4618 // These two boolean attributes are NOT affected according to the API specif
ication | |
| 4619 assertTrue("PARTIAL_MATCH after setLenient(FALSE)", fmt->getBooleanAttribute
(UDAT_PARSE_PARTIAL_LITERAL_MATCH, status)); | |
| 4620 assertTrue("MULTIPLE_PATTERNS after setLenient(FALSE)", fmt->getBooleanAttri
bute(UDAT_PARSE_MULTIPLE_PATTERNS_FOR_MATCH, status)); | |
| 4621 | |
| 4622 // Allow white space leniency | |
| 4623 fmt->setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, TRUE, status); | |
| 4624 | |
| 4625 assertFalse("isLeninent after ALLOW_WHITESPACE/TRUE", fmt->isLenient()); | |
| 4626 assertFalse("isCalendarLenient after ALLOW_WHITESPACE/TRUE", fmt->isCalendar
Lenient()); | |
| 4627 assertTrue("ALLOW_WHITESPACE after ALLOW_WHITESPACE/TRUE", fmt->getBooleanAt
tribute(UDAT_PARSE_ALLOW_WHITESPACE, status)); | |
| 4628 assertFalse("ALLOW_NUMERIC after ALLOW_WHITESPACE/TRUE", fmt->getBooleanAtt
ribute(UDAT_PARSE_ALLOW_NUMERIC, status)); | |
| 4629 | |
| 4630 // Set to lenient | |
| 4631 fmt->setLenient(TRUE); | |
| 4632 | |
| 4633 assertTrue("isLenient after setLenient(TRUE)", fmt->isLenient()); | |
| 4634 assertTrue("isCalendarLenient after setLenient(TRUE)", fmt->isCalendarLenien
t()); | |
| 4635 assertTrue("ALLOW_WHITESPACE after setLenient(TRUE)", fmt->getBooleanAttribu
te(UDAT_PARSE_ALLOW_WHITESPACE, status)); | |
| 4636 assertTrue("ALLOW_NUMERIC after setLenient(TRUE)", fmt->getBooleanAttribute(
UDAT_PARSE_ALLOW_NUMERIC, status)); | |
| 4637 } | |
| 4638 | |
| 4639 void DateFormatTest::TestNumberFormatOverride() { | |
| 4640 UErrorCode status = U_ZERO_ERROR; | |
| 4641 UnicodeString fields = (UnicodeString) "M"; | |
| 4642 | |
| 4643 LocalPointer<SimpleDateFormat> fmt; | |
| 4644 fmt.adoptInsteadAndCheckErrorCode(new SimpleDateFormat((UnicodeString)"MM d"
, status), status); | |
| 4645 if (!assertSuccess("SimpleDateFormat with pattern MM d", status)) { | |
| 4646 return; | |
| 4647 } | |
| 4648 | |
| 4649 | |
| 4650 for(int i=0; i<3; i++){ | |
| 4651 NumberFormat* check_nf = NumberFormat::createInstance(Locale("en_US"), s
tatus); | |
| 4652 assertSuccess("NumberFormat en_US", status); | |
| 4653 fmt->adoptNumberFormat(fields, check_nf, status); | |
| 4654 assertSuccess("adoptNumberFormat check_nf", status); | |
| 4655 | |
| 4656 const NumberFormat* get_nf = fmt->getNumberFormatForField('M'); | |
| 4657 if (get_nf != check_nf) errln("FAIL: getter and setter do not work"); | |
| 4658 } | |
| 4659 NumberFormat* check_nf = NumberFormat::createInstance(Locale("en_US"), statu
s); | |
| 4660 assertSuccess("NumberFormat en_US", status); | |
| 4661 fmt->adoptNumberFormat(check_nf); // make sure using the same NF will not cr
ash | |
| 4662 | |
| 4663 const char * DATA [][2] = { | |
| 4664 { "", "\\u521D\\u516D \\u5341\\u4E94"}, | |
| 4665 { "M", "\\u521D\\u516D 15"}, | |
| 4666 { "Mo", "\\u521D\\u516D 15"}, | |
| 4667 { "Md", "\\u521D\\u516D \\u5341\\u4E94"}, | |
| 4668 { "MdMMd", "\\u521D\\u516D \\u5341\\u4E94"}, | |
| 4669 { "mixed", "\\u521D\\u516D \\u5341\\u4E94"} | |
| 4670 }; | |
| 4671 | |
| 4672 UDate test_date = date(97, 6 - 1, 15); | |
| 4673 | |
| 4674 for(int i=0; i < (int)(sizeof(DATA)/sizeof(DATA[0])); i++){ | |
| 4675 fields = DATA[i][0]; | |
| 4676 | |
| 4677 LocalPointer<SimpleDateFormat> fmt; | |
| 4678 fmt.adoptInsteadAndCheckErrorCode(new SimpleDateFormat((UnicodeString)"M
M d", status), status); | |
| 4679 assertSuccess("SimpleDateFormat with pattern MM d", status); | |
| 4680 NumberFormat* overrideNF = NumberFormat::createInstance(Locale::createFr
omName("zh@numbers=hanidays"),status); | |
| 4681 assertSuccess("NumberFormat zh@numbers=hanidays", status); | |
| 4682 | |
| 4683 if (fields == (UnicodeString) "") { // use the one w/o fields | |
| 4684 fmt->adoptNumberFormat(overrideNF); | |
| 4685 } else if (fields == (UnicodeString) "mixed") { // set 1 field at first
but then full override, both(M & d) should be override | |
| 4686 NumberFormat* singleOverrideNF = NumberFormat::createInstance(Locale
::createFromName("en@numbers=hebr"),status); | |
| 4687 assertSuccess("NumberFormat en@numbers=hebr", status); | |
| 4688 | |
| 4689 fields = (UnicodeString) "M"; | |
| 4690 fmt->adoptNumberFormat(fields, singleOverrideNF, status); | |
| 4691 assertSuccess("adoptNumberFormat singleOverrideNF", status); | |
| 4692 | |
| 4693 fmt->adoptNumberFormat(overrideNF); | |
| 4694 } else if (fields == (UnicodeString) "Mo"){ // o is invlid field | |
| 4695 fmt->adoptNumberFormat(fields, overrideNF, status); | |
| 4696 if(status == U_INVALID_FORMAT_ERROR) { | |
| 4697 status = U_ZERO_ERROR; | |
| 4698 continue; | |
| 4699 } | |
| 4700 } else { | |
| 4701 fmt->adoptNumberFormat(fields, overrideNF, status); | |
| 4702 assertSuccess("adoptNumberFormat overrideNF", status); | |
| 4703 } | |
| 4704 | |
| 4705 UnicodeString result; | |
| 4706 FieldPosition pos(0); | |
| 4707 fmt->format(test_date,result, pos); | |
| 4708 | |
| 4709 UnicodeString expected = ((UnicodeString)DATA[i][1]).unescape();; | |
| 4710 | |
| 4711 if (result != expected) | |
| 4712 errln("FAIL: Expected " + expected + " get: " + result); | |
| 4713 } | |
| 4714 } | |
| 4715 | |
| 4716 void DateFormatTest::TestCreateInstanceForSkeleton() { | |
| 4717 UErrorCode status = U_ZERO_ERROR; | |
| 4718 LocalPointer<DateFormat> fmt(DateFormat::createInstanceForSkeleton( | |
| 4719 "yMMMMd", "en", status)); | |
| 4720 if (!assertSuccess("Create with pattern yMMMMd", status)) { | |
| 4721 return; | |
| 4722 } | |
| 4723 UnicodeString result; | |
| 4724 FieldPosition pos(0); | |
| 4725 fmt->format(date(98, 5-1, 25), result, pos); | |
| 4726 assertEquals("format yMMMMd", "May 25, 1998", result); | |
| 4727 fmt.adoptInstead(DateFormat::createInstanceForSkeleton( | |
| 4728 "yMd", "en", status)); | |
| 4729 if (!assertSuccess("Create with pattern yMd", status)) { | |
| 4730 return; | |
| 4731 } | |
| 4732 result.remove(); | |
| 4733 fmt->format(date(98, 5-1, 25), result, pos); | |
| 4734 assertEquals("format yMd", "5/25/1998", result); | |
| 4735 } | |
| 4736 | |
| 4737 void DateFormatTest::TestCreateInstanceForSkeletonDefault() { | |
| 4738 UErrorCode status = U_ZERO_ERROR; | |
| 4739 Locale savedLocale; | |
| 4740 Locale::setDefault(Locale::getUS(), status); | |
| 4741 LocalPointer<DateFormat> fmt(DateFormat::createInstanceForSkeleton( | |
| 4742 "yMMMd", status)); | |
| 4743 Locale::setDefault(savedLocale, status); | |
| 4744 if (!assertSuccess("Create with pattern yMMMd", status)) { | |
| 4745 return; | |
| 4746 } | |
| 4747 UnicodeString result; | |
| 4748 FieldPosition pos(0); | |
| 4749 fmt->format(date(98, 5-1, 25), result, pos); | |
| 4750 assertEquals("format yMMMd", "May 25, 1998", result); | |
| 4751 } | |
| 4752 | |
| 4753 void DateFormatTest::TestCreateInstanceForSkeletonWithCalendar() { | |
| 4754 UErrorCode status = U_ZERO_ERROR; | |
| 4755 LocalPointer<DateFormat> fmt( | |
| 4756 DateFormat::createInstanceForSkeleton( | |
| 4757 Calendar::createInstance( | |
| 4758 TimeZone::createTimeZone("GMT-3:00"), | |
| 4759 status), | |
| 4760 "yMdHm", "en", status)); | |
| 4761 if (!assertSuccess("Create with pattern yMMMMd", status)) { | |
| 4762 return; | |
| 4763 } | |
| 4764 UnicodeString result; | |
| 4765 FieldPosition pos(0); | |
| 4766 | |
| 4767 LocalPointer<Calendar> cal(Calendar::createInstance( | |
| 4768 TimeZone::createTimeZone("GMT-7:00"), | |
| 4769 status)); | |
| 4770 if (!assertSuccess("Creating GMT-7 time zone failed", status)) { | |
| 4771 return; | |
| 4772 } | |
| 4773 cal->clear(); | |
| 4774 cal->set(1998, 5-1, 25, 0, 0, 0); | |
| 4775 | |
| 4776 // date format time zone should be 4 hours ahead. | |
| 4777 fmt->format(cal->getTime(status), result, pos); | |
| 4778 assertEquals("format yMdHm", "5/25/1998, 04:00", result); | |
| 4779 assertSuccess("", status); | |
| 4780 } | |
| 4781 | |
| 4782 void DateFormatTest::TestDFSCreateForLocaleNonGregorianLocale() { | |
| 4783 UErrorCode status = U_ZERO_ERROR; | |
| 4784 Locale fa("fa"); | |
| 4785 LocalPointer<DateFormatSymbols> sym( | |
| 4786 DateFormatSymbols::createForLocale(fa, status)); | |
| 4787 if (!assertSuccess("", status)) { | |
| 4788 return; | |
| 4789 } | |
| 4790 | |
| 4791 // Farsi should default to the persian calendar, not gregorian | |
| 4792 int32_t count; | |
| 4793 const UnicodeString *months = sym->getShortMonths(count); | |
| 4794 | |
| 4795 // First persian month. | |
| 4796 UnicodeString expected("\\u0641\\u0631\\u0648\\u0631\\u062f\\u06cc\\u0646"); | |
| 4797 assertEquals("", expected.unescape(), months[0]); | |
| 4798 } | |
| 4799 | |
| 4800 void DateFormatTest::TestDFSCreateForLocaleWithCalendarInLocale() { | |
| 4801 UErrorCode status = U_ZERO_ERROR; | |
| 4802 Locale en_heb("en@calendar=hebrew"); | |
| 4803 LocalPointer<DateFormatSymbols> sym( | |
| 4804 DateFormatSymbols::createForLocale(en_heb, status)); | |
| 4805 if (!assertSuccess("", status)) { | |
| 4806 return; | |
| 4807 } | |
| 4808 | |
| 4809 // We should get the months of the hebrew calendar, not the gregorian | |
| 4810 // calendar. | |
| 4811 int32_t count; | |
| 4812 const UnicodeString *months = sym->getShortMonths(count); | |
| 4813 | |
| 4814 // First hebrew month. | |
| 4815 UnicodeString expected("Tishri"); | |
| 4816 assertEquals("", expected, months[0]); | |
| 4817 } | |
| 4818 | |
| 4819 void DateFormatTest::TestChangeCalendar() { | |
| 4820 UErrorCode status = U_ZERO_ERROR; | |
| 4821 Locale en("en"); | |
| 4822 Locale en_heb("en@calendar=hebrew"); | |
| 4823 LocalPointer<DateFormat> fmt( | |
| 4824 DateFormat::createInstanceForSkeleton("yMMMd", en, status)); | |
| 4825 if (!assertSuccess("", status)) { | |
| 4826 return; | |
| 4827 } | |
| 4828 fmt->adoptCalendar(Calendar::createInstance(en_heb, status)); | |
| 4829 if (!assertSuccess("", status)) { | |
| 4830 return; | |
| 4831 } | |
| 4832 UnicodeString result; | |
| 4833 FieldPosition pos(0); | |
| 4834 fmt->format(date(98, 5-1, 25), result, pos); | |
| 4835 assertEquals("format yMMMd", "Iyar 29, 5758", result); | |
| 4836 } | |
| 4837 | |
| 4838 | |
| 4839 #endif /* #if !UCONFIG_NO_FORMATTING */ | |
| 4840 | |
| 4841 //eof | |
| OLD | NEW |