【问题标题】:Where is the official list of zone names for java.time?java.time 的官方区域名称列表在哪里?
【发布时间】:2022-01-07 15:28:46
【问题描述】:

是否有用于以下用途的区域名称的官方列表:

zoneId = ZoneId.of("America/New_York")

或者 java.time.ZoneId 是否可以生成我可以使用的列表本身?

我正在使用它来将 Instant 转换为时间的字符串表示形式,例如:

ZoneDateTime.ofInstant(instant, zoneId).format(DateTimeFormatter.ofPattern("..."))

【问题讨论】:

    标签: java java-time


    【解决方案1】:

    可以通过使用 Java ZoneId 或 TimeZone 类来获取此列表。

    ZoneId 类在这里定义:

    https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html

    以下代码将使用 ZoneId 类打印所有时区

    package com.javadb;
    
    import java.time.ZoneId;
    import java.util.TreeSet;
    
    /**
     * Displays available time zones (zoneIds)
     *
     * @author www.javadb.com
     */
    public class DisplayTimeZones {
    
        public static void main(String[] args) {
    
            TreeSet<String> sortedZones = new TreeSet<>(ZoneId.getAvailableZoneIds());
    
            System.out.println("Number of zones: " + sortedZones.size());
            System.out.println("");
    
            for (String zone : sortedZones) {
            System.out.println(zone);
           }
    
        //Or if you want to use functional operations
        /*
        sortedZones.stream().forEach((zone) -> {
            System.out.println(zone);
        });
        */
        } 
    }
    

    输出:

    Number of zones: 585
    
    Africa/Abidjan
    Africa/Accra
    Africa/Addis_Ababa
    Africa/Algiers
    ...
    

    使用Java TimeZone类java.util.TimeZone可以通过调用获取列表:

    TimeZone.getAvailableIDs()
    

    此外,如果使用 Joda-Time,Class DateTimeZone getAvailableIDs() 也可以使用。

    【讨论】:

    • 问题与 Joda-Time 无关,因此您应该在给定上下文中避免使用该术语(并且您的代码也不使用 Joda-Time)。意思是,您应该避免 Joda-Time 和 java.time-API 相同或相似的印象。他们真的很不一样。
    • @MenoHochschild - 谢谢,我的答案是一致的。
    【解决方案2】:

    只需使用getAvailableZoneIds 方法。

    获取一组可用的区域 ID。

    此集合包括所有可用的基于区域的 ID 的字符串形式。 返回集中不包含基于偏移量的区域 ID。身份证可以 传递给 of(String) 以创建 ZoneId。

    Set<String> zoneIds= ZoneId.getAvailableZoneIds();
    
    for (String zone : zoneIds) {
        System.out.println(zone);
    }
    

    【讨论】:

      【解决方案3】:

      是否有正式的区域名称列表用于 以下:

      不,Java 不维护任何官方的区域名称列表。它宁愿从 IANA 获取该信息。您还可以指定 JVM 以使用您的自定义区域名称信息文件来覆盖来自 IANA 的文件。

      JVM 从位于以下位置的名为tzdb.dat 的二进制文件加载时区信息:

      $JAVA_HOME\lib

      这个文件又是在安装 JRE 时从IANA 生成的。

      如果 IANA 出于某些原因更新了时区信息,并且您想要更新 JVM 的缓存副本 (tzdb.dat),您可以使用 JVM 提供的名为 tzupdater.jar 的实用程序来完成。或者,您也可以重新安装 JRE。

      最后,如果您不信任从 IANA 网站获得的 tzdb.dat 中的时区信息数据,您可以通过指定名为 java.time.zone.DefaultZoneRulesProvider 的系统属性来提供您的自定义时区信息文件。

      【讨论】:

      • ZoneId.getAvailableZoneIds() 可用。国际海事组织你的帖子似乎切线并解释了内部工作原理,与问题无关
      • @BojanPetkovic,getAvailableZoneIds 方法没有区域列表或没有维护。它只是一个吸气剂。再次阅读我的答案以查找列表的维护位置或方式。尽管有很多赞成票,但另一个答案是不够的。
      • 我确实明白你的意思,但我认为你对这个问题的解读有点过多。我读的是 ZoneId.of(XXX) 允许哪些值。我将删除反对票,因为它确实提供了一些正确的信息,只是问题不需要
      • 您的投票一经投出即被锁定。请在下次投下这样一个有用的答案之前保持礼貌。
      【解决方案4】:

      正如其他答案所说,在代码中获取此列表的方法是使用ZoneId.getAvailableZoneIds()

      但是,如果您只是浏览想要一个“官方”列表,则数据为available from IANA,但这是针对机器的格式。细读数据的最简单方法is on Wikipedia。 (通常免责声明维基百科是维基百科......)

      您还应该注意,最近对 IANA/Wikipedia 数据所做的更改可能不会出现在您的目标 JRE 中,如果它最近没有更新的话。

      【讨论】:

      • 赞成,因为您提供了其他答案中未提及的方式。所有其他答案都假定读者可以访问 JVM。
      【解决方案5】:

      我发现Gary Gregory 的这个在线区域 ID 列表非常有用。

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2012-01-05
      • 2010-12-23
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多