21 * questions.
22 */
23
24 /*
25 *
26 * @test
27 * @bug 8176841
28 * @summary Tests java.time classes deals with Unicode extensions
29 * correctly.
30 * @modules jdk.localedata
31 * @run testng/othervm -Djava.locale.providers=CLDR JavaTimeTests
32 */
33
34 import static org.testng.Assert.assertEquals;
35
36 import java.time.DayOfWeek;
37 import java.time.ZonedDateTime;
38 import java.time.ZoneId;
39 import java.time.chrono.Chronology;
40 import java.time.chrono.HijrahChronology;
41 import java.time.chrono.JapaneseChronology;
42 import java.time.format.DateTimeFormatter;
43 import java.time.format.DateTimeFormatterBuilder;
44 import java.time.format.FormatStyle;
45 import java.time.temporal.WeekFields;
46 import java.util.Locale;
47 import java.util.TimeZone;
48
49 import org.testng.annotations.AfterTest;
50 import org.testng.annotations.BeforeTest;
51 import org.testng.annotations.DataProvider;
52 import org.testng.annotations.Test;
53
54 /**
55 * Test JavaTime with BCP47 U extensions
56 */
57 @Test
58 public class JavaTimeTests {
59 private static TimeZone defaultTZ;
60
61 private static final Chronology JAPANESE = JapaneseChronology.INSTANCE;
62 private static final Chronology HIJRAH = HijrahChronology.INSTANCE;
63
64 private static final ZoneId ASIATOKYO = ZoneId.of("Asia/Tokyo");
76 private static final Locale FW_FRI = Locale.forLanguageTag("en-US-u-fw-fri");
77 private static final Locale FW_SAT = Locale.forLanguageTag("en-US-u-fw-sat");
78
79 private static final Locale RG_GB = Locale.forLanguageTag("en-US-u-rg-gbzzzz");
80
81 private static final ZonedDateTime ZDT = ZonedDateTime.of(2017, 8, 10, 15, 15, 0, 0, AMLA);
82
83 private static final String PATTERN = "GGGG MMMM-dd-uu HH:mm:ss zzzz";
84
85 @BeforeTest
86 public void beforeTest() {
87 defaultTZ = TimeZone.getDefault();
88 TimeZone.setDefault(TimeZone.getTimeZone(AMLA));
89 }
90
91 @AfterTest
92 public void afterTest() {
93 TimeZone.setDefault(defaultTZ);
94 }
95
96 @DataProvider(name="withLocale")
97 Object[][] withLocale() {
98 return new Object[][] {
99 // Locale, Chrono override, Zone override, Expected Chrono, Expected Zone,
100 // Expected formatted string
101 {Locale.JAPAN, null, null, null, null,
102 "2017\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 \u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593"
103 },
104 {Locale.JAPAN, JAPANESE, null, JAPANESE, null,
105 "\u5e73\u621029\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 \u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593"
106 },
107 {Locale.JAPAN, JAPANESE, ASIATOKYO, JAPANESE, ASIATOKYO,
108 "\u5e73\u621029\u5e748\u670811\u65e5\u91d1\u66dc\u65e5 7\u664215\u520600\u79d2 \u65e5\u672c\u6a19\u6e96\u6642"
109 },
110
111 {JCAL, null, null, JAPANESE, null,
112 "Thursday, August 10, 29 Heisei at 3:15:00 PM Pacific Daylight Time"
113 },
114 {JCAL, HIJRAH, null, JAPANESE, null,
115 "Thursday, August 10, 29 Heisei at 3:15:00 PM Pacific Daylight Time"
116 },
117 {HCAL, JAPANESE, null, HIJRAH, null,
119 },
120
121
122 {JPTYO, null, null, null, ASIATOKYO,
123 "Friday, August 11, 2017 at 7:15:00 AM Japan Standard Time"
124 },
125 {JPTYO, null, AMLA, null, ASIATOKYO,
126 "Friday, August 11, 2017 at 7:15:00 AM Japan Standard Time"
127 },
128 // invalid tz
129 {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, null, null,
130 "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time"
131 },
132 {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, AMLA, null, AMLA,
133 "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time"
134 },
135
136 {RG_GB, null, null, null, null,
137 "Thursday, 10 August 2017 at 15:15:00 Pacific Daylight Time"
138 },
139 };
140 }
141
142 @DataProvider(name="firstDayOfWeek")
143 Object[][] firstDayOfWeek () {
144 return new Object[][] {
145 // Locale, Expected DayOfWeek,
146 {Locale.US, DayOfWeek.SUNDAY},
147 {FW_SUN, DayOfWeek.SUNDAY},
148 {FW_MON, DayOfWeek.MONDAY},
149 {FW_TUE, DayOfWeek.TUESDAY},
150 {FW_WED, DayOfWeek.WEDNESDAY},
151 {FW_THU, DayOfWeek.THURSDAY},
152 {FW_FRI, DayOfWeek.FRIDAY},
153 {FW_SAT, DayOfWeek.SATURDAY},
154
155 // invalid case
156 {Locale.forLanguageTag("en-US-u-fw-xxx"), DayOfWeek.SUNDAY},
157
158 // region override
166 };
167 }
168
169 @DataProvider(name="minDaysInFirstWeek")
170 Object[][] minDaysInFrstWeek () {
171 return new Object[][] {
172 // Locale, Expected minDay,
173 {Locale.US, 1},
174
175 // region override
176 {RG_GB, 4},
177 {Locale.forLanguageTag("zh-CN-u-rg-eszzzz"), 4},
178 };
179 }
180
181 @DataProvider(name="ofPattern")
182 Object[][] ofPattern() {
183 return new Object[][] {
184 // Locale, Expected Chrono, Expected Zone,
185 // Expected formatted string
186 {JCAL, JAPANESE, null,
187 "Heisei August-10-17 15:15:00 Pacific Daylight Time"
188 },
189 {HCAL, HIJRAH, null,
190 "AH Dhu\u02bbl-Qi\u02bbdah-18-38 15:15:00 Pacific Daylight Time"
191 },
192
193 {JPTYO, null, ASIATOKYO,
194 "Anno Domini August-11-17 07:15:00 Japan Standard Time"
195 },
196 {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null,
197 "Anno Domini August-10-17 15:15:00 Pacific Daylight Time"
198 },
199
200 {RG_GB, null, null,
201 "Anno Domini August-10-17 15:15:00 Pacific Daylight Time"
202 },
203
204 };
205 }
206
207 @Test(dataProvider="withLocale")
208 public void test_withLocale(Locale locale, Chronology chrono, ZoneId zone,
209 Chronology chronoExpected, ZoneId zoneExpected,
210 String formatExpected) {
211 DateTimeFormatter dtf =
212 DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.FULL)
213 .withChronology(chrono).withZone(zone).withLocale(locale);
214 assertEquals(dtf.getChronology(), chronoExpected);
215 assertEquals(dtf.getZone(), zoneExpected);
216 String formatted = dtf.format(ZDT);
217 assertEquals(formatted, formatExpected);
218 assertEquals(dtf.parse(formatted, ZonedDateTime::from),
219 zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT);
220 }
221
222 @Test(dataProvider="firstDayOfWeek")
223 public void test_firstDayOfWeek(Locale locale, DayOfWeek dowExpected) {
224 DayOfWeek dow = WeekFields.of(locale).getFirstDayOfWeek();
225 assertEquals(dow, dowExpected);
226 }
241 assertEquals(dtf.getZone(), zoneExpected);
242 String formatted = dtf.format(ZDT);
243 assertEquals(formatted, formatExpected);
244 assertEquals(dtf.parse(formatted, ZonedDateTime::from),
245 zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT);
246 }
247
248 @Test(dataProvider="ofPattern")
249 public void test_toFormatter(Locale locale,
250 Chronology chronoExpected, ZoneId zoneExpected,
251 String formatExpected) {
252 DateTimeFormatter dtf =
253 new DateTimeFormatterBuilder().appendPattern(PATTERN).toFormatter(locale);
254 assertEquals(dtf.getChronology(), chronoExpected);
255 assertEquals(dtf.getZone(), zoneExpected);
256 String formatted = dtf.format(ZDT);
257 assertEquals(formatted, formatExpected);
258 assertEquals(dtf.parse(formatted, ZonedDateTime::from),
259 zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT);
260 }
261 }
|
21 * questions.
22 */
23
24 /*
25 *
26 * @test
27 * @bug 8176841
28 * @summary Tests java.time classes deals with Unicode extensions
29 * correctly.
30 * @modules jdk.localedata
31 * @run testng/othervm -Djava.locale.providers=CLDR JavaTimeTests
32 */
33
34 import static org.testng.Assert.assertEquals;
35
36 import java.time.DayOfWeek;
37 import java.time.ZonedDateTime;
38 import java.time.ZoneId;
39 import java.time.chrono.Chronology;
40 import java.time.chrono.HijrahChronology;
41 import java.time.chrono.IsoChronology;
42 import java.time.chrono.JapaneseChronology;
43 import java.time.format.DateTimeFormatter;
44 import java.time.format.DateTimeFormatterBuilder;
45 import java.time.format.FormatStyle;
46 import java.time.temporal.ChronoField;
47 import java.time.temporal.TemporalField;
48 import java.time.temporal.WeekFields;
49 import java.util.Locale;
50 import java.util.TimeZone;
51
52 import org.testng.annotations.AfterTest;
53 import org.testng.annotations.BeforeTest;
54 import org.testng.annotations.DataProvider;
55 import org.testng.annotations.Test;
56
57 /**
58 * Test JavaTime with BCP47 U extensions
59 */
60 @Test
61 public class JavaTimeTests {
62 private static TimeZone defaultTZ;
63
64 private static final Chronology JAPANESE = JapaneseChronology.INSTANCE;
65 private static final Chronology HIJRAH = HijrahChronology.INSTANCE;
66
67 private static final ZoneId ASIATOKYO = ZoneId.of("Asia/Tokyo");
79 private static final Locale FW_FRI = Locale.forLanguageTag("en-US-u-fw-fri");
80 private static final Locale FW_SAT = Locale.forLanguageTag("en-US-u-fw-sat");
81
82 private static final Locale RG_GB = Locale.forLanguageTag("en-US-u-rg-gbzzzz");
83
84 private static final ZonedDateTime ZDT = ZonedDateTime.of(2017, 8, 10, 15, 15, 0, 0, AMLA);
85
86 private static final String PATTERN = "GGGG MMMM-dd-uu HH:mm:ss zzzz";
87
88 @BeforeTest
89 public void beforeTest() {
90 defaultTZ = TimeZone.getDefault();
91 TimeZone.setDefault(TimeZone.getTimeZone(AMLA));
92 }
93
94 @AfterTest
95 public void afterTest() {
96 TimeZone.setDefault(defaultTZ);
97 }
98
99 @DataProvider(name="localizedBy")
100 Object[][] localizedBy() {
101 return new Object[][] {
102 // Locale, Chrono override, Zone override, Expected Chrono, Expected Zone,
103 // Expected formatted string
104 {Locale.JAPAN, null, null, null, null,
105 "2017\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 \u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593"
106 },
107 {Locale.JAPAN, JAPANESE, null, JAPANESE, null,
108 "\u5e73\u621029\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 \u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593"
109 },
110 {Locale.JAPAN, JAPANESE, ASIATOKYO, JAPANESE, ASIATOKYO,
111 "\u5e73\u621029\u5e748\u670811\u65e5\u91d1\u66dc\u65e5 7\u664215\u520600\u79d2 \u65e5\u672c\u6a19\u6e96\u6642"
112 },
113
114 {JCAL, null, null, JAPANESE, null,
115 "Thursday, August 10, 29 Heisei at 3:15:00 PM Pacific Daylight Time"
116 },
117 {JCAL, HIJRAH, null, JAPANESE, null,
118 "Thursday, August 10, 29 Heisei at 3:15:00 PM Pacific Daylight Time"
119 },
120 {HCAL, JAPANESE, null, HIJRAH, null,
122 },
123
124
125 {JPTYO, null, null, null, ASIATOKYO,
126 "Friday, August 11, 2017 at 7:15:00 AM Japan Standard Time"
127 },
128 {JPTYO, null, AMLA, null, ASIATOKYO,
129 "Friday, August 11, 2017 at 7:15:00 AM Japan Standard Time"
130 },
131 // invalid tz
132 {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, null, null,
133 "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time"
134 },
135 {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, AMLA, null, AMLA,
136 "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time"
137 },
138
139 {RG_GB, null, null, null, null,
140 "Thursday, 10 August 2017 at 15:15:00 Pacific Daylight Time"
141 },
142
143 // DecimalStyle
144 {Locale.forLanguageTag("en-US-u-nu-thai"), null, null, null, null,
145 "Thursday, August \u0e51\u0e50, \u0e52\u0e50\u0e51\u0e57 at \u0e53:\u0e51\u0e55:\u0e50\u0e50 PM Pacific Daylight Time"
146 },
147 // DecimalStyle, "nu" vs "rg"
148 {Locale.forLanguageTag("en-US-u-nu-thai-rg-uszzzz"), null, null, null, null,
149 "Thursday, August \u0e51\u0e50, \u0e52\u0e50\u0e51\u0e57 at \u0e53:\u0e51\u0e55:\u0e50\u0e50 PM Pacific Daylight Time"
150 },
151 // DecimalStyle, invalid
152 {Locale.forLanguageTag("en-US-u-nu-foo"), null, null, null, null,
153 "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time"
154 },
155 };
156 }
157
158 @DataProvider(name="withLocale")
159 Object[][] withLocale() {
160 return new Object[][] {
161 // Locale, Chrono override, Zone override, Expected Chrono, Expected Zone,
162 // Expected formatted string
163 {Locale.JAPAN, null, null, null, null,
164 "2017\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 \u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593"
165 },
166 {Locale.JAPAN, JAPANESE, null, JAPANESE, null,
167 "\u5e73\u621029\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 \u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593"
168 },
169 {Locale.JAPAN, JAPANESE, ASIATOKYO, JAPANESE, ASIATOKYO,
170 "\u5e73\u621029\u5e748\u670811\u65e5\u91d1\u66dc\u65e5 7\u664215\u520600\u79d2 \u65e5\u672c\u6a19\u6e96\u6642"
171 },
172
173 {JCAL, null, null, null, null,
174 "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time"
175 },
176 {JCAL, HIJRAH, null, HIJRAH, null,
177 "Thursday, Dhu\u02bbl-Qi\u02bbdah 18, 1438 AH at 3:15:00 PM Pacific Daylight Time"
178 },
179 {HCAL, JAPANESE, null, JAPANESE, null,
180 "Thursday, August 10, 29 Heisei at 3:15:00 PM Pacific Daylight Time"
181 },
182
183
184 {JPTYO, null, null, null, null,
185 "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time"
186 },
187 {JPTYO, null, AMLA, null, AMLA,
188 "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time"
189 },
190 // invalid tz
191 {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, null, null,
192 "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time"
193 },
194 {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, null, null,
195 "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time"
196 },
197
198 {RG_GB, null, null, null, null,
199 "Thursday, 10 August 2017 at 15:15:00 Pacific Daylight Time"
200 },
201
202 // DecimalStyle
203 {Locale.forLanguageTag("en-US-u-nu-thai"), null, null, null, null,
204 "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time"
205 },
206 // DecimalStyle, "nu" vs "rg"
207 {Locale.forLanguageTag("en-US-u-nu-thai-rg-uszzzz"), null, null, null, null,
208 "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time"
209 },
210 // DecimalStyle, invalid
211 {Locale.forLanguageTag("en-US-u-nu-foo"), null, null, null, null,
212 "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time"
213 },
214 };
215 }
216
217 @DataProvider(name="firstDayOfWeek")
218 Object[][] firstDayOfWeek () {
219 return new Object[][] {
220 // Locale, Expected DayOfWeek,
221 {Locale.US, DayOfWeek.SUNDAY},
222 {FW_SUN, DayOfWeek.SUNDAY},
223 {FW_MON, DayOfWeek.MONDAY},
224 {FW_TUE, DayOfWeek.TUESDAY},
225 {FW_WED, DayOfWeek.WEDNESDAY},
226 {FW_THU, DayOfWeek.THURSDAY},
227 {FW_FRI, DayOfWeek.FRIDAY},
228 {FW_SAT, DayOfWeek.SATURDAY},
229
230 // invalid case
231 {Locale.forLanguageTag("en-US-u-fw-xxx"), DayOfWeek.SUNDAY},
232
233 // region override
241 };
242 }
243
244 @DataProvider(name="minDaysInFirstWeek")
245 Object[][] minDaysInFrstWeek () {
246 return new Object[][] {
247 // Locale, Expected minDay,
248 {Locale.US, 1},
249
250 // region override
251 {RG_GB, 4},
252 {Locale.forLanguageTag("zh-CN-u-rg-eszzzz"), 4},
253 };
254 }
255
256 @DataProvider(name="ofPattern")
257 Object[][] ofPattern() {
258 return new Object[][] {
259 // Locale, Expected Chrono, Expected Zone,
260 // Expected formatted string
261 {JCAL, null, null,
262 "Anno Domini August-10-17 15:15:00 Pacific Daylight Time"
263 },
264 {HCAL, null, null,
265 "Anno Domini August-10-17 15:15:00 Pacific Daylight Time"
266 },
267
268 {JPTYO, null, null,
269 "Anno Domini August-10-17 15:15:00 Pacific Daylight Time"
270 },
271 {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null,
272 "Anno Domini August-10-17 15:15:00 Pacific Daylight Time"
273 },
274
275 {RG_GB, null, null,
276 "Anno Domini August-10-17 15:15:00 Pacific Daylight Time"
277 },
278
279 };
280 }
281
282 @DataProvider(name="shortTZID")
283 Object[][] shortTZID() {
284 return new Object[][] {
285 // LDML's short ID, Expected Zone,
286 {"adalv", "Europe/Andorra"},
287 {"aedxb", "Asia/Dubai"},
288 {"afkbl", "Asia/Kabul"},
289 {"aganu", "America/Antigua"},
290 {"aiaxa", "America/Anguilla"},
291 {"altia", "Europe/Tirane"},
292 {"amevn", "Asia/Yerevan"},
293 {"ancur", "America/Curacao"},
294 {"aolad", "Africa/Luanda"},
295 {"aqcas", "Antarctica/Casey"},
296 {"aqdav", "Antarctica/Davis"},
297 {"aqddu", "Antarctica/DumontDUrville"},
298 {"aqmaw", "Antarctica/Mawson"},
299 {"aqmcm", "Antarctica/McMurdo"},
300 {"aqplm", "Antarctica/Palmer"},
301 {"aqrot", "Antarctica/Rothera"},
302 {"aqsyw", "Antarctica/Syowa"},
303 {"aqtrl", "Antarctica/Troll"},
304 {"aqvos", "Antarctica/Vostok"},
305 {"arbue", "America/Buenos_Aires"},
306 {"arcor", "America/Cordoba"},
307 {"arctc", "America/Catamarca"},
308 {"arirj", "America/Argentina/La_Rioja"},
309 {"arjuj", "America/Jujuy"},
310 {"arluq", "America/Argentina/San_Luis"},
311 {"armdz", "America/Mendoza"},
312 {"arrgl", "America/Argentina/Rio_Gallegos"},
313 {"arsla", "America/Argentina/Salta"},
314 {"artuc", "America/Argentina/Tucuman"},
315 {"aruaq", "America/Argentina/San_Juan"},
316 {"arush", "America/Argentina/Ushuaia"},
317 {"asppg", "Pacific/Pago_Pago"},
318 {"atvie", "Europe/Vienna"},
319 {"auadl", "Australia/Adelaide"},
320 {"aubhq", "Australia/Broken_Hill"},
321 {"aubne", "Australia/Brisbane"},
322 {"audrw", "Australia/Darwin"},
323 {"aueuc", "Australia/Eucla"},
324 {"auhba", "Australia/Hobart"},
325 {"aukns", "Australia/Currie"},
326 {"auldc", "Australia/Lindeman"},
327 {"auldh", "Australia/Lord_Howe"},
328 {"aumel", "Australia/Melbourne"},
329 {"aumqi", "Antarctica/Macquarie"},
330 {"auper", "Australia/Perth"},
331 {"ausyd", "Australia/Sydney"},
332 {"awaua", "America/Aruba"},
333 {"azbak", "Asia/Baku"},
334 {"basjj", "Europe/Sarajevo"},
335 {"bbbgi", "America/Barbados"},
336 {"bddac", "Asia/Dhaka"},
337 {"bebru", "Europe/Brussels"},
338 {"bfoua", "Africa/Ouagadougou"},
339 {"bgsof", "Europe/Sofia"},
340 {"bhbah", "Asia/Bahrain"},
341 {"bibjm", "Africa/Bujumbura"},
342 {"bjptn", "Africa/Porto-Novo"},
343 {"bmbda", "Atlantic/Bermuda"},
344 {"bnbwn", "Asia/Brunei"},
345 {"bolpb", "America/La_Paz"},
346 {"bqkra", "America/Kralendijk"},
347 {"braux", "America/Araguaina"},
348 {"brbel", "America/Belem"},
349 {"brbvb", "America/Boa_Vista"},
350 {"brcgb", "America/Cuiaba"},
351 {"brcgr", "America/Campo_Grande"},
352 {"brern", "America/Eirunepe"},
353 {"brfen", "America/Noronha"},
354 {"brfor", "America/Fortaleza"},
355 {"brmao", "America/Manaus"},
356 {"brmcz", "America/Maceio"},
357 {"brpvh", "America/Porto_Velho"},
358 {"brrbr", "America/Rio_Branco"},
359 {"brrec", "America/Recife"},
360 {"brsao", "America/Sao_Paulo"},
361 {"brssa", "America/Bahia"},
362 {"brstm", "America/Santarem"},
363 {"bsnas", "America/Nassau"},
364 {"btthi", "Asia/Thimphu"},
365 {"bwgbe", "Africa/Gaborone"},
366 {"bymsq", "Europe/Minsk"},
367 {"bzbze", "America/Belize"},
368 {"cacfq", "America/Creston"},
369 {"caedm", "America/Edmonton"},
370 {"caffs", "America/Rainy_River"},
371 {"cafne", "America/Fort_Nelson"},
372 {"caglb", "America/Glace_Bay"},
373 {"cagoo", "America/Goose_Bay"},
374 {"cahal", "America/Halifax"},
375 {"caiql", "America/Iqaluit"},
376 {"camon", "America/Moncton"},
377 {"capnt", "America/Pangnirtung"},
378 {"careb", "America/Resolute"},
379 {"careg", "America/Regina"},
380 {"casjf", "America/St_Johns"},
381 {"canpg", "America/Nipigon"},
382 {"cathu", "America/Thunder_Bay"},
383 {"cator", "America/Toronto"},
384 {"cavan", "America/Vancouver"},
385 {"cawnp", "America/Winnipeg"},
386 {"caybx", "America/Blanc-Sablon"},
387 {"caycb", "America/Cambridge_Bay"},
388 {"cayda", "America/Dawson"},
389 {"caydq", "America/Dawson_Creek"},
390 {"cayek", "America/Rankin_Inlet"},
391 {"cayev", "America/Inuvik"},
392 {"cayxy", "America/Whitehorse"},
393 {"cayyn", "America/Swift_Current"},
394 {"cayzf", "America/Yellowknife"},
395 {"cayzs", "America/Coral_Harbour"},
396 {"cccck", "Indian/Cocos"},
397 {"cdfbm", "Africa/Lubumbashi"},
398 {"cdfih", "Africa/Kinshasa"},
399 {"cfbgf", "Africa/Bangui"},
400 {"cgbzv", "Africa/Brazzaville"},
401 {"chzrh", "Europe/Zurich"},
402 {"ciabj", "Africa/Abidjan"},
403 {"ckrar", "Pacific/Rarotonga"},
404 {"clipc", "Pacific/Easter"},
405 {"clscl", "America/Santiago"},
406 {"cmdla", "Africa/Douala"},
407 {"cnsha", "Asia/Shanghai"},
408 {"cnurc", "Asia/Urumqi"},
409 {"cobog", "America/Bogota"},
410 {"crsjo", "America/Costa_Rica"},
411 {"cst6cdt", "CST6CDT"},
412 {"cuhav", "America/Havana"},
413 {"cvrai", "Atlantic/Cape_Verde"},
414 {"cxxch", "Indian/Christmas"},
415 {"cynic", "Asia/Nicosia"},
416 {"czprg", "Europe/Prague"},
417 {"deber", "Europe/Berlin"},
418 {"debsngn", "Europe/Busingen"},
419 {"djjib", "Africa/Djibouti"},
420 {"dkcph", "Europe/Copenhagen"},
421 {"dmdom", "America/Dominica"},
422 {"dosdq", "America/Santo_Domingo"},
423 {"dzalg", "Africa/Algiers"},
424 {"ecgps", "Pacific/Galapagos"},
425 {"ecgye", "America/Guayaquil"},
426 {"eetll", "Europe/Tallinn"},
427 {"egcai", "Africa/Cairo"},
428 {"eheai", "Africa/El_Aaiun"},
429 {"erasm", "Africa/Asmera"},
430 {"esceu", "Africa/Ceuta"},
431 {"eslpa", "Atlantic/Canary"},
432 {"esmad", "Europe/Madrid"},
433 {"est5edt", "EST5EDT"},
434 {"etadd", "Africa/Addis_Ababa"},
435 {"fihel", "Europe/Helsinki"},
436 {"fimhq", "Europe/Mariehamn"},
437 {"fjsuv", "Pacific/Fiji"},
438 {"fkpsy", "Atlantic/Stanley"},
439 {"fmksa", "Pacific/Kosrae"},
440 {"fmpni", "Pacific/Ponape"},
441 {"fmtkk", "Pacific/Truk"},
442 {"fotho", "Atlantic/Faeroe"},
443 {"frpar", "Europe/Paris"},
444 {"galbv", "Africa/Libreville"},
445 {"gaza", "Asia/Gaza"},
446 {"gblon", "Europe/London"},
447 {"gdgnd", "America/Grenada"},
448 {"getbs", "Asia/Tbilisi"},
449 {"gfcay", "America/Cayenne"},
450 {"gggci", "Europe/Guernsey"},
451 {"ghacc", "Africa/Accra"},
452 {"gigib", "Europe/Gibraltar"},
453 {"gldkshvn", "America/Danmarkshavn"},
454 {"glgoh", "America/Godthab"},
455 {"globy", "America/Scoresbysund"},
456 {"glthu", "America/Thule"},
457 {"gmbjl", "Africa/Banjul"},
458 {"gncky", "Africa/Conakry"},
459 {"gpbbr", "America/Guadeloupe"},
460 {"gpmsb", "America/Marigot"},
461 {"gpsbh", "America/St_Barthelemy"},
462 {"gqssg", "Africa/Malabo"},
463 {"grath", "Europe/Athens"},
464 {"gsgrv", "Atlantic/South_Georgia"},
465 {"gtgua", "America/Guatemala"},
466 {"gugum", "Pacific/Guam"},
467 {"gwoxb", "Africa/Bissau"},
468 {"gygeo", "America/Guyana"},
469 {"hebron", "Asia/Hebron"},
470 {"hkhkg", "Asia/Hong_Kong"},
471 {"hntgu", "America/Tegucigalpa"},
472 {"hrzag", "Europe/Zagreb"},
473 {"htpap", "America/Port-au-Prince"},
474 {"hubud", "Europe/Budapest"},
475 {"iddjj", "Asia/Jayapura"},
476 {"idjkt", "Asia/Jakarta"},
477 {"idmak", "Asia/Makassar"},
478 {"idpnk", "Asia/Pontianak"},
479 {"iedub", "Europe/Dublin"},
480 {"imdgs", "Europe/Isle_of_Man"},
481 {"inccu", "Asia/Calcutta"},
482 {"iodga", "Indian/Chagos"},
483 {"iqbgw", "Asia/Baghdad"},
484 {"irthr", "Asia/Tehran"},
485 {"isrey", "Atlantic/Reykjavik"},
486 {"itrom", "Europe/Rome"},
487 {"jeruslm", "Asia/Jerusalem"},
488 {"jesth", "Europe/Jersey"},
489 {"jmkin", "America/Jamaica"},
490 {"joamm", "Asia/Amman"},
491 {"jptyo", "Asia/Tokyo"},
492 {"kenbo", "Africa/Nairobi"},
493 {"kgfru", "Asia/Bishkek"},
494 {"khpnh", "Asia/Phnom_Penh"},
495 {"kicxi", "Pacific/Kiritimati"},
496 {"kipho", "Pacific/Enderbury"},
497 {"kitrw", "Pacific/Tarawa"},
498 {"kmyva", "Indian/Comoro"},
499 {"knbas", "America/St_Kitts"},
500 {"kpfnj", "Asia/Pyongyang"},
501 {"krsel", "Asia/Seoul"},
502 {"kwkwi", "Asia/Kuwait"},
503 {"kygec", "America/Cayman"},
504 {"kzaau", "Asia/Aqtau"},
505 {"kzakx", "Asia/Aqtobe"},
506 {"kzala", "Asia/Almaty"},
507 {"kzkzo", "Asia/Qyzylorda"},
508 {"kzura", "Asia/Oral"},
509 {"lavte", "Asia/Vientiane"},
510 {"lbbey", "Asia/Beirut"},
511 {"lccas", "America/St_Lucia"},
512 {"livdz", "Europe/Vaduz"},
513 {"lkcmb", "Asia/Colombo"},
514 {"lrmlw", "Africa/Monrovia"},
515 {"lsmsu", "Africa/Maseru"},
516 {"ltvno", "Europe/Vilnius"},
517 {"lulux", "Europe/Luxembourg"},
518 {"lvrix", "Europe/Riga"},
519 {"lytip", "Africa/Tripoli"},
520 {"macas", "Africa/Casablanca"},
521 {"mcmon", "Europe/Monaco"},
522 {"mdkiv", "Europe/Chisinau"},
523 {"metgd", "Europe/Podgorica"},
524 {"mgtnr", "Indian/Antananarivo"},
525 {"mhkwa", "Pacific/Kwajalein"},
526 {"mhmaj", "Pacific/Majuro"},
527 {"mkskp", "Europe/Skopje"},
528 {"mlbko", "Africa/Bamako"},
529 {"mmrgn", "Asia/Rangoon"},
530 {"mncoq", "Asia/Choibalsan"},
531 {"mnhvd", "Asia/Hovd"},
532 {"mnuln", "Asia/Ulaanbaatar"},
533 {"momfm", "Asia/Macau"},
534 {"mpspn", "Pacific/Saipan"},
535 {"mqfdf", "America/Martinique"},
536 {"mrnkc", "Africa/Nouakchott"},
537 {"msmni", "America/Montserrat"},
538 {"mst7mdt", "MST7MDT"},
539 {"mtmla", "Europe/Malta"},
540 {"muplu", "Indian/Mauritius"},
541 {"mvmle", "Indian/Maldives"},
542 {"mwblz", "Africa/Blantyre"},
543 {"mxchi", "America/Chihuahua"},
544 {"mxcun", "America/Cancun"},
545 {"mxhmo", "America/Hermosillo"},
546 {"mxmam", "America/Matamoros"},
547 {"mxmex", "America/Mexico_City"},
548 {"mxmid", "America/Merida"},
549 {"mxmty", "America/Monterrey"},
550 {"mxmzt", "America/Mazatlan"},
551 {"mxoji", "America/Ojinaga"},
552 {"mxpvr", "America/Bahia_Banderas"},
553 {"mxstis", "America/Santa_Isabel"},
554 {"mxtij", "America/Tijuana"},
555 {"mykch", "Asia/Kuching"},
556 {"mykul", "Asia/Kuala_Lumpur"},
557 {"mzmpm", "Africa/Maputo"},
558 {"nawdh", "Africa/Windhoek"},
559 {"ncnou", "Pacific/Noumea"},
560 {"nenim", "Africa/Niamey"},
561 {"nfnlk", "Pacific/Norfolk"},
562 {"nglos", "Africa/Lagos"},
563 {"nimga", "America/Managua"},
564 {"nlams", "Europe/Amsterdam"},
565 {"noosl", "Europe/Oslo"},
566 {"npktm", "Asia/Katmandu"},
567 {"nrinu", "Pacific/Nauru"},
568 {"nuiue", "Pacific/Niue"},
569 {"nzakl", "Pacific/Auckland"},
570 {"nzcht", "Pacific/Chatham"},
571 {"ommct", "Asia/Muscat"},
572 {"papty", "America/Panama"},
573 {"pelim", "America/Lima"},
574 {"pfgmr", "Pacific/Gambier"},
575 {"pfnhv", "Pacific/Marquesas"},
576 {"pfppt", "Pacific/Tahiti"},
577 {"pgpom", "Pacific/Port_Moresby"},
578 {"pgraw", "Pacific/Bougainville"},
579 {"phmnl", "Asia/Manila"},
580 {"pkkhi", "Asia/Karachi"},
581 {"plwaw", "Europe/Warsaw"},
582 {"pmmqc", "America/Miquelon"},
583 {"pnpcn", "Pacific/Pitcairn"},
584 {"prsju", "America/Puerto_Rico"},
585 {"pst8pdt", "PST8PDT"},
586 {"ptfnc", "Atlantic/Madeira"},
587 {"ptlis", "Europe/Lisbon"},
588 {"ptpdl", "Atlantic/Azores"},
589 {"pwror", "Pacific/Palau"},
590 {"pyasu", "America/Asuncion"},
591 {"qadoh", "Asia/Qatar"},
592 {"rereu", "Indian/Reunion"},
593 {"robuh", "Europe/Bucharest"},
594 {"rsbeg", "Europe/Belgrade"},
595 {"ruchita", "Asia/Chita"},
596 {"rudyr", "Asia/Anadyr"},
597 {"rugdx", "Asia/Magadan"},
598 {"ruikt", "Asia/Irkutsk"},
599 {"rukgd", "Europe/Kaliningrad"},
600 {"rukhndg", "Asia/Khandyga"},
601 {"rukra", "Asia/Krasnoyarsk"},
602 {"rukuf", "Europe/Samara"},
603 {"rumow", "Europe/Moscow"},
604 {"runoz", "Asia/Novokuznetsk"},
605 {"ruoms", "Asia/Omsk"},
606 {"ruovb", "Asia/Novosibirsk"},
607 {"rupkc", "Asia/Kamchatka"},
608 {"rusred", "Asia/Srednekolymsk"},
609 {"ruunera", "Asia/Ust-Nera"},
610 {"ruuus", "Asia/Sakhalin"},
611 {"ruvog", "Europe/Volgograd"},
612 {"ruvvo", "Asia/Vladivostok"},
613 {"ruyek", "Asia/Yekaterinburg"},
614 {"ruyks", "Asia/Yakutsk"},
615 {"rwkgl", "Africa/Kigali"},
616 {"saruh", "Asia/Riyadh"},
617 {"sbhir", "Pacific/Guadalcanal"},
618 {"scmaw", "Indian/Mahe"},
619 {"sdkrt", "Africa/Khartoum"},
620 {"sesto", "Europe/Stockholm"},
621 {"sgsin", "Asia/Singapore"},
622 {"shshn", "Atlantic/St_Helena"},
623 {"silju", "Europe/Ljubljana"},
624 {"sjlyr", "Arctic/Longyearbyen"},
625 {"skbts", "Europe/Bratislava"},
626 {"slfna", "Africa/Freetown"},
627 {"smsai", "Europe/San_Marino"},
628 {"sndkr", "Africa/Dakar"},
629 {"somgq", "Africa/Mogadishu"},
630 {"srpbm", "America/Paramaribo"},
631 {"ssjub", "Africa/Juba"},
632 {"sttms", "Africa/Sao_Tome"},
633 {"svsal", "America/El_Salvador"},
634 {"sxphi", "America/Lower_Princes"},
635 {"sydam", "Asia/Damascus"},
636 {"szqmn", "Africa/Mbabane"},
637 {"tcgdt", "America/Grand_Turk"},
638 {"tdndj", "Africa/Ndjamena"},
639 {"tfpfr", "Indian/Kerguelen"},
640 {"tglfw", "Africa/Lome"},
641 {"thbkk", "Asia/Bangkok"},
642 {"tjdyu", "Asia/Dushanbe"},
643 {"tkfko", "Pacific/Fakaofo"},
644 {"tldil", "Asia/Dili"},
645 {"tmasb", "Asia/Ashgabat"},
646 {"tntun", "Africa/Tunis"},
647 {"totbu", "Pacific/Tongatapu"},
648 {"trist", "Europe/Istanbul"},
649 {"ttpos", "America/Port_of_Spain"},
650 {"tvfun", "Pacific/Funafuti"},
651 {"twtpe", "Asia/Taipei"},
652 {"tzdar", "Africa/Dar_es_Salaam"},
653 {"uaiev", "Europe/Kiev"},
654 {"uaozh", "Europe/Zaporozhye"},
655 {"uasip", "Europe/Simferopol"},
656 {"uauzh", "Europe/Uzhgorod"},
657 {"ugkla", "Africa/Kampala"},
658 {"umawk", "Pacific/Wake"},
659 {"umjon", "Pacific/Johnston"},
660 {"ummdy", "Pacific/Midway"},
661 // {"unk", "Etc/Unknown"},
662 {"usadk", "America/Adak"},
663 {"usaeg", "America/Indiana/Marengo"},
664 {"usanc", "America/Anchorage"},
665 {"usboi", "America/Boise"},
666 {"uschi", "America/Chicago"},
667 {"usden", "America/Denver"},
668 {"usdet", "America/Detroit"},
669 {"ushnl", "Pacific/Honolulu"},
670 {"usind", "America/Indianapolis"},
671 {"usinvev", "America/Indiana/Vevay"},
672 {"usjnu", "America/Juneau"},
673 {"usknx", "America/Indiana/Knox"},
674 {"uslax", "America/Los_Angeles"},
675 {"uslui", "America/Louisville"},
676 {"usmnm", "America/Menominee"},
677 {"usmtm", "America/Metlakatla"},
678 {"usmoc", "America/Kentucky/Monticello"},
679 {"usndcnt", "America/North_Dakota/Center"},
680 {"usndnsl", "America/North_Dakota/New_Salem"},
681 {"usnyc", "America/New_York"},
682 {"usoea", "America/Indiana/Vincennes"},
683 {"usome", "America/Nome"},
684 {"usphx", "America/Phoenix"},
685 {"ussit", "America/Sitka"},
686 {"ustel", "America/Indiana/Tell_City"},
687 {"uswlz", "America/Indiana/Winamac"},
688 {"uswsq", "America/Indiana/Petersburg"},
689 {"usxul", "America/North_Dakota/Beulah"},
690 {"usyak", "America/Yakutat"},
691 {"utc", "Etc/GMT"},
692 {"utce01", "Etc/GMT-1"},
693 {"utce02", "Etc/GMT-2"},
694 {"utce03", "Etc/GMT-3"},
695 {"utce04", "Etc/GMT-4"},
696 {"utce05", "Etc/GMT-5"},
697 {"utce06", "Etc/GMT-6"},
698 {"utce07", "Etc/GMT-7"},
699 {"utce08", "Etc/GMT-8"},
700 {"utce09", "Etc/GMT-9"},
701 {"utce10", "Etc/GMT-10"},
702 {"utce11", "Etc/GMT-11"},
703 {"utce12", "Etc/GMT-12"},
704 {"utce13", "Etc/GMT-13"},
705 {"utce14", "Etc/GMT-14"},
706 {"utcw01", "Etc/GMT+1"},
707 {"utcw02", "Etc/GMT+2"},
708 {"utcw03", "Etc/GMT+3"},
709 {"utcw04", "Etc/GMT+4"},
710 {"utcw05", "Etc/GMT+5"},
711 {"utcw06", "Etc/GMT+6"},
712 {"utcw07", "Etc/GMT+7"},
713 {"utcw08", "Etc/GMT+8"},
714 {"utcw09", "Etc/GMT+9"},
715 {"utcw10", "Etc/GMT+10"},
716 {"utcw11", "Etc/GMT+11"},
717 {"utcw12", "Etc/GMT+12"},
718 {"uymvd", "America/Montevideo"},
719 {"uzskd", "Asia/Samarkand"},
720 {"uztas", "Asia/Tashkent"},
721 {"vavat", "Europe/Vatican"},
722 {"vcsvd", "America/St_Vincent"},
723 {"veccs", "America/Caracas"},
724 {"vgtov", "America/Tortola"},
725 {"vistt", "America/St_Thomas"},
726 {"vnsgn", "Asia/Saigon"},
727 {"vuvli", "Pacific/Efate"},
728 {"wfmau", "Pacific/Wallis"},
729 {"wsapw", "Pacific/Apia"},
730 {"yeade", "Asia/Aden"},
731 {"ytmam", "Indian/Mayotte"},
732 {"zajnb", "Africa/Johannesburg"},
733 {"zmlun", "Africa/Lusaka"},
734 {"zwhre", "Africa/Harare"},
735
736 };
737 }
738
739 @DataProvider(name="getLocalizedDateTimePattern")
740 Object[][] getLocalizedDateTimePattern() {
741 return new Object[][] {
742 // Locale, Expected pattern,
743 {Locale.US, FormatStyle.FULL, "EEEE, MMMM d, y 'at' h:mm:ss a zzzz"},
744 {Locale.US, FormatStyle.LONG, "MMMM d, y 'at' h:mm:ss a z"},
745 {Locale.US, FormatStyle.MEDIUM, "MMM d, y, h:mm:ss a"},
746 {Locale.US, FormatStyle.SHORT, "M/d/yy, h:mm a"},
747 {RG_GB, FormatStyle.FULL, "EEEE, d MMMM y 'at' HH:mm:ss zzzz"},
748 {RG_GB, FormatStyle.LONG, "d MMMM y 'at' HH:mm:ss z"},
749 {RG_GB, FormatStyle.MEDIUM, "d MMM y, HH:mm:ss"},
750 {RG_GB, FormatStyle.SHORT, "dd/MM/y, HH:mm"},
751 };
752 }
753
754 @DataProvider(name="getDisplayName")
755 Object[][] getDisplayName() {
756 return new Object[][] {
757 // Locale, field, Expected name,
758 {Locale.US, ChronoField.AMPM_OF_DAY, "AM/PM"},
759 {RG_GB, ChronoField.AMPM_OF_DAY, "am/pm"},
760 };
761 }
762
763 @Test(dataProvider="localizedBy")
764 public void test_localizedBy(Locale locale, Chronology chrono, ZoneId zone,
765 Chronology chronoExpected, ZoneId zoneExpected,
766 String formatExpected) {
767 DateTimeFormatter dtf =
768 DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.FULL)
769 .withChronology(chrono).withZone(zone).localizedBy(locale);
770 assertEquals(dtf.getChronology(), chronoExpected);
771 assertEquals(dtf.getZone(), zoneExpected);
772 String formatted = dtf.format(ZDT);
773 assertEquals(formatted, formatExpected);
774 assertEquals(dtf.parse(formatted, ZonedDateTime::from),
775 zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT);
776 }
777
778 @Test(dataProvider="withLocale")
779 public void test_withLocale(Locale locale, Chronology chrono, ZoneId zone,
780 Chronology chronoExpected, ZoneId zoneExpected,
781 String formatExpected) {
782 DateTimeFormatter dtf =
783 DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.FULL)
784 .withChronology(chrono).withZone(zone).withLocale(locale);
785 assertEquals(dtf.getChronology(), chronoExpected);
786 assertEquals(dtf.getZone(), zoneExpected);
787 String formatted = dtf.format(ZDT);
788 assertEquals(formatted, formatExpected);
789 assertEquals(dtf.parse(formatted, ZonedDateTime::from),
790 zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT);
791 }
792
793 @Test(dataProvider="firstDayOfWeek")
794 public void test_firstDayOfWeek(Locale locale, DayOfWeek dowExpected) {
795 DayOfWeek dow = WeekFields.of(locale).getFirstDayOfWeek();
796 assertEquals(dow, dowExpected);
797 }
812 assertEquals(dtf.getZone(), zoneExpected);
813 String formatted = dtf.format(ZDT);
814 assertEquals(formatted, formatExpected);
815 assertEquals(dtf.parse(formatted, ZonedDateTime::from),
816 zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT);
817 }
818
819 @Test(dataProvider="ofPattern")
820 public void test_toFormatter(Locale locale,
821 Chronology chronoExpected, ZoneId zoneExpected,
822 String formatExpected) {
823 DateTimeFormatter dtf =
824 new DateTimeFormatterBuilder().appendPattern(PATTERN).toFormatter(locale);
825 assertEquals(dtf.getChronology(), chronoExpected);
826 assertEquals(dtf.getZone(), zoneExpected);
827 String formatted = dtf.format(ZDT);
828 assertEquals(formatted, formatExpected);
829 assertEquals(dtf.parse(formatted, ZonedDateTime::from),
830 zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT);
831 }
832
833 @Test(dataProvider="shortTZID")
834 public void test_shortTZID(String shortID, String expectedZone) {
835 Locale l = Locale.forLanguageTag("en-US-u-tz-" + shortID);
836 DateTimeFormatter dtf =
837 DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.FULL)
838 .localizedBy(l);
839 assertEquals(dtf.getZone(), ZoneId.of(expectedZone));
840 }
841
842 @Test(dataProvider="getLocalizedDateTimePattern")
843 public void test_getLocalizedDateTimePattern(Locale l, FormatStyle s, String expectedPattern) {
844 DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder();
845 assertEquals(dtfb.getLocalizedDateTimePattern(s, s, IsoChronology.INSTANCE, l),
846 expectedPattern);
847 }
848
849 @Test(dataProvider="getDisplayName")
850 public void test_getDisplayName(Locale l, TemporalField f, String expectedName) {
851 assertEquals(f.getDisplayName(l), expectedName);
852 }
853 }
|