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

Mar*_*nov 10 java jodatime

我遇到了一个奇怪的问题.这是一段描述它的代码:

DateTimeZone dtz = DateTimeZone.forOffsetHours(0);

DateTime dt = new DateTime(dtz);

System.out.println(dt);
System.out.println(dt.toDate());
Run Code Online (Sandbox Code Playgroud)

输出是:

2012-02-29T17:24:39.055Z
Wed Feb 29 19:24:39 EET 2012
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 20

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

所以没有什么错在这里-只是一个预期失败过任何的意义java.util.Date 它的toString()行为,或两者兼而有之.

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


小智 9

获得一个Date与Joda的DateTime转换匹配的JDK 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()
Run Code Online (Sandbox Code Playgroud)

转换LocalDateTimeDate将改变:

Date differentTimeZoneJDK = differentTimeZone.toLocalDateTime().toDate()
assert localJDK.getTime() != differentTimeZoneJDK.getTime()
Run Code Online (Sandbox Code Playgroud)