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

3
我们的应用程序使用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时出现了错误,因为本地字段似乎具有正确的值。

出于一时兴起,我尝试更改getter,现在它可以工作了,但我不知道原因是什么:

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

Joda文档 对于如何执行toDateTime()调用有点保密; 它说它以某种方式 "使用" 特定的时区,但仅此而已。

有人能解释一下这两者之间的差异吗?

return localStopTime.toDateTime(timeZone);

并且

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

谢谢您提前的帮助!

编辑:我已经解决了 - 我使用的是“Etc / GMT”作为我的时区,这没有考虑到夏令时。已将Marco的答案标记为正确。


2
jodatime是开源的!查看LocalDateTime:getDateTime()DateTime:withZone()的源代码,以确切了解正在发生的事情。 - lupz
我的观察与你相反。使用 return localStopTime.toDateTime(timeZone); 我得到了相同的 DateTime。而使用 return localStopTime.toDateTime().withZone(timeZone); 我得到了一个不同的结果(除非提供的DateTime的时区是我的默认时区)。我观察到的也符合我的预期行为。 - Ole V.V.
@OleV.V. - 这很有趣 - 我可以问一下你使用的时间是什么吗?我正在测试 localTime=2014-04-24T15:55:00.000,timeZone=Etc/GMT,即在夏令时期间。 - Binney
我在使用外国时区的当前时间:new DateTime(DateTimeZone.forID("Asia/Shanghai"))(我的本地时区是欧洲/哥本哈根)。我怀疑你们这边可能出了一些意外情况,但我无法猜测具体是什么。 - Ole V.V.
(1) 我设置的日期时间为:2019-03-28T01:28:26.755+08:00。从 return localStopTime.toDateTime(timeZone); 得到的日期时间也是这个。 (2) 我设置的日期时间为:2019-03-28T01:29:40.414+08:00。从 return localStopTime.toDateTime().withZone(timeZone); 得到的日期时间为:2019-03-28T08:29:40.414+08:00。请注意,小时数为 08 而不是 01。 - Ole V.V.
1个回答

0

这两者之间的区别在于,你使用withZone()来:(如JavaDocs所述)

返回一个带有不同时区的此日期时间的副本,保留毫秒级别的瞬时值。

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

此方法对于在另一个时区中查找本地时间非常有用。 例如,如果此瞬时值在Europe/London中为12:30,则使用Europe/Paris的此方法的结果将为13:30。

而你使用toDateTime(timeZone)返回一个应用指定timeZoneDateTime对象。

因此,你可以使用toDateTime(timeZone).withZone(secondTimeZone),你将获得由第一个语句(toDateTime(timeZone))生成的DateTime的副本,但是具有不同的时区,保留毫秒级别的瞬时值。如果你使用没有参数的toDateTime(),则只会检索到一个DateTime对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接