java - 如何从 org.joda.time.DateTime 转换为 java.time.ZonedDateTime

标签 java datetime timezone jodatime java-time

我有一个数据源,其中存储了 joda 时间 DateTime 对象。我需要将它们转换为 java ZonedDateTime 对象,同时保持原始时区。

仅保留偏移量是不够的,因为某些 DateTime 对象表示日常重复性任务,并且这些任务必须在每个日期的特定时区的特定时间发生。因此,它们必须遵循指定的时区转换,例如夏令时和冬令时。我无法确定 DateTime 对象的最终用途,因此我需要保留所有对象的时区信息以确保安全。

如何将 org.joda.time.DateTime 转换为 java.time.ZonedDateTime?

全部

ord.joda.time.DateTimeZone.getId()

映射到可用的id

java.time.ZoneId

最佳答案

如果您正在使用夏令时转换,则应避免单独提供每个字段。改为使用 epochMillis 进行转换,如以下示例所示。

Instant instant = Instant.ofEpochMilli(dt.getMillis());
ZoneId zoneId = ZoneId.of(dt.getZone().getID(), ZoneId.SHORT_IDS);
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, zoneId);

否则您将在过渡日期损失一小时。例如,德国于 2017 年 10 月 29 日 03:00 GMT+2 从夏令时 (GMT+2) 过渡到冬令时 (GMT+1),变为 02:00 GMT+1。那天,您有 2 个 02:00 实例 - 一个较早的 GMT+2,一个较晚的 GMT+1。

由于您使用的是 ZoneIds 而不是偏移量,因此无法知道您需要 2 个实例中的哪一个。默认情况下,在转换期间假定第一个。如果您提供 hourOfDay 和 ZoneId,那么 02:00 GMT+2 和 02:00 GMT+1 都将转换为 02:00 GMT+2。

关于java - 如何从 org.joda.time.DateTime 转换为 java.time.ZonedDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28877981/

相关文章:

java - 在记分板代码中使用什么单链表或数组?

datetime - 时间格式 - Coldfusion 9

java - 在 ScheduledThreadPoolExecutor 中使用带有比较器的 PriorityBlockingQueue

java - if语句条件防止空列表?

java - 在 ESB mule 中发送 POST 请求

c# - if else if in while 循环 were else if test 在第一个循环中定义

php - 如何在 PHP 中将 "0000-00-00 00:00:00"正确设置为 DateTime

c++ - 跨平台C++ : convert to/from UTC/local time WITH historical tzdata

java - Joda-用java中的时区确定日期的时间

android - TimeZone.getRawOffset() 似乎不适用于 Android 4.2