Java ZoneId'的本地化名称;身份证

Java ZoneId'的本地化名称;身份证,java,java-8,timezone,Java,Java 8,Timezone,我有一个时区列表,希望用户从中进行选择。因此,我想我可以调用java.time.ZoneId.getAvailableZoneIds()并对它们使用getDisplayName方法。这会导致大量重复条目,如 中欧时间 即使我加上时区偏移,它们也不是unqiue。但是,ZoneId的ID可以区分条目,但是如何将它们本地化?ID总是用英语,就像 欧洲/罗马 通过在ZoneId实例上调用getDisplayName,可以获得显示名称的本地化版本。这将需要对getAvailableZoneIds()的结

我有一个时区列表,希望用户从中进行选择。因此,我想我可以调用
java.time.ZoneId.getAvailableZoneIds()
并对它们使用
getDisplayName
方法。这会导致大量重复条目,如

中欧时间

即使我加上时区偏移,它们也不是unqiue。但是,
ZoneId
的ID可以区分条目,但是如何将它们本地化?ID总是用英语,就像

欧洲/罗马


通过在
ZoneId
实例上调用
getDisplayName
,可以获得显示名称的本地化版本。这将需要对
getAvailableZoneIds()的结果进行迭代:


请注意
TextStyle
参数可以更改每个区域标题的大小,而
.distinct()
方法可以获得唯一的结果。

我怀疑您是否可以。它们应该是唯一的标识符。@shmosel,你知道如何选择适合用户语言的时区吗?是的,我可以这样做,但这真的允许用户选择正确的时区吗?我的意思是,对于具有相同显示名称的时区,偏移量是否始终相同?@SteffenHarbich Yes timezone name允许选择正确的时区。但是,如果遵守夏时制,偏移量每年变化两次。这就是为什么您是的,您仍然需要决定如何处理在语言中转换为相同显示名称的
ZoneId
s。我在想一个选择是在每个选项后面添加ID,例如“中欧时间-欧洲/罗马”和“中欧时间-欧洲/奥斯陆”。这不是最漂亮的解决方案,但我认为它应该是用户可以浏览的。@OleV.V。这是一个选择,但你在语言上有差异。因此,如果您的用户是德国人,则会显示“Zeit-Zeit-Europe/Rome”之类的项目,将德语和英语区域ID混合在一起。我发现对区域设置的支持是有限的。例如:
ZoneId.of(“亚洲/东京”).getDisplayName(TextStyle.FULL,Locale.forLanguageTag(“jp”)
生成“日本时间”
ZoneId.getAvailableZoneIds().stream()
        .map(ZoneId::of)
        .map(zid -> zid.getDisplayName(TextStyle.FULL, Locale.GERMAN))
        .distinct()
        .forEach(System.out::println);