JDK-8236548 : Localized time zone name inconsistency between English and other locales
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.util:i18n
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • Submitted: 2019-12-26
  • Updated: 2020-12-07
  • Resolved: 2020-02-12
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 11 JDK 13 JDK 15
11.0.9Fixed 13.0.6Fixed 15 b10Fixed
Related Reports
CSR :  
Sub Tasks
JDK-8238914 :  
I have 2 concerns about CLDR Timezone translated data

1. Translation inconsistency
   It seems translated materials may not be up to date.
C locale's output said "Hawaii Standard Time"
$ TZ=US/Hawaii LANG=C ~/jdk-14/bin/java tztest.java
2019.12.25 21:08:09 HST Hawaii Standard Time

Japanese output said like "Hawaii-Aleutian Standard Time"
$ TZ=US/Hawaii LANG=ja_JP.UTF-8 ~/jdk-14/bin/java tztest.java
2019.12.25 21:08:15 HST \u30cf\u30ef\u30a4\u30fb\u30a2\u30ea\u30e5\u30fc\u30b7\u30e3\u30f3\u6a19\u6e96\u6642

The contents of English file and the Japanese file are not consistent.
The English file is newer than Japenase translation base file.

Also following timezones may have same kind of issue because only en* locales are not same as the others.
SystemV/YST9: [AKST: 665, GAMT: 108]
Asia/Qostanay: [ALMT: 108, QOST: 665]
Asia/Oral: [AQTT: 108, ORAT: 665]
Asia/Qyzylorda: [AQTT: 108, QYZT: 665]

2. Translated Timezone short name may not be invalid or unexpected

But too many translated Timezone short names are there on CLDR
$ LANG=C ~/jdk-14/bin/java tzdump1.java
Note: tzdump1.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
US/Hawaii: [HAST: 11, HST: 758, Honolulunormaltid: 4]
$ LANG=C ~/jdk-14/bin/java tzdump2.java US/Hawaii
Note: tzdump2.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
US/Hawaii: HAST(11) [nb_SJ, no, zh_TW, nb_NO, no_NO, zh_MO_#Hant, nb, zh_HK_#Hant, zh__#Hant, zh_TW_#Hant, zh_HK]
US/Hawaii: HST(758) [, nds, ti_ET, ta_SG, lv, en_NU, zh_SG_#Hans, en_JM, kkj, es_BO, dz_BT, dsb_DE, en_LR, ar_TD, cs, el, af, ff_MR_#Latn, sw_UG, smn, tk_TM, sr_ME_#Cyrl, ar_EG, dsb, yo_NG, se_NO, khq, vo_001, en_PW, pl_PL, sr_CS, ne_IN, ji, ar_EH, bs_BA_#Latn, nds_DE, es_US, en_US_POSIX, pt_MO, zh__#Hans, lb_LU, so_KE, dje_NE, ff_GH_#Latn, fr_PM, ar_KM, no_NO_NY, agq_CM, teo, tr_TR, eu, ar_MR, es_DO, ru, az, fa, kl_GL, en_NR, nd, kk, hy, en_AU, en_CY, ti_ER, nus_SS, en_RW, ksb, luo, lb, ln_CD, nnh_CM, ar_IL, mgh, or_IN, az__#Latn, ta, lag, ar_SY, ksf_CM, bo, tt_RU, om_KE, en_AS, fr_VU, kln, pt_MZ, fr_NE, ksb_TZ, en_JE, ln_CF, en_CX, en_AT, gl, sr__#Cyrl, yue_CN_#Hans, kn_IN, ga, qu, en_TZ, en_PR, mua, jv, in, ps, sn, km, zgh, fr_NC, es, gd_GB, jgo, fr_CM, gsw, pa_IN_#Guru, teo_UG, ceb, en_NL, ln_CG, te, sl, el_CY, mr_IN, ha, ku_TR, lrc_IR, gsw_FR, es_HN, hu_HU, ff_SN, sbp, sq_MK, sr_BA_#Cyrl, et_EE, sw, fy_NL, ar_OM, tr_CY, nmg, uz_UZ_#Latn, dua_CM, de_IT, lrc_IQ, vai__#Vaii, fr_TN, sr_RS, de_CH, fr_PF, gu, pt_GQ, vun_TZ, jmc_TZ, en_TV, lo, en_PN, cu_RU, zh_HK_#Hans, nl_NL, en_GY, bs__#Latn, dyo_SN, os, nl_CW, ar_DZ, pt_CH, fr_GQ, am, en_NG, fr_CI, ki_KE, ia_001, en_PK, zh_CN, en_LC, rw, brx_IN, iw, gv_IM, mk_MK, en_TT, dav, sl_SI, ses, xh_ZA, fr_BE, jgo_CM, es_VE, mg, mr, mer_KE, en_BM, seh, kea_CV, mgo, vi_VN, en_US, mfe_MU, fr_BF, pa__#Guru, it_SM, fr_YT, gu_IN, ff_CM_#Latn, ast, fi_FI, yue__#Hans, ca_FR, sr_BA_#Latn, fr_DJ, ha_GH, de_BE, ff_GW_#Latn, cgg, nyn_UG, ms_MY, ta_LK, ksf, cy, ceb_PH, sq, fr, tg_TJ, qu_PE, de, es_EC, lg_UG, ff_NE_#Latn, zu_ZA, cgg_UG, ksh_DE, lg, ru_RU, en_DM, sd, ga_IE, en_BI, en_WS, fr_LU, so, mi_NZ, ar_ER, kab, nus, sn_ZW, prg, iw_IL, es_EA, ga_GB, th_TH_TH_#u-nu-thai, hi, fr_SC, en_SL, ff_NG_#Latn, en_SH, vai, de_LU, mi, mt, de_DE, en_DK, yav, so_DJ, lt_LT, kam, ro, eo_001, ps_PK, ee, en_UM, en_SI, vai_LR_#Vaii, lo_LA, chr, ar_LB, af_ZA, in_ID, es_BZ, ar_AE, hr_HR, as, rof_TZ, it, ks_IN, my_MM, ur_PK, mn_MN, da_DK, en_FM, en_BE, ii, fr_WF, mzn_IR, naq, en_SG, kln_KE, tzm, ff_GM_#Latn, fur, om, bez_TZ, ff_GN_#Latn, en_SD, ja_JP_JP_#u-ca-japanese, es_SV, pt_BR, ml_IN, en_FK, is_IS, en_DG, hr, pt_ST, ak_GH, lt, uz_AF_#Arab, ccp, en_SE, zh_CN_#Hans, es_419, en, guz_KE, gsw_LI, ccp_BD, es_IC, ca, ar_TN, bm_ML, kw_GB, ug_CN, es_BR, khq_ML, en_SB, rw_RW, chr_US, shi_MA_#Tfng, ar_IQ, nyn, mk, en_DE, pa__#Arab, bs, ro_MD, en_FI, fy, th, dav_KE, en_SC, en_UG, en_NZ, dje, es_UY, mas_KE, ru_UA, sg_CF, en_FJ, de_LI, en_BB, smn_FI, hr_BA, de_AT, lu_CD, ar_001, so_SO, lv_LV, ckb, ar_KW, sr_RS_#Cyrl, bem, da, wae, en_LS, ig, en_HK, ce_RU, ka_GE, sw_TZ, fr_RW, mg_MG, cu, os_RU, sr_RS_#Latn, ky_KG, ki, kok, ewo, nn, ar_JO, bg, kea, zu, am_ET, fr_DZ, bo_CN, hsb, qu_EC, en_MS, en_GG, vo, sr_ME, mer, sah, en_ZM, fr_ML, br, ha_NG, ar_SA, fa_AF, sk, os_GE, ml, en_MT, en_GH, en_IL, tzm_MA, ses_ML, lkt_US, vai_LR_#Latn, ji_001, ku, sw_CD, fil_PH, it_VA, es_PH, es_ES, es_CO, bg_BG, en_VC, agq, hsb_DE, en_150, ar_SD, en_KN, ha_NE, ebu, ro_RO, sr_ME_#Latn, es_GT, ff_LR_#Latn, bas_CM, fr_MG, es_CL, mn, kam_KE, fa_IR, en_MO, wo, shi__#Tfng, en_BZ, sq_AL, twq_NE, nmg_CM, az__#Cyrl, en_MP, en_GD, tk, shi__#Latn, en_BW, kab_DZ, kde_TZ, ta_MY, nd_ZW, ne, en_IE, zh_SG, en_KI, om_ET, ja_JP, my, ka, fr_MF, shi, kl, en_SZ, rwk_TZ, zh, es_PE, mgh_MZ, saq, en_GB, kk_KZ, es_PA, ar_PS, bez, fr_MC, kw, vai__#Latn, ksh, ur_IN, ln, gsw_CH, luy_KE, pt, kkj_CM, es_GQ, ar_YE, to, en_SX, ru_KZ, et, ko_KP, nl_SR, rof, en_BS, be, gv, dua, nl_BQ, uz_UZ_#Cyrl, en_KE, guz, mfe, asa_TZ, ja, fr_SN, or, brx, fr_MA, pt_LU, fr_BL, mgo_CM, ko_KR, es_MX, fi, uz, bs__#Cyrl, sr__#Latn, en_SS, bo_IN, rm, en_MG, fr_BI, bn, kn, bn_BD, nnh, en_ZA, fr_FR, en_MH, fr_BJ, sah_RU, ps_AF, ky, mas, bs_BA_#Cyrl, sk_SK, xh, wo_SN, fr_HT, te_IN, nl_SX, lrc, ce, fr_CG, mt_MT, ko, nds_NL, ak, kde, dz, en_VU, ia, to_TO, ff_SL_#Latn, seh_MZ, ii_CN, pa_PK_#Arab, fr_RE, bn_IN, fr_GP, pa, zgh_MA, uk_UA, rn, tg, rwk, hu, fr_CH, en_NF, twq, sr_XK_#Cyrl, bm, ar_SS, en_GU, nl_AW, en_AI, en_CM, xog_UG, cs_CZ, tr, ca_ES, rm_CH, ru_MD, ff_SN_#Latn, en_TO, en_PG, fr_CF, pt_TL, en_ER, sr_BA, es_PY, kok_IN, fr_TG, sr_XK_#Latn, en_PH, ig_NG, fr_GN, prg_001, zh_MO_#Hans, se_FI, ff, en_CK, ar_MA, en_AG, fr_TD, ebu_KE, bem_ZM, xog, ewo_CM, fr_CD, rn_BI, en_NA, ms, ug, ca_IT, lag_TZ, teo_KE, ca_AD, qu_BO, haw_US, vi, fr_CA, sq_XK, dyo, en_KY, it_CH, si_LK, luo_KE, en_AE, it_IT, eo, ar_SO, en_ZW, nn_NO, fr_MU, pl, se_SE, en_TK, mua_CM, ur, uz__#Arab, saq_KE, se, pt_GW, ms_SG, ee_TG, ln_AO, be_BY, yue__#Hant, luy, pt_CV, uk, es_PR, wae_CH, mzn, tt, ru_BY, fo_DK, ee_GH, ar_BH, hi_IN, en_CH, asa, yo_BJ, fo_FO, ast_ES, fr_KM, fr_MQ, es_AR, ff__#Latn, en_MY, sbp_TZ, fil, uz__#Cyrl, yue_HK_#Hant, hy_AM, en_GM, fo, ne_NP, fur_IT, ta_IN, fr_GF, lkt, is, si, pt_AO, en_001, jv_ID, ru_KG, fr_MR, ks, ff_BF_#Latn, as_IN, sw_KE, th_TH, yue, jmc, en_MW, naq_NA, en_IO, ar_QA, en_CC, pt_PT, az_AZ_#Cyrl, ckb_IQ, shi_MA_#Latn, es_CU, ar, en_VI, haw, eu_ES, bas, el_GR, yav_CM, uz__#Latn, sg, da_GL, km_KH, ckb_IR, nl, ca_ES_VALENCIA, es_CR, fr_GA, sr, ar_LY, en_MU, gl_ES, en_IM, az_AZ_#Latn, en_GI, en_CA, gd, fr_SY, so_ET, nl_BE, ar_DJ, cy_GB, en_VG, en_TC, af_NA, vun, en_IN, lu, yo, es_NI, sd_PK, mas_TZ, ti, ms_BN, ccp_IN, br_FR]
US/Hawaii: Honolulunormaltid(4) [sv_SE, sv, sv_FI, sv_AX]

It seems translated materials may not be up to date, but "Honolulunormaltid" is short name
"Honolulunormaltid" was in make/data/cldr/common/main/sv.xml
Fix request (13u) I'd like to downport it, too, as the change is in both 15 and 11. The patch doesn't require adaptation other than related to context copyright date. CSR requested in JDK-8257501

Fix request (11u) -- will label after testing completed. I would like to downport this for parity with 11.0.9-oracle. This is fixed by the same change as JDK-8234347. It needed trivial resolves: http://mail.openjdk.java.net/pipermail/jdk-updates-dev/2020-July/003440.html I requrested the CSR.

Naoto. Thank you for the detailed explanation.

I haven't checked the locale data for each locale, but I believe they are the expected results. The fallback implementation first looks for the entry in CLDR. If there is an array of tz names for the locale, then use it (and look for parent locale's resources if some of the elements are missing). However, if there is no array for the locale, it will look for COMPAT's resources. Thus there are variants in short names for "US/Hawaii" time zone. For others, such as "Asia/Qostanay", there's no translations in CLDR, thus it uses the COMPAT's names.

Naoto. I'd like to confirm following output was expected one for this issue ? $ LANG=C ~/jdk-15/bin/java tzdump1a.java US/Hawaii SystemV/YST9 Asia/Qostanay Asia/Oral Asia/Qyzylorda ... US/Hawaii: [GMT-10:00: 97, HAST: 11, HST: 661, Honolulunormaltid: 4] SystemV/YST9: [AKST: 773] Asia/Qostanay: [QOST: 773] Asia/Oral: [ORAT: 773] Asia/Qyzylorda: [QYZT: 773] $ And your fix does not affect to "Translated Timezone short name" issue, right ?

URL: https://hg.openjdk.java.net/jdk/jdk/rev/10e939d362fc User: naoto Date: 2020-02-12 16:25:51 +0000

In fact, this specific US/Hawaii case is not runtime dependent. The English time zone names in the resource bundle are different. Here is the breakdown of the difference. - "US/Hawaii" is canonicalized to "Pacific/Honolulu" zone id. - It belongs to "Hawaii_Aleutian" meta zone. - In CLDR's resources, "Pacific/Honolulu" zone has the following names: <zone type="Pacific/Honolulu"> <short> <generic>HST</generic> <standard>HST</standard> <daylight>HDT</daylight> </short> </zone> - OTOH, "Hawaii_Aleutian" meta zone has the following: <metazone type="Hawaii_Aleutian"> <long> <generic>Hawaii-Aleutian Time</generic> <standard>Hawaii-Aleutian Standard Time</standard> <daylight>Hawaii-Aleutian Daylight Time</daylight> </long> <short> <generic>HAT</generic> <standard>HAST</standard> <daylight>HADT</daylight> </short> </metazone> - It reads that "Pacific/Honolulu" has SHORT names only, i.e., HST/HDT, and LONG names are inherited from its meta zone, "Hawaii_Aleutian", i.e., "Hawaii-Aleutian Standard Time"/"Hawaii-Aleutian Daylight Time". - The existing logic in the JDK is, if there is some empty slot in the names, then they are retrieved from COMPAT's English names. In this case, COMPAT has: {"Pacific/Honolulu", HST}, String HST[] = new String[] {"Hawaii Standard Time", "HST", "Hawaii Daylight Time", "HDT", "Hawaii Time", "HT"}; Thus the missing LONG names are substituted with "Hawaii Standard Time"/"Hawaii Daylight Time".

First issue is due to the discrepancy coming from treating English locale and others differently. English names are pre-filled at build time, but localized names for other locales are composed at run time. To keep consistency, it is desired to remove the pre-filled English names. For the second issue, this is working as expected. Some names (e.g., HAST) are coming from COMPAT provider for the locales that CLDR does not support. I changed the bug title referring only to the first issue.

Thanks, I'll do that.

Assigned JDK-8237641 to self. From the next time you can assign similar issues to me under core-libs/java.util:i18n, and I will triage whether it's a translation issue or CLDR converter issue.

Yes. Since this is not a simple translation matter, it should be fixed in CLDRConverter.

Naoto, could you check JDK-8237641 also ? It's also CLDR related issue.

Naoto, could you handle this issue ? Please let me know if you have further question.

Thanks, Leo. Waiting for your notification.

I'm working on the update of TimeZoneNames translation currently, so pls don't rush to fix something. Will update the bug url here once I create it.

Please re-assign if this is not for you [~itakiguchi]