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