如何使用Java中的yoda时间库将UTC时间转换为CET时间?
我正在嘲笑这个,但看起来我做错了什么
DateTime dateTime = new LocalDateTime(utdDate.getTime()).toDateTime(DateTimeZone.forID("CET"));
如果我使用它,我会在我放入的同时出现。
答案 0 :(得分:2)
我强烈建议您避免使用像“CET”这样的时区名称,因为它具有固有的本地化特性。这可能只适用于最终用户的格式化输出,但不适用于内部编码。
CET代表许多不同的时区ID,例如IANA-ID Europe/Berlin
,Europe/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