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