Joda time的DateTime转换为java.util.Date奇怪的问题

时间:2012-02-29 17:26:50

标签: java jodatime

我遇到了一个奇怪的问题。以下是描述它的代码片段:

DateTimeZone dtz = DateTimeZone.forOffsetHours(0);

DateTime dt = new DateTime(dtz);

System.out.println(dt);
System.out.println(dt.toDate());

输出是:

2012-02-29T17:24:39.055Z
Wed Feb 29 19:24:39 EET 2012

我找到UTC + 2,但是这个动作应该创建一个java.util.Date对象,该对象初始化为UTC时间。我错过了什么?

3 个答案:

答案 0 :(得分:20)

Date根本不知道关于某个时区 - 它只代表一个时刻(就像Joda Time的Instant类型)。自Unix时代以来只有几毫秒。当您致电Date.toString()时,总是使用系统本地时区将其转换为可读的文本格式。

所以这里没有任何错误 - 只是期望失败 java.util.Date toString()行为的含义,或两者兼而有之。 / p>

(顺便说一句,更喜欢DateTimeZone.UTC而不是创建自己的。)

答案 1 :(得分:9)

首先获得与Joda Date匹配的JDK DateTime转换为LocalDateTime

如其他答案所述,时间(以毫秒为单位)不会因时区而改变:

DateTime local = DateTime.now()
Date localJDK = local.toDate()
assert localJDK.getTime() == local.toInstant().getMillis()

DateTime differentTimeZone = DateTime.now(DateTimeZone.forID('America/Chicago'))
Date localJDK2 = differentTimeZone.toDate()
assert differentTimeZone.toInstant().getMillis() == localJDK2.getTime()
assert localJDK.getTime() == localJDK2.getTime()

LocalDateTime转换为Date会改变:

Date differentTimeZoneJDK = differentTimeZone.toLocalDateTime().toDate()
assert localJDK.getTime() != differentTimeZoneJDK.getTime()

答案 2 :(得分:4)

您想要的行为是:

Date jdkDate = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”)。parse(dt.toString(“yyyy-MM-dd HH:mm:ss”));

像Jon指出的那样,JDK日期与时区无关。希望这有助于某人。