解析DateFormat时的Java时区

shi*_*ter 10 java timezone datetime iso8601 date-format

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

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);
Run Code Online (Sandbox Code Playgroud)

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

第一个是什么模式将以上述格式解析JVM返回的日期(具体来说,只是'-08:00'作为时区)?第二,在Linux RHEL 5服务器上究竟会改变这样的设置,以便我们在将来意识到这些变化?

Bas*_*que 11

TL;博士

OffsetDateTime.parse( "2010-12-27T10:50:44.000-08:00" )
Run Code Online (Sandbox Code Playgroud)

ISO 8601

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

避免旧的日期时间类

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

使用java.time

您的输入字符串以与UTC偏移量结束.所以我们解析为一个OffsetDateTime对象.

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

OffsetDateTime odt = OffsetDateTime.parse( "2010-12-27T10:50:44.000-08:00" );
Run Code Online (Sandbox Code Playgroud)

如果要在UTC时间轴上查看此日期时间值,请提取Instant.

Instant instant = odt.toInstant();
Run Code Online (Sandbox Code Playgroud)

时区是偏移量加上一组用于处理诸如夏令时(DST)等异常的规则.如果您有时区,请应用a ZoneId来获取ZonedDateTime对象.时间轴上的相同时刻,但通过不同的挂钟时间查看.

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

关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC驱动程序.不需要字符串,不需要课程.java.sql.*

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.


Ara*_*ram 4

另一个应用程序使用 ISO 8601 日期时间格式。我假设其他应用程序正在向您发送符合 XML Schema 的 dateTime 类型(即 ISO 8601)的 XML 响应。现在,众所周知,DateFormat 无法解析此格式。您必须使用其他库,例如 joda-time (joda-time 是获胜者)或其他响应中指定的 FastDateFormat。看看这篇文章Converting ISO 8601-driven String to java.util.Date