我遇到了一个奇怪的问题。以下是描述它的代码片段:
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时间。我错过了什么?
答案 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日期与时区无关。希望这有助于某人。