我们的应用程序使用 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
}
在下游,我注意到我们得到的超时时间与我们设置的有所不同。我认为我们将字段转换回日期时间错误,因为本地字段似乎具有正确的值。
一时兴起,我尝试更改吸气器,现在它可以工作了,但我不知道为什么:
public DateTime getTime() {
return localStopTime.toDateTime().withZone(timeZone);
}
joda文档对它如何执行toDateTime()
调用有点守口如瓶;它说它以某种方式"使用"某个时区,但仅此而已。
谁能向我解释一下两者之间的区别是什么
return localStopTime.toDateTime(timeZone);
和
return localStopTime.toDateTime().withZone(timeZone);
?
提前感谢!
编辑:我已经想通了 - 我使用"Etc/GMT"作为我的时区,这没有考虑到夏令时。已将马可的答案标记为正确
这两者之间的区别是下一个,您可以使用withZone()
来: (正如JavaDocs所说(
返回具有不同时区的此日期时间的副本,保留毫秒时刻。
此外,JavaDocs 提供了一个很好的例子:
此方法可用于查找另一个时区的本地时间。 例如,如果此时刻在欧洲/伦敦保持 12:30,则结果 从这种方法到欧洲/巴黎将是13:30。
然后,您可以使用toDateTime(timeZone)
返回DateTime
对象,但对其应用指定的timeZone
。
因此,您可以使用toDateTime(timeZone).withZone(secondTimeZone)
,您将获得第一个语句( toDateTime(timeZone)
(生成的DateTime
的副本,但是,使用不同的时区,会持续毫秒的时刻。如果你使用不带参数的toDateTime()
,只会检索一个DateTime
对象。