这两种从LocalDateTime创建DateTime的方式有什么区别?

时间:2019-03-26 12:20:28

标签: java time timezone jodatime

我们的应用程序使用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的答案标记为正确的

1 个答案:

答案 0 :(得分:0)

这两个之间的区别是下一个,您可以使用withZone()进行以下操作:(如 JavaDocs 所说)

  

返回具有不同时区的该日期时间的副本,保留毫秒瞬间。

此外, JavaDocs 提供了一个很好的示例:

  

此方法对于查找其他时区的当地时间很有用。   例如,如果此刻在欧洲/伦敦举行12:30,则结果   欧洲/巴黎采用这种方法的时间将是13:30。

然后您使用toDateTime(timeZone)返回一个DateTime对象,但将指定的timeZone应用到该对象。

因此,您可以使用toDateTime(timeZone).withZone(secondTimeZone),并且将获得由第一条语句(DateTime)生成的toDateTime(timeZone)的副本,但使用不同的时区,将毫秒级瞬间保留下来。而且,如果您使用不带参数的toDateTime(),则只会检索一个DateTime对象。