Jodatime将时间划分日期时间转换为millis

cia*_*ley 21 java timezone datetime jodatime

有人可以向我解释为什么当我试图获得一个与我自己的区域不同的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()));
Run Code Online (Sandbox Code Playgroud)

这是它打印的内容:

 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
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*int 19

几点:

  • 你不需要打电话System.currentTimeMillis().通过这个:
    DateTime utc = new DateTime(DateTimeZone.UTC);
Run Code Online (Sandbox Code Playgroud)
  • 当您调用时.getMillis(),结果始终为UTC.将时间表示为不是基于UTC的整数是一个坏主意,而不是Joda Time将提供的内容.您对本地时区影响毫秒的评估不正确.

  • 转换错误是由于您的调用方式format.print.传递整数时,默认行为是使用当前时区,即本地时间.您可以像这样更改它:

    format.withZone(DateTimeZone.UTC).print(current)
Run Code Online (Sandbox Code Playgroud)
  • 但是,如果打算将其打印为日期字符串,为什么还要先打几毫秒呢?如果您传递原件DateTime,则会自动应用其时区信息.
    format.print(utc)
    format.print(local)
Run Code Online (Sandbox Code Playgroud)

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

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());
Run Code Online (Sandbox Code Playgroud)

  • "当你调用.getMillis()时,结果总是在UTC中"我不太喜欢这种方式.getMillis返回从瞬间到Unix纪元瞬间的毫秒数,没有涉及的时区. (6认同)
  • @leonbloy - 实际上,由于Joda Time不支持闰秒,因此该值不是真正的*精确*毫秒数.它是UTC时刻的整数表示,它们没有任何闰秒.只是在技术上准确.出于所有意图和目的,您可以以任何一种方式来考虑它们. (4认同)