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

将org.joda.time.DateTime转换为java.time.OffsetDateTime的最佳方式是什么?,java,jodatime,java-time,datetime-conversion,Java,Jodatime,Java Time,Datetime Conversion,下面的方法可行,但将时间转换为长时间,然后是瞬间,以及将时区转换为时区,然后再转换为分区ID,似乎有点笨拙。有没有更干净的方法 java.time.Instant instant = java.time.Instant.ofEpochMilli(jodaDateTime.getMillis()); OffsetDateTime offsetDateTime = OffsetDateTime.ofInstant(instant, jodaDateTime.getZone().toT

下面的方法可行,但将时间转换为长时间,然后是瞬间,以及将时区转换为时区,然后再转换为分区ID,似乎有点笨拙。有没有更干净的方法

java.time.Instant instant = java.time.Instant.ofEpochMilli(jodaDateTime.getMillis());
OffsetDateTime offsetDateTime = OffsetDateTime.ofInstant(instant,
        jodaDateTime.getZone().toTimeZone().toZoneId());

这似乎是进行这种转换的一般方式

由于这两个API中的类彼此不可互操作,因此不能将Joda的DateTime与Java Time的DateTimeFormatter等一起使用,它们之间的共同点似乎是较长的Epochmili值

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

嗯,我认为有一点可以稍微改进。此代码:

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

通过执行以下操作,可以避免创建此临时时区对象:

ZoneId.of(jodaDateTime.getZone().getID())
这段代码不创建临时时区对象,而是直接创建ZoneId。正如Joda的IST或PST一样,我们可以假设ZoneId类可以识别该ID,因为它也适用于长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:


你也可以使用,但我不确定格式化为字符串,然后将其解析为OffsetDateTime是否比这更干净,尽管它也可以工作。

这似乎是解决方案的预期复杂性它看起来不错-如果性能不是一个问题,您可以通过字符串来实现:OffsetDateTime.parseISODateTimeFormat.dateTime.FMTjoDateTime,DateTimeFormatter.ISO_OFFSET_DATE_TIME;-但我不确定它是否不那么笨拙……我建议您在代码中使用其中一种。同时使用joda.time和java-time,您的代码可能会变得复杂和混乱。您可以做的另一个解决方案是使用格式化程序将时间从joda输出到字符串,然后使用不同的JavaTime格式化程序对其进行反序列化。
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));