2012-02-29 67 views
10

我遇到了一个奇怪的问题。下面是一个代码片段,描述它:Joda时间的DateTime转换为java.util.Date奇怪问题

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

+1这是一个这是个好问题,因为java.util.Date的Javadocs显示了一个名为'getTimezoneOffset'的方法,尽管事实上没有相应的setter或构造函数来接收偏移量。 – 2012-02-29 17:44:05

+0

@RayToal很奇怪,这个问题尚未得到Sun开发者的支持 – 2012-02-29 18:23:22

回答

20

Date知道关于时区的话 - 它仅表示的时间瞬间(如约达时间的Instant型)。这距Unix时代仅有数毫秒。当您拨打Date.toString()时,总是使用系统本地时区将其转换为可读的文本格式。

所以没有什么错在这里 - 刚刚超过要么java.util.DatetoString()行为,或两者含义的预期失败。

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

+0

感谢Jon!但是使用dt.toDate()。getTime()仍然是我电脑的本地时间。如何获得与我指定的时区相关的millis的java.util.Date对象? – 2012-02-29 17:40:08

+0

@MartinAsenov:目前尚不清楚你的意思。正如我所说,java.util.Date'总是*相对于Unix时代,即UTC时间1970年1月1日午夜。 – 2012-02-29 17:42:56

+0

是的,我知道。我想我的误解是java.util.Date与时区有关,所以我期望新的DateTime(DateTimeZone.forOffsetHours(0))toDate()生成一个Date对象,其时间距离UTC + 2小时2小时。我的意图是以某种方式存储用户相关的时间,但现在我猜这根本不需要:) – 2012-02-29 18:07:35

4

你想要的行为是这样的:

日期jdkDate =新的SimpleDateFormat( “YYYY-MM-DD HH:MM:SS” ).parse(dt.toString(“yyyy-MM-dd HH:mm:ss”));

像乔恩指出的那样,JDK日期是时区不可知的。希望这可以帮助某人。

9

要得到一个匹配Joda的DateTime首先转换为LocalDateTime的JDK Date

正如在其他的答案解释,以毫秒为单位的时间取决于时区不会改变:

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() 

转换一个LocalDateTimeDate将改变:

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