ZoneId.getAvailableZoneIds() 是 Java 8 提供的获取全部 IANA 时区 ID 的静态方法,返回按字母序排序的不可修改 Set;可配合 Stream 筛选(如 Asia/ 开头),其数据源自 JVM 内置 TZDB,更新需升级 JDK。

ZoneId.getAvailableZoneIds() 是 Java 8 引入的 java.time 包中获取系统支持的所有时区 ID 的标准方法,它返回一个 Set<string></string>,包含所有可用的 IANA 时区标识符(如 "Asia/Shanghai"、"Europe/London"、"America/New_York" 等)。
直接调用 getAvailableZoneIds() 获取全部时区
这是最简单的方式,无需额外依赖或配置:
- 方法是静态的,直接通过
ZoneId.class调用 - 返回的是不可修改的
Set,不能直接 add/remove - 结果按字符串自然排序(字母序),便于查看或搜索
示例代码:
Set<String> zoneIds = ZoneId.getAvailableZoneIds(); zoneIds.forEach(System.out::println); // 打印全部时区 ID
常见时区筛选技巧
全量列表通常超过 600 项,实际开发中常需过滤。可结合 Java Stream 或传统循环处理:
立即学习“Java免费学习笔记(深入)”;
- 查亚洲时区:
zoneIds.stream().filter(id -> id.startsWith("Asia/")) - 查中国相关:
.filter(id -> id.equals("Asia/Shanghai") || id.equals("Asia/Urumqi")) - 排除 UTC/GMT 类伪时区(如
"GMT"、"UTC")可加条件!id.equals("GMT") && !id.equals("UTC")
注意时区数据来源和更新机制
返回的时区列表取决于 JVM 内置的 时区数据库(TZDB)版本:
- Java 会自带一份 TZDB 数据(通常基于 IANA 发布的 tzdata),不同 JDK 版本内置版本不同
- 不随操作系统时区设置变化,也不读取系统 /usr/share/zoneinfo
- 如需最新时区规则(例如某国变更夏令时政策),需升级 JDK 或使用 tzdata 工具手动更新(较复杂,一般应用无需干预)
替代方案:获取常用时区快捷方式
如果只是需要几个主流时区,不必遍历全量集合:
-
ZoneId.of("Asia/Shanghai")—— 显式创建指定时区 -
ZoneId.systemDefault()—— 获取当前 JVM 默认时区 -
ZoneOffset.UTC、ZoneOffset.of("+08:00")—— 固定偏移,非地区性时区
这些方式更轻量,适合多数业务场景。


















