如何在java中将UTC时间转换为CET时间

时间:2014-04-16 14:32:55

标签: java timezone jodatime

如何使用Java中的yoda时间库将UTC时间转换为CET时间?

我正在嘲笑这个,但看起来我做错了什么

DateTime dateTime = new LocalDateTime(utdDate.getTime()).toDateTime(DateTimeZone.forID("CET"));

如果我使用它,我会在我放入的同时出现。

1 个答案:

答案 0 :(得分:2)

我强烈建议您避免使用像“CET”这样的时区名称,因为它具有固有的本地化特性。这可能只适用于最终用户的格式化输出,但不适用于内部编码。

CET代表许多不同的时区ID,例如IANA-ID Europe/BerlinEurope/Paris等。在我的时区“Europe / Berlin”中,您的代码的作用如下:

DateTime dateTime =
  new LocalDateTime(utdDate.getTime()) // attention: implicit timezone conversion
  .toDateTime(DateTimeZone.forID("CET"));
System.out.println(dateTime.getZone()); // CET
System.out.println(dateTime); // 2014-04-16T18:39:06.976+02:00

请记住表达式new LocalDateTime(utdDate.getTime()) implicitly uses the system timezone for conversion因此,如果您的CET区域在内部被识别时与您的系统时区相比具有相同的时区偏移,则不会改变任何内容。为了强制JodaTime识别UTC输入,你应该像这样指定它:

Date utdDate = new Date();
DateTime dateTime = new DateTime(utdDate, DateTimeZone.UTC);
System.out.println(dateTime); // 2014-04-16T16:51:31.195Z

dateTime = dateTime.withZone(DateTimeZone.forID("Europe/Berlin"));
System.out.println(dateTime); // 2014-04-16T18:51:31.195+02:00

此示例保留了自UNIX纪元以来的绝对时间(以毫秒为单位)。如果您想保留字段并因此更改即时消息,则可以使用方法withZoneRetainFields

Date utdDate = new Date();
dateTime = new DateTime(utdDate, DateTimeZone.UTC);
System.out.println(dateTime); // 2014-04-16T16:49:08.394Z

dateTime = dateTime.withZoneRetainFields(DateTimeZone.forID("Europe/Berlin"));
System.out.println(dateTime); // 2014-04-16T16:49:08.394+02:00