DateTime在转换为日期时显示不同的日期

时间:2015-09-08 05:27:34

标签: java datetime jodatime

我正在使用Java JODATIME DateTime。我的dateTime为2015-09-08T11:00:00.000Z,当我使用toDate()转换为日期。

我将日期对象作为Tue Sep 08 06:00:00 CDT 2015。

DateTime dateTime =  2015-09-08T11:00:00.000Z; // Not a string I am getting this date from another API.
Date date = dateTime.toDate(); //Tue Sep 08 06:00:00 CDT 2015.

我可以知道这里发生了什么事吗?

2 个答案:

答案 0 :(得分:1)

Date对象只保留自1970年1月1日UTC以来的毫秒数。它不包含表示逻辑,因此您的注释相当于早上6点CDT,表明某些内容(您的IDE或某些日期格式化程序)已应用时区以便将日期呈现为人类可读的形式。代码实际上正常工作。

答案 1 :(得分:1)

显然,您正在调用java.util.Date对象上的toString方法。该类的toString实现具有令人困惑的特性,即在生成字符串表示时,将JVM的当前默认时区静默应用于日期时间值。

java.util.Date对象本身没有时区,并且始终为UTC。

这是许多合理的避免这些旧的java.util.Date/.Calendar类之一。使用现在内置于Java 8及更高版本中的java.time。对于旧版Java,请使用Joda-Time

此外,在StackOverflow上已经多次解决了这个主题。请在发布前进行搜索。

java.time中的一小段示例代码。 InstantUTC中时间轴上的一个时刻。您的输入字符串恰好采用标准ISO 8601格式,java.time在解析/生成字符串时默认使用该格式。因此,您可以直接解析而无需指定解析模式。

String input = "2015-09-08T11:00:00.000Z";
Instant instant = Instant.parse( input );

Instant调整为特定时区以获得ZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

在StackOverflow.com上搜索更多java.time的例子。

实际上,java.util.Date的源代码中有一个时区,但出于实际目的而被忽略。