我正在使用CEST时区(+2),我在理解JodaTime如何存储DateTime时遇到了一些困难。拿这个代码:
String timeString = "2012-09-10T13:30:00+01:00";
DateTime ddateTime = new DateTime(timeString);
DateTime dtLisbon = ddateTime.withZone(DateTimeZone.forID("Europe/Lisbon"));
运行后,变量得到以下值:
timeString = '2012-09-10T13:30:00+01:00'
ddateTime = '2012-09-10T14:30:00.000+02:00'
dtLisbon = '2012-09-10T13:30:00.000+01:00'
为什么JodaTime没有将ddateTime设置为我发送的确切字符串?我是否总是需要调用.withZone方法才能获得正确的时机?
谢谢
答案 0 :(得分:5)
您应该调用一个DateTime
构造函数,其中DateTimeZone
如此:
new DateTime(timeString, DateTimeZone.forID("Europe/Lisbon"));
如果你单步调试Joda正在制作的电话,我强烈推荐这样你就可以了解所有部分是如何组合在一起的,你会看到调用链是:
DateTime(Object)
-> BaseDateTime(Object, Chronology)
-> AbstractConverter.getChronology(Object, Chronology)
-> DateTimeUtils.getChronology(Chronology)
-> ISOChronology.getInstance()
-> DateTimeZone.getDefault()
-> System.getProperty("user.timezone")
这就是为什么ddateTime
最终成为UTC + 2,这是你的时区,当你没有提供DateTimeZone
而不是UTC + 1时,这是字符串中的时区你提供了。