繁体   English   中英

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

[英]Joda time's DateTime converted to java.util.Date strange issue

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

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时间。 我错过了什么?

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

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

DateTimeZone.UTC ,更喜欢DateTimeZone.UTC创建自己的。)

要获得与Joda的DateTime匹配的JDK Date ,请首先转换为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()

你想要的行为是这样的:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM