这似乎是进行此类转换的通用方式。
由于两个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(如
IST
或
PST
),我们可以假设该ID将被
ZoneId
类识别(因为它也适用于长ID名称,例如
Europe/London
)。如果Joda的
DateTimeZone
ID是偏移量(例如
+01:00
),它也可以正常工作。
不确定避免创建一个临时对象是否足够简洁,但无论如何,这都是一种改进(虽然很微小,但仍然是)。
因此,最终的代码将与您的非常相似,只有上述建议的更改:
Instant instant = Instant.ofEpochMilli(jodaDateTime.getMillis());
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
是否比这更简洁(尽管它也可以工作)。
OffsetDateTime.parse(ISODateTimeFormat.dateTime().fmt(jodaDateTime), DateTimeFormatter.ISO_OFFSET_DATE_TIME);
- 不确定是否更加简洁... - assylias