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