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

What's the difference between these two ways of creating a DateTime from a LocalDateTime?

我们的应用程序使用 jodatime 来处理时间,并且(出于 API 格式化原因)我们将时间存储在模型 class 中,看起来有点像这样:

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,因为本地字段似乎具有正确的值。

一时兴起,我尝试更改 getter,现在可以了,但我不知道为什么:

    public DateTime getTime() {
        return localStopTime.toDateTime().withZone(timeZone);
    }

joda documentation 对于如何执行 toDateTime() 调用有点守口如瓶;它说 "uses" 某个时区,但就是这样。

谁能给我解释一下

之间的区别
return localStopTime.toDateTime(timeZone);

return localStopTime.toDateTime().withZone(timeZone);

?

提前致谢!

编辑:我已经弄明白了 - 我使用 "Etc/GMT" 作为我的时区并且没有考虑夏令时。已将 Marco 的回答标记为正确

两者的区别在于下一个,您使用 withZone() 来:(如 JavaDocs 所说)

Returns a copy of this datetime with a different time zone, preserving the millisecond instant.

另外,JavaDocs 提供了一个很好的例子:

This method is useful for finding the local time in another timezone. For example, if this instant holds 12:30 in Europe/London, the result from this method with Europe/Paris would be 13:30.

并且您使用 toDateTime(timeZone) 到 return 一个 DateTime 对象,但将指定的 timeZone 应用于它。

因此,您可以使用 toDateTime(timeZone).withZone(secondTimeZone),您将获得第一个语句 (toDateTime(timeZone)) 生成的 DateTime 的副本,但是,在不同的时区,坚持毫秒瞬间。如果您使用不带参数的 toDateTime(),将只会检索一个 DateTime 对象。