Joda Time 将时区日期时间转换为毫秒

Posted

技术标签:

【中文标题】Joda Time 将时区日期时间转换为毫秒【英文标题】:Joda Time converting time zoned date time to milliseconds 【发布时间】:2013-08-18 22:53:28 【问题描述】:

有人可以向我解释为什么当我尝试获取具有与我自己不同的区域的 DateTime 的毫秒数时,它会返回我本地机器时区的毫秒数吗?我正在寻找 UTC 的毫秒数,但我的应用程序的本地设置设置为 EST(即使我实际上在爱尔兰;))

代码如下:

  DateTimeFormatter format = DateTimeFormat.mediumDateTime();

  DateTime local = new DateTime();
  DateTime utc = new DateTime(System.currentTimeMillis(), DateTimeZone.UTC);
  System.out.println("utc zone = " +utc.getZone());
  System.out.println("UTC time: " + utc);
  long current = utc.getMillis();

  System.out.println("current: " + format.print(current));
  System.out.println("local: " + format.print(local.getMillis()));

这是打印的内容:

 utc zone = UTC
 UTC time: 2013-08-16T13:36:32.444Z
 current: Aug 16, 2013 9:36:32 AM
 local: Aug 16, 2013 9:36:32 AM

目前,我认为它应该与 UTC 时间具有相同的日期时间?

【问题讨论】:

您的localutc 代表相同的时间瞬间(仅附加了不同的时区)。因此,getMillis()(它给出了从对应于 unix 纪元的“即时”经过的“物理”时间间隔)必须返回相同的值。 【参考方案1】:

几点:

您无需致电System.currentTimeMillis()。只要通过这个:
    DateTime utc = new DateTime(DateTimeZone.UTC);

当您调用 .getMillis() 时,结果是 始终,采用 UTC。将时间表示为不基于 UTC 的整数是一个坏主意,而且 Joda Time 不会提供。您认为毫秒受您当地时区影响的评估不正确。

转换错误是因为您调用format.print 的方式。当您传递一个整数时,默认行为是使用当前时区,即您的本地时间。你可以这样改变它:

    format.withZone(DateTimeZone.UTC).print(current)
但是,如果打算将其打印为日期字符串,为什么还要先到毫秒呢?如果你传递了原来的DateTime,那么它的时区信息将被自动应用。
    format.print(utc)
    format.print(local)

放在一起,整个事情看起来像这样:

DateTime local = new DateTime();
DateTime utc = new DateTime(DateTimeZone.UTC);

System.out.println("local zone = " + local.getZone());
System.out.println("  utc zone = " + utc.getZone());

DateTimeFormatter format = DateTimeFormat.mediumDateTime();
System.out.println(" local: " + format.print(local));
System.out.println("   utc: " + format.print(utc));
System.out.println("millis: " + utc.getMillis());

【讨论】:

“当您调用 .getMillis() 时,结果始终为 UTC”我不太喜欢这种说法。 getMillis 返回从瞬间到 Unix 纪元瞬间所经过的毫秒数,不涉及时区。 @leonbloy - 实际上,由于 Joda Time 不支持闰秒,因此该值并不是真正的 精确 毫秒数。如果没有闰秒,它是 UTC 时刻的整数表示。只是技术上准确。出于所有意图和目的,您可以以任何一种方式来考虑它们。

以上是关于Joda Time 将时区日期时间转换为毫秒的主要内容,如果未能解决你的问题,请参考以下文章

为什么org.joda.time.LocalDate是没有时区的日期?

如何使用 Joda Time 解析包含时区的日期

使用时区将字符串转换为日期

使用 Joda-Time 获取给定日期和时区的 UTC 偏移量

无法使用 Joda Time API 将日期转换为 UTC [关闭]

如何将日期字符串转换为joda DateTime?