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



有人能向我解释一下,为什么当我试图用不同于我自己的区域获取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时间具有相同的日期时间?

几点:

  • 您不需要调用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());

相关内容

  • 没有找到相关文章

最新更新