日期时区在查找“美国/蓬塔阿雷纳斯”位置的 ID 时遇到问题

Posted

技术标签:

【中文标题】日期时区在查找“美国/蓬塔阿雷纳斯”位置的 ID 时遇到问题【英文标题】:Date Time Zone is having issue with finding ID for the location "America/Punta_Arenas" 【发布时间】:2019-06-24 17:20:11 【问题描述】:

我在尝试获取位置“America/Punta_Arenas”的时区时遇到异常。我正在使用 joda LocalDateTime。

import org.joda.time.DateTime, DateTimeZone
val timezone = DateTimeZone.forID("America/Punta_Arenas")

所以上面的语句抛出了下面的异常

java.lang.IllegalArgumentException: The datetime zone id 'America/Punta_Arenas' is not recognised

有什么方法可以获取 America/Punta_Arenas 位置的时区吗?任何帮助表示赞赏。

【问题讨论】:

我无法复制。我在 Java 1.8.0_131 上使用 Joda-Time 2.9.9。您的代码创建了一个DateTimeZone 对象,该对象又打印为America/Punta_Arenas。您使用的是什么版本的 Joda-Time 和什么版本的 Java?也适用于 Java 1.7.0_79。 根据Joda-Time Available Time Zones America/Punta_Arenas 之前不包括在内。 Updating the time zone data 有一个程序。如果是我,我会先尝试更新到最新的 Joda-Time 版本。如果这没有帮助,我会尝试按照程序更新时区数据。 谢谢@OleV.V。我使用的是旧版本 2.8.1,现在我将其更新到 2.9.4 并解决了问题。 【参考方案1】:

乔达时间

Joda-Time 拥有自己的时区数据副本,称为tzdata。时区定义发生变化,因此该文件可能需要更新。

您还没有提到您使用的是哪个版本的 Joda-Time,如果可能,请先升级到最新版本,这样应该可以工作:

<!-- https://mvnrepository.com/artifact/joda-time/joda-time -->
<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.10.1</version>
</dependency> 

java.time

Joda-Time 项目现在处于维护模式。它的创建者 Stephen Colebourne 继续领导 JSR 310 及其实现,java.time,在 Java 8 及更高版本中发现。这是 Joda-Time 的正式继任者。

在 Java 的 java.time 包中,您会找到 ZoneId.of

ZoneId zoneId = ZoneId.of("America/Punta_Arenas");

ThreeTen-Backport

java.time 的大部分功能在 ThreeTen-Backport 项目中向后移植到 Java 6 和 7,这是另一个由 Stephen Colebourne 领导的项目。

在那里你会找到org.threeten.bp.ZoneId 类。

<!-- https://mvnrepository.com/artifact/org.threeten/threetenbp -->
<dependency>
    <groupId>org.threeten</groupId>
    <artifactId>threetenbp</artifactId>
    <version>1.3.8</version>
</dependency>

代码与上面相同,但导入不同:

import org.threeten.bp.ZoneId;
ZoneId zoneId = ZoneId.of("America/Punta_Arenas");

希望有帮助

【讨论】:

我使用的是 2.8.1。当我更新到 2.9.4 时问题得到解决。感谢您的快速回复。 没问题,很高兴它有帮助 仅供参考,您还会在主机操作系统、Postgres 等数据库引擎和各种软件库中找到 tzdata。如果您关心的任何时区发生变化,都需要更新。 感谢@BasilBourque 感谢您的意见。

以上是关于日期时区在查找“美国/蓬塔阿雷纳斯”位置的 ID 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

在带有/不带时区的日期或时间戳的查询中处理 generate_series()

PHP,Codeigniter:如何在Web应用程序中根据用户时区/位置设置日期/时间?

按时区(BST/GMT、CET/CEST 等)查找下一个夏令时日期

Logstash:如何在日期过滤器模式中匹配时区 ID“CET”?

什么是时区?时区与日期有什么关系?

Java日期时间API系列20-----Jdk8中java.time包中的新的日期时间API类,ZoneId时区ID大全等。