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

3
以下代码可以工作,但是将时间转换为long,然后再转换为Instant,以及将时区转换为TimeZone,然后再转换为ZoneId似乎有点笨拙。有没有更简洁的方法?
java.time.Instant instant = java.time.Instant.ofEpochMilli(jodaDateTime.getMillis());
OffsetDateTime offsetDateTime = OffsetDateTime.ofInstant(instant,
        jodaDateTime.getZone().toTimeZone().toZoneId());

4
看起来这个解决方案的复杂度符合预期。 - Chris Gerken
2
看起来还不错 - 如果性能不是问题,你可以通过字符串来实现:OffsetDateTime.parse(ISODateTimeFormat.dateTime().fmt(jodaDateTime), DateTimeFormatter.ISO_OFFSET_DATE_TIME); - 不确定是否更加简洁... - assylias
2
我建议您在代码中只使用其中一个。 同时使用joda.time和java-time可能会导致代码出现复杂性和混淆。 另一种解决方案是使用格式化程序将您的时间从joda输出为字符串,然后使用不同的JavaTime格式化程序进行反序列化。 - Bojan Petkovic
1个回答

6

这似乎是进行此类转换的通用方式。

由于两个API的类之间不兼容(您不能使用Joda的DateTime与Java Time的DateTimeFormatter等),它们之间的共同因素似乎是long epochMilli值。

因此,我认为没有比创建一个java.time.Instant,然后使用Joda对象的时区将其转换为OffsetDateTime更好的方法了。

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

jodaDateTime.getZone().toTimeZone().toZoneId()
toTimeZone()方法创建一个java.util.Timezone实例,然后使用toZoneId()方法创建一个java.time.ZoneId

您可以通过以下方式避免创建临时的TimeZone对象:

ZoneId.of(jodaDateTime.getZone().getID())

这段代码不创建临时的TimeZone对象,而是直接创建ZoneId。由于Joda的DateTimeZone无法使用短ID(如ISTPST),我们可以假设该ID将被ZoneId类识别(因为它也适用于长ID名称,例如Europe/London)。如果Joda的DateTimeZone ID是偏移量(例如+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

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));

你也可以使用@assylias的评论中提到的建议,但我不确定将其格式化为String,然后将其解析为OffsetDateTime是否比这更简洁(尽管它也可以工作)。


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