如何使用 Java ZoneId 的语言环境?

How to use locale for Java ZoneId?

提问人:Barry Tone 提问时间:10/25/2023 更新时间:10/25/2023 访问量:71

问:

将我的日期翻译成其他语言时遇到问题。它现在的显示方式是 .我的问题是,如果我将我的语言环境交换为zh_TW,它会显示为 .h:mm:ss a VV下午11:59 Asia/Shanghai

我也想将部分翻译成正确的区域设置。我该怎么做?Asia/Shanghai

我试过使用,但区域 ID (VV) 部分仅以英文显示。DateTimeFormatter.ofPattern("h:mm:ss a VV", locale)

java datetime time, datetime time-format zoneid

评论

0赞 deHaar 10/25/2023
预期输出是多少?是这样的吗?6:58:51 下午 中国时间
0赞 Barry Tone 10/25/2023
我不确定翻译会是什么,但我希望在我传递语言环境时会翻译它
0赞 Barry Tone 10/25/2023
@deHaar这个区域 ID 组件不可翻译?另外,我认为是简化的,所以它不适合zh_TW中国时间
0赞 deHaar 10/25/2023
我不认为这是意料之中的......我得到的翻译是ZoneId.of("Asia/Shanghai").getDisplayName(TextStyle.FULL_STANDALONE, Locale.CHINESE);
1赞 Sweeper 10/25/2023
@deHaar 中没有国家。如果你使用 ,它确实会产生繁体中文。Locale.CHINESEnew Locale("zh", "tw")

答:

1赞 Gestankbratwurst 10/25/2023 #1

您在这里的问题是“V”解析了时区 id,它并不意味着被翻译为简单的文本。尝试使用由小写字母定义的 timezone-name。这可以使用现在的区域设置进行翻译。z

评论

1赞 Barry Tone 10/25/2023
timezone-name 是太平洋标准时间等等,对吧?不幸的是,它对我不起作用,我的输出需要是Region/(City or Country)
0赞 Sweeper 10/25/2023
@BarryTone嗯,这就是你真正想要的吗?这是不可能的 - 据我所知,CLDR 中没有这样的本地化“区域 ID”列表。
0赞 Barry Tone 10/25/2023
@Sweeper是的,我的问题实际上源于巴林的一个客户。在 IANA 中,它们的时区名称为 。但客户说这是错误的,他们想要一个展示,例如或任何带有他们国家名称的东西。AST or Arabic Standard TimeAsia/Bahrain
3赞 Sweeper 10/25/2023 #2

我的输出需要是区域/(城市或国家)

时区 ID 中的两个部分不应单独翻译。Asia/Shanghai

但是,您可以获得时区的“示例城市”。这是 CLDR 记录的众多内容之一。我不知道用于获取示例城市的标准 Java API,但您可以使用 CLDR 引擎库 (Maven)。

假设我想找到一个本地化的典型城市。Asia/Shanghaiar-BH

var cldr = CLDR.get("ar-BH");
System.out.println(cldr.Schema.TimeZones.exemplarCity.get(cldr.General.bundle(), "Asia/Shanghai"));

输出:

شنغهاي 

如果您还需要大陆的本地化名称(中的“亚洲”),则可以使用 。Asia/ShanghaigetRegionDisplayName

System.out.println(cldr.General.getRegionDisplayName("142", DisplayNameOptions.build()));

请注意,我通过了“142”,这显然是亚洲的联合国 M49 ID。请参阅此处的可用 ID 列表。在 IANA 区域名称之前,只有少量部件选项。维护从“亚洲”到“142”、“欧洲”到“150”等的映射应该不会太难。/

评论

0赞 VGR 10/25/2023
我不知道有 Java 的 CLDR 库。我可能不得不更新我的这个答案