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