【问题标题】:Localized name of ZoneId's IDZoneId ID 的本地化名称
【发布时间】:2018-04-14 17:18:03
【问题描述】:

我有一个希望用户从中选择的时区列表。所以,我想我可以打电话给java.time.ZoneId.getAvailableZoneIds() 并在他们身上使用getDisplayName 方法。这会导致很多重复的条目,例如

中欧时间

即使我添加了时区偏移,它们也不是唯一的。但是,ZoneId 的 ID 可以区分条目,但我如何才能本地化它们? ID 始终是英文的,例如

欧洲/罗马

【问题讨论】:

  • 我怀疑你能做到。它们应该是唯一标识符。
  • @shmosel,您知道如何选择适合用户语言的时区吗?

标签: java java-8 timezone


【解决方案1】:

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

ZoneId.getAvailableZoneIds().stream()
        .map(ZoneId::of)
        .map(zid -> zid.getDisplayName(TextStyle.FULL, Locale.GERMAN))
        .distinct()
        .forEach(System.out::println);

注意TextStyle 参数以更改每个区域标题的大小,并注意.distinct() 方法以获得独特的结果。

【讨论】:

  • 是的,我可以这样做,但这真的允许用户选择正确的时区吗?我的意思是,对于具有相同显示名称的时区,偏移量是否始终相同?
  • @SteffenHarbich 是的时区名称允许选择正确的时区。但是,如果遵守夏令时,则偏移量每年会更改两次。这就是为什么你need a date/instant to convert ZoneId to ZoneOffset
  • 是的,您仍然需要决定如何处理在您的语言中转换为相同显示名称的ZoneIds。我在想一种选择是在每个之后添加 ID,例如“中欧时间 - 欧洲/罗马”和“中欧时间 - 欧洲/奥斯陆”。不是最漂亮的解决方案,但我认为它应该可供用户导航。
  • @OleV.V.这是一个选项,但是您在语言上有所不同。因此,如果您的用户是德国人,那么将显示诸如“Zentraleuropäische Zeit - Europe/Rome”之类的项目,将德语和英语区域 ID 混合在一起。
  • 我发现语言环境支持有限。例如:ZoneId.of("Asia/Tokyo").getDisplayName(TextStyle.FULL, Locale.forLanguageTag("jp")) 产生“日本时间”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多