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

3

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

我尝试了以下代码,但似乎出现了错误:

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

如果我使用这个,我会在输入和输出同时完成。

https://dev59.com/Hmox5IYBdhLWcg3wHAsA - Jay
1个回答

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()) 隐式地使用系统时区进行转换,因此如果您的 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接