【问题标题】:joda DateTime timezone乔达日期时间时区
【发布时间】:2015-11-28 22:42:51
【问题描述】:

有人可以向我解释一下 joda DateTime 时区是如何工作的吗?我有:

public static void main(String[] args) {
    DateTime utc = new DateTime(new Date()).withZone(DateTimeZone.UTC);
    DateTime nonUtc = new DateTime(new Date());
    long l = DateTimeZone.UTC.convertLocalToUTC(new Date().getTime(), false);
    DateTime converted = new DateTime(l);

    System.out.println("UTC :"+utc.toDate() + " , time zone :"+utc.getZone().getID());
    System.out.println("Non UTC :"+nonUtc.toDate()+ " , time zone :"+nonUtc.getZone().getID());
    System.out.println("Converted :"+converted.toDate()+ " , time zone :"+converted.getZone().getID());
}

这个的输出如下。本地默认时区是欧洲/雅典

UTC :Thu Sep 03 10:40:30 EEST 2015 , time zone :UTC
Non UTC :Thu Sep 03 10:40:30 EEST 2015 , time zone :Europe/Athens
Converted :Thu Sep 03 10:40:30 EEST 2015 , time zone :Europe/Athens

我可以理解,第一个在 UTC 中创建一个 new Date(),时间从我的默认 TZ 开始,第二个创建一个 new Date(),默认 TZ,但为什么最后一行不将本地时间转换为 UTC?

【问题讨论】:

    标签: date datetime jodatime


    【解决方案1】:

    我认为你不应该尝试使用DateTimeZone.convertLocalToUTC()。它对于框架内部的时区计算非常有用。我建议不要将此方法用于任何其他用例,因为它的签名非常令人困惑。长参数旨在成为每个 API 的 本地即时。但是在大多数日期时间库的上下文中,瞬间通常意味着绝对全局瞬间(即使在 Joda-Time 中,如果你查看它的类 Instant)。另一个重要原因:查看长参数无法告诉我们这是本地参数还是全局参数(long 类型不传输此信息)。您总是需要上下文来决定这里是本地的还是全局的。

    现在是您“问题”的真正核心。 您对该方法的输入不是本地的,而只是一个全局瞬间(使用new Date().getTime()),因此不会发生真正的转换。以下行new DateTime(l); 仍将使用基于相同的默认时区全局瞬间。

    【讨论】:

      猜你喜欢
      • 2014-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 2013-03-18
      相关资源
      最近更新 更多