我正在使用使用 ThreeTen 日期类型的客户端库(第三方,不是我的,无法更改)。我的项目是 Java 11 并使用 Java 8 日期类型。将 ThreeTeen 对象转换为 Java 8 对象的推荐方法是什么?
问问题
3825 次
3 回答
6
似乎没有将一个实例转换为另一个实例的内置方法。
我认为您已经编写了自己的转换器,例如以下之一:
逐部分转换:
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));
}
还没有测试哪个更有效...
于 2020-01-21T15:30:40.213 回答
3
在设计中似乎没有预见到这种需求。对于这个看似简单的要求,没有真正好的和自然的选择。
我喜欢有一些东西可供选择。deHaar 已经提供了两个我们可以得到的最好的选择。因此,作为补充,这里有第三个:通过 seconds 和 nanoseconds since the epoch 和总偏移 seconds 进行转换。
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 所做的那样具有好名字的方法。
于 2020-01-25T09:34:20.863 回答
2
实际上,使用 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());
于 2021-10-06T21:34:17.120 回答