如何将 org.threeten.bp.OffsetDateTime 转换为 java.time.OffsetDateTime?

How can I convert a org.threeten.bp.OffsetDateTime to java.time.OffsetDateTime?

我正在使用使用 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));
}

没测试过哪个效率更高...

设计中似乎没有预见到这种需求。对于这个看似简单的要求,没有真正好的和自然的选择。

我喜欢有东西可供选择。 deHaar 已经提供了两个我们能得到的最好的选择。因此,作为补充,这里有第三个:通过自纪元以来的秒和纳秒和总偏移秒数进行转换

    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 那样把它包装成一个好听的名字的方法。

实际上使用解析转换很简单。我正在寻找解决方案并登陆了这个线程。经过检查,我发现这里有一个简单的方法。

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());