Jodatime 获得带有偏移量的毫秒数



JodaTime库的新功能,我想获得具有指定时区偏移量的DateTime毫秒字段。到目前为止,我的尝试是:

      private DateTimeZone          timeZone = DateTimeZone.forID("Europe/Amsterdam");
  private long now=new DateTime().withZone(timeZone).getMillis();

但我总是得到 UTC 毫秒,不应用时区偏移量,有没有办法将时区的偏移量应用于日期时间对象?感谢!

首先:你打算用这些"本地"毫数做什么?你真正想要实现的目标是什么?通常只需要UTC-millis。

无论如何,请记住一般的时区偏移量定义,即:

UTC + 偏移量 = 本地时间

那么解决方案很简单:

DateTimeZone tz = DateTimeZone.forID("Europe/Amsterdam");
long nowUTC = new DateTime().withZone(tz).getMillis();
long nowLocal = nowUTC + tz.getOffset(nowUTC);

但再说一遍:"本地"毫秒的用例是什么?它们甚至不再与UNIX纪元相关,因为UTC链接被切断了。

关于您的最后一个问题("有没有办法将时区的偏移量应用于 DateTime 对象?

您的DateTime对象已经有一个时区,即"欧洲/阿姆斯特丹"。它内部用于计算字段元组表示形式,一旦您有一个全局 UTC 时间戳表示为自 UNIX 纪元以来的 millis。无需在DateTime上应用额外的偏移量。它已经在那里了。

JodaTime内部正在使用机器时间。因此,要查找毫秒,您可以使用引用Jan 1, 1970的常量存储LocalDateTime(由于 UNIX 时间)。

Unix时间,或POSIX时间,是一个描述时间点的系统, 定义为自午夜外推以来经过的秒数 1970 年 1 月 1 日的协调世界时 (UTC),不包括飞跃 秒。

然后计算日期时间之间的差异。

我试过这样;

public static void main(String[] args) {
        final LocalDateTime JAN_1_1970 = new LocalDateTime(1970, 1, 1, 0, 0);
        DateTime local = new DateTime().withZone(DateTimeZone.forID("Europe/Amsterdam"));
        DateTime utc = new DateTime(DateTimeZone.UTC);
        System.out.println("Europe/Amsterdam milis :" + new Duration(JAN_1_1970.toDateTime(DateTimeZone.forID("Europe/Amsterdam")), local).getMillis());
        System.out.println("UTC  milis             :" + new Duration(JAN_1_1970.toDateTime(DateTimeZone.UTC), utc).getMillis());
    }

结果是;

Europe/Amsterdam milis :1429695646528
UTC  milis             :1429692046534

@leonbloy在这里写一个很好的评论。

您的本地和 UTC 代表相同的时间时刻,(仅使用 附上不同的时区)。因此,getMillis()(它给出了 从"瞬间"经过的"物理"时间间隔对应于 Unix 纪元),必须返回相同的值。

我也会寻找更好的解决方案,没有常数。

相关内容

  • 没有找到相关文章

最新更新