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