如何使用Java中的Yoda Time库将UTC时间转换为CET时间?
我尝试了以下代码,但似乎出现了错误:
DateTime dateTime = new LocalDateTime(utdDate.getTime()).toDateTime(DateTimeZone.forID("CET"));
如果我使用这个,我会在输入和输出同时完成。
我强烈建议您避免使用像“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())
隐式地使用系统时区进行转换,因此如果您的 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