java.time的官方区域名称列表在哪里?

Bla*_*man 2 java java-time

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

zoneId = ZoneId.of("America/New_York")
Run Code Online (Sandbox Code Playgroud)

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

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

ZoneDateTime.ofInstant(instant, zoneId).format(DateTimeFormatter.ofPattern("..."))
Run Code Online (Sandbox Code Playgroud)

VHS*_*VHS 11

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

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

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

$JAVA_HOME\lib

该文件又是在IANA安装 JRE 时生成的。

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

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

  • @BojanPetkovic,“getAvailableZoneIds”方法没有区域列表或不维护区域列表。它只是一个吸气剂。再次阅读我的答案,了解该列表的维护位置或方式。尽管有这么多赞成票,但另一个答案仍然不够。 (4认同)
  • 您的投票一旦投票即被锁定。下次在对这样有用的答案投反对票之前请保持礼貌。 (2认同)

Kip*_*Kip 9

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

但是,如果您只是浏览想要“官方”列表,则可以从 IANA获得数据,但这是一种适用于机器的格式。阅读数据的最简单方法是在 Wikipedia 上。(通常免责声明维基百科是维基百科......)

您还应该注意,如果最近未更新,则 IANA/Wikipedia 数据的最近更改可能不会出现在您的目标 JRE 中。

  • 赞成,因为您提供了其他答案中未提及的方法。所有其他答案都假定读者可以访问 JVM。 (5认同)

Arn*_*aud 8

只需使用getAvailableZoneIds方法即可.

获取可用区域ID的集合.

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

Set<String> zoneIds= ZoneId.getAvailableZoneIds();

for (String zone : zoneIds) {
    System.out.println(zone);
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*e S 4

可以通过使用 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);
    });
    */
    } 
}
Run Code Online (Sandbox Code Playgroud)

输出:

Number of zones: 585

Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
...
Run Code Online (Sandbox Code Playgroud)

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

TimeZone.getAvailableIDs()
Run Code Online (Sandbox Code Playgroud)

另外,如果使用 Joda-Time,DateTimeZone 类getAvailableIDs() 也可以工作。

  • 问题与 Joda-Time 无关,因此您应该在给定上下文中避免使用该术语(并且您的代码也不使用 Joda-Time)。这意味着,您应该避免产生 Joda-Time 和 java.time-API 相同或相似的印象。他们真的很不同。 (3认同)