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

2022-09-01 23:36:03

有人可以向我解释为什么当我尝试使用与我自己的区域不同的区域获取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时间具有相同的日期时间?


答案 1

几点:

  • 您无需致电 .只需传递这个:System.currentTimeMillis()
    DateTime utc = new DateTime(DateTimeZone.UTC);
  • 调用时,结果始终采用 UTC 格式。将时间表示为不基于UTC的整数是一个坏主意,而不是Joda Time将提供的东西。您对毫秒受本地时区影响的评估不正确。.getMillis()

  • 转换错误是由于您调用的方式造成的。传递整数时,默认行为是使用当前时区,即本地时间。您可以像这样更改它: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());

答案 2