是否有正式的区域名称列表用于以下内容:
zoneId = ZoneId.of("America/New_York")
或者java.time.ZoneId是否可以生成我可以使用的列表本身?
我使用它将Instant转换为时间的字符串表示形式,如:
ZoneDateTime.ofInstant(instant, zoneId).format(DateTimeFormatter.ofPattern("..."))
答案 0 :(得分:8)
只需使用getAvailableZoneIds方法。
获取可用区域ID的集合。
此集包括所有可用的基于区域的ID的字符串形式。 基于偏移的区域ID不包含在返回的集合中。身份证可以 传递给(String)以创建ZoneId。
Set<String> zoneIds= ZoneId.getAvailableZoneIds();
for (String zone : zoneIds) {
System.out.println(zone);
}
答案 1 :(得分:2)
是否有正式的区域名称列表用于 以下内容:
不,Java没有维护任何正式的区域名称列表。它宁愿从IANA获取该信息。您还可以指定JVM以使用您的自定义区域名称信息文件来覆盖IANA中的文件。
JVM从名为tzdb.dat
的二进制文件加载时区信息,该文件位于以下位置:
$JAVA_HOME\lib
此文件依次是从IANA安装JRE时生成的。
如果IANA出于某些原因更新了时区信息,并且您想要更新JVM的缓存副本(tzdb.dat),则可以使用名为tzupdater.jar
的JVM实用程序来实现。或者,您也可以重新安装JRE。
最后,如果您不信任从IANA网站获取的tzdb.dat中的时区信息数据,则可以通过指定名为{{1的系统属性来提供自定义时区信息文件}}
答案 2 :(得分:1)
可以通过使用Java ZoneId或TimeZone类来获取此列表。
此处定义了ZoneId类:
https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html
以下代码将使用ZoneId Class
打印所有时区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,类DateTimeZone getAvailableIDs()
也可以使用。
答案 3 :(得分:1)
正如其他答案所说,在代码中获取此列表的方法是使用ZoneId.getAvailableZoneIds()
。
但是,如果您只想浏览一个“正式”列表,则数据为available from IANA,但这是用于计算机的格式。细读数据is on Wikipedia的最简单方法。 (通常免责声明Wikipedia是Wikipedia ...)
您还应该注意,如果目标JRE最近没有更新,则对IANA / Wikipedia数据的最新更改可能不会出现。