【问题标题】:What's the difference between these two ways of creating a DateTime from a LocalDateTime?这两种从 LocalDateTime 创建 DateTime 的方法有什么区别?
【发布时间】:2019-08-16 19:53:30
【问题描述】:

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

【问题讨论】:

  • jodatime 是开源的!查看LocalDateTime:getDateTime()DateTime:withZone() 的来源,以准确了解发生了什么。
  • 我的观察与你的相反。有了return localStopTime.toDateTime(timeZone);,我确实得到了同样的DateTime。随着return localStopTime.toDateTime().withZone(timeZone); 我得到一个不同的(除非提供的DateTime 的区域是我的默认时区)。我所观察到的也符合我对预期行为的理解。
  • @OleV.V. - 这很有趣 - 我能问一下你用的是什么时间吗?我正在使用 localTime=2014-04-24T15:55:00.000, timeZone=Etc/GMT 进行测试,即在夏令时。
  • 我使用了国外时区的当前时间:new DateTime(DateTimeZone.forID("Asia/Shanghai"))(我自己的时区是欧洲/哥本哈根)。我怀疑你身边可能发生了一些计划外的事情,但我猜不出是什么。
  • (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。

标签: java time timezone jodatime


【解决方案1】:

这两者的区别是下一个,你用withZone()来:(正如JavaDocs所说)

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

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

此方法对于查找另一个时区的本地时间很有用。 例如,如果这个瞬间在欧洲/伦敦为 12:30,则结果 从欧洲/巴黎的这种方法出发将是 13:30。

您使用toDateTime(timeZone) 返回一个DateTime 对象,但将指定的timeZone 应用于它。

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

【讨论】:

    猜你喜欢
    • 2013-09-08
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2011-01-10
    • 2016-07-01
    • 2013-08-08
    相关资源
    最近更新 更多