我们的应用程序使用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的答案标记为正确的
答案 0 :(得分:0)
这两个之间的区别是下一个,您可以使用withZone()
进行以下操作:(如 JavaDocs 所说)
返回具有不同时区的该日期时间的副本,保留毫秒瞬间。
此外, JavaDocs 提供了一个很好的示例:
此方法对于查找其他时区的当地时间很有用。 例如,如果此刻在欧洲/伦敦举行12:30,则结果 欧洲/巴黎采用这种方法的时间将是13:30。
然后您使用toDateTime(timeZone)
返回一个DateTime
对象,但将指定的timeZone
应用到该对象。
因此,您可以使用toDateTime(timeZone).withZone(secondTimeZone)
,并且将获得由第一条语句(DateTime
)生成的toDateTime(timeZone)
的副本,但使用不同的时区,将毫秒级瞬间保留下来。而且,如果您使用不带参数的toDateTime()
,则只会检索一个DateTime
对象。