将org.joda.time.DateTime转换为java.time.OffsetDateTime的最佳方法是什么?

时间:2016-09-27 11:15:26

标签: java jodatime java-time datetime-conversion

以下是有效的,但将时间转换为long,然后转换为Instant以及将时区转换为TimeZone然后转换为{{}}似乎有点笨拙{1}}。有更清洁的方法吗?

ZoneId

1 个答案:

答案 0 :(得分:1)

这似乎是进行此类转换的一般方式。

由于两个API的类不能互相操作(你不能将Joda的DateTime与Java Time的DateTimeFormatter等等一起使用),它们之间的共同因素似乎是{ {1}} epochMilli 值。

所以我认为没有比创建long更好的方法,然后使用Joda对象的时区将其转换为java.time.Instant

嗯,我认为有一件事可以略微改进。这段代码:

OffsetDateTime

jodaDateTime.getZone().toTimeZone().toZoneId() 方法会创建一个toTimeZone()实例,用于通过java.util.Timezone方法创建java.time.ZoneId

您可以通过执行以下操作来避免创建此临时toZoneId()对象:

TimeZone

此代码不会创建临时ZoneId.of(jodaDateTime.getZone().getID()) 对象,而是直接创建TimeZone。作为Joda的DateTimeZone doesn't work with short IDs(如ZoneIdIST),我们可以假设PST类可以识别该ID(因为它也适用于长ID名称,例如ZoneId)。如果Joda的Europe/London ID是偏移量(例如DateTimeZone),它也有效。

不确定避免创建一个临时对象是否足够干净,但无论如何这是一个改进(一个很小的,但它仍然是)。

因此,最终代码与您的代码非常相似,只有上面提出的更改:

+01:00

还有另一种选择(非常类似,但不确定是否更清洁):获取总偏移量(而不是时区)并使用它来创建// java.time.Instant Instant instant = Instant.ofEpochMilli(jodaDateTime.getMillis()); // create the OffsetDateTime OffsetDateTime.ofInstant(instant, ZoneId.of(jodaDateTime.getZone().getID()));

java.time.ZoneOffset

您也可以使用@assylias' comment提出的建议,但我不确定格式化为long millis = jodaDateTime.getMillis(); // java.time.Instant Instant instant = Instant.ofEpochMilli(millis); // get total offset (joda returns milliseconds, java.time takes seconds) int offsetSeconds = jodaDateTime.getZone().getOffset(millis) / 1000; OffsetDateTime.ofInstant(instant, ZoneOffset.ofTotalSeconds(offsetSeconds)); 然后将其解析为String比此更清晰(尽管它也是作品)。