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