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