这似乎是进行这种转换的一般方式。
由于两个 API 中的类不能相互操作(您不能将 JodaDateTime
与 Java Time等一起使用DateTimeFormatter
),它们之间的共同因素似乎是long
epochMilli值。
因此,我认为没有比创建 ajava.time.Instant
然后将其转换为OffsetDateTime
使用 Joda 对象中的时区更好的方法了。
嗯,我认为有一件事可以稍微改进。这段代码:
jodaDateTime.getZone().toTimeZone().toZoneId()
该toTimeZone()
方法创建一个java.util.Timezone
实例,该实例用于创建一个java.time.ZoneId
viatoZoneId()
方法。
您可以通过执行以下操作来避免创建此临时TimeZone
对象:
ZoneId.of(jodaDateTime.getZone().getID())
此代码不创建临时TimeZone
对象,而是ZoneId
直接创建。由于 JodaDateTimeZone
不适用于短 ID(如IST
或PST
),我们可以假设 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' comment提出的建议,但我不确定格式化为 aString
然后将其解析为OffsetDateTime
是否比这更干净(尽管它也有效)。