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