gpt4 book ai didi

解析 DateFormat 时的 Java 时区

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:51:46 24 4
gpt4 key购买 nike

我有如下解析日期的代码:

String ALT_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
SimpleDateFormat sdf = new SimpleDateFormat(
ALT_DATE_TIME_FORMAT);
Date date = sdf.parse(requiredTimeStamp);

它工作正常,突然,它停止工作了。事实证明,管理员在服务器上进行了一些配置更改,当前返回的日期为“2010-12-27T10:50:44.000-08:00”,上述模式无法对其进行解析。我有两个问题:

首先是什么模式将解析 JVM 以上述格式返回的日期(具体来说,只是“-08:00”作为时区)?其次,在 linux RHEL 5 服务器上究竟应该在哪里更改此类设置,以便我们知道将来会发生此类更改?

最佳答案

tl;dr

OffsetDateTime.parse( "2010-12-27T10:50:44.000-08:00" )

ISO 8601

输入字符串格式在 ISO 8601 中定义标准,一系列日期时间格式。

避免使用旧的日期时间类

问题和其他答案使用与最早版本的 Java 捆绑在一起的旧的过时日期时间类。避开他们。现在被 java.time 类取代。

使用java.time

您的输入字符串以 offset-from-UTC 结尾.所以我们解析为 OffsetDateTime对象。

java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。因此无需指定格式模式。

OffsetDateTime odt = OffsetDateTime.parse( "2010-12-27T10:50:44.000-08:00" );

如果您想将此日期时间值视为 UTC 时间轴上的一个时刻,请提取一个 Instant

Instant instant = odt.toInstant();

时区是一个偏移量加上一组处理异常的规则,例如夏令时 (DST)。如果您有一个时区,请应用 ZoneId 来获取 ZonedDateTime 对象。时间轴上的同一时刻,但通过不同的方式查看 wall-clock time .

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = odt.atZoneSameInstant( z ); // Same moment on the timeline, but viewed through a different wall-clock time.


关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

您可以直接与您的数据库交换java.time 对象。使用JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于解析 DateFormat 时的 Java 时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4542679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com