我正在使用一个客户端库(第三方,不是我的,不能更改(,它利用了ThreeTen日期类型。我的项目是Java 11,使用Java 8日期类型。将 ThreeTeen 对象转换为 Java 8 对象的推荐方法是什么?
似乎没有内置的方法可以将一个实例转换为另一个实例。
我认为您已经编写了自己的转换器,例如以下之一:
逐个部件转换:
public static java.time.OffsetDateTime convertFrom(org.threeten.bp.OffsetDateTime ttOdt) {
// convert the instance part by part...
return java.time.OffsetDateTime.of(ttOdt.getYear(), ttOdt.getMonthValue(),
ttOdt.getDayOfMonth(), ttOdt.getHour(), ttOdt.getMinute(),
ttOdt.getSecond(), ttOdt.getNano(),
// ZoneOffset isn't compatible, create one using the seconds of the given
java.time.ZoneOffset.ofTotalSeconds(ttOdt.getOffset().getTotalSeconds());
}
解析另一个实例的格式化输出:
public static java.time.OffsetDateTime convertFrom(org.threeten.bp.OffsetDateTime ttOdt) {
// convert the instance by parsing the formatted output of the given instance
return java.time.OffsetDateTime.parse(
ttOdt.format(org.threeten.bp.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME));
}
还没有测试哪一个更有效...
在设计中似乎没有预见到这种需求。对于这个看似简单的要求,没有真正好的和自然的选择。
我喜欢有一些东西可供选择。 德哈尔已经提供了两个尽可能好的选项。因此,作为补充,这里有第三个:通过自纪元和总偏移秒以来的秒和纳秒进行转换。
org.threeten.bp.OffsetDateTime fromThirdParty
= org.threeten.bp.OffsetDateTime.of(2020, 1, 25, 23, 34, 56, 123456789,
org.threeten.bp.ZoneOffset.ofHours(1));
java.time.Instant jtInstant = java.time.Instant
.ofEpochSecond(fromThirdParty.toEpochSecond(), fromThirdParty.getNano());
java.time.ZoneOffset jtOffset = java.time.ZoneOffset.ofTotalSeconds(
fromThirdParty.getOffset().getTotalSeconds());
java.time.OffsetDateTime converted
= java.time.OffsetDateTime.ofInstant(jtInstant, jtOffset);
System.out.println("From " + fromThirdParty);
System.out.println("To " + converted);
此代码段的输出为:
From 2020-01-25T23:34:56.123456789+01:00 To 2020-01-25T23:34:56.123456789+01:00
可能的优点包括:我们正在传输 3 个数值字段(而 deHaar 的第一次转换为 7 个(,从而降低了错误传输错误值的风险。而且我们仍然避免格式化为字符串并解析回来(这对我来说感觉很浪费,但很好而且很短(。
请像 deHaar 那样用一个好听的名字包装它。
实际上使用parse进行转换很简单。 我正在寻找解决方案并降落在这个线程上。 经过检查,我认为有一个简单的方法,所以张贴在这里。
java.time.OffsetDateTime odt = java.time.OffsetDateTime.now();
org.threeten.bp.OffsetDateTime ODT = org.threeten.bp.OffsetDateTime.parse(odt.toString());
反之亦然
org.threeten.bp.OffsetDateTime ODT = org.threeten.bp.OffsetDateTime.now();
java.time.OffsetDateTime odt = java.time.OffsetDateTime.parse(ODT.toString());