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

Java Joda Time将时间分区日期时间转换为毫秒,java,datetime,timezone,jodatime,Java,Datetime,Timezone,Jodatime,有人能给我解释一下,为什么当我试图获取一个与我自己的时区不同的日期时间的毫秒数时,它会返回我本地机器时区的毫秒数?我希望获得UTC的毫秒数,但我的应用程序本地设置设置为EST(即使我实际上在爱尔兰;) 代码如下: DateTimeFormatter format = DateTimeFormat.mediumDateTime(); DateTime local = new DateTime(); DateTime utc = new DateTime(System.currentT

有人能给我解释一下,为什么当我试图获取一个与我自己的时区不同的日期时间的毫秒数时,它会返回我本地机器时区的毫秒数?我希望获得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=新的日期时间(DateTimeZone.utc);
  • 调用
    .getMillis()
    时,结果始终以UTC为单位。将时间表示为一个不基于UTC的整数是一个坏主意,Joda time不会提供这一点。您对毫秒数受本地时区影响的评估不正确

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

format.withZone(DateTimeZone.UTC).打印(当前)
  • 但是,如果打算将其打印为日期字符串,为什么要先转到毫秒?如果您传递原始的
    日期时间
    ,则其时区信息将自动应用
format.print(utc)
格式.打印(本地)
总而言之,整个事情看起来是这样的:

DateTime local=new DateTime();
DateTime utc=新的日期时间(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());

您的
local
utc
表示相同的时间点(仅附加了不同的时区)。因此,
getMillis()
(它给出了从unix纪元对应的“瞬间”开始经过的“物理”时间间隔)必须返回相同的值。“当调用.getMillis()时,结果总是以UTC为单位”我不太喜欢这样说。getMillis返回从瞬间到Unix epoch瞬间的毫秒数,其中不涉及时区。@leonbloy-事实上,由于Joda Time不支持闰秒,因此该值不是经过的确切毫秒数。它是UTC时刻的整数表示,如果不是闰秒的话。只是技术上准确而已。无论出于何种目的,你都可以用任何一种方式来考虑它们。