我们的应用程序使用jodatime来处理时间,并且(出于API格式化原因)我们将时间存储在模型类中,看起来有点像这样:
class Event {
private LocalDateTime localTime;
private DateTimeZone timeZone;
public DateTime getTime() {
return localStopTime.toDateTime(timeZone);
}
public void setTime(DateTime value) {
this.localTime = value.toLocalDateTime();
this.timeZone = value.getZone();
}
// ...more boilerplate
}
在下游,我注意到我们得到的时间不同于我们设置的时间。我想我们将字段转换回DateTime错误,因为本地字段似乎具有正确的值。
我一时兴起尝试改变吸气剂,现在它可以工作,但我不明白为什么:
public DateTime getTime() {
return localStopTime.toDateTime().withZone(timeZone);
}
joda documentation对于如何执行toDateTime()
电话有点守口如瓶;它说它以某种方式“使用”某个时区,但就是这样。
任何人都可以向我解释有什么区别
return localStopTime.toDateTime(timeZone);
和
return localStopTime.toDateTime().withZone(timeZone);
?
提前致谢!
编辑:我已经弄明白 - 我使用“Etc / GMT”作为我的时区,并没有考虑到夏令时。将Marco的答案标记为正确
这两者之间的区别是下一个,你使用withZone()
:(如JavaDocs所说)
返回具有不同时区的此日期时间的副本,保留毫秒时刻。
此外,JavaDocs提供了一个很好的例子:
此方法对于在另一个时区中查找本地时间非常有用。例如,如果此时刻在欧洲/伦敦持续12:30,则此方法与欧洲/巴黎的结果将是13:30。
你使用toDateTime(timeZone)
返回一个DateTime
对象,但应用指定的timeZone
。
所以,你可以使用toDateTime(timeZone).withZone(secondTimeZone)
,你将得到第一个语句(DateTime
)生成的toDateTime(timeZone)
的副本,但是,使用不同的时区,迫害毫秒瞬间。如果你使用没有参数的toDateTime()
,只会检索一个DateTime
对象。