Как я могу преобразовать org.threeten.bp.OffsetDateTime в java .time.OffsetDateTime? - PullRequest
3 голосов
/ 21 января 2020

Я использую клиентскую библиотеку (третья сторона, не моя, не может измениться), которая использует типы дат ThreeTen. Мой проект Java 11 и использует Java 8 типов дат. Каков рекомендуемый способ преобразования объектов ThreeTeen в их Java 8 аналоги?

Ответы [ 2 ]

3 голосов
/ 21 января 2020

Кажется, что нет встроенного способа конвертировать один экземпляр в другой.

Я думаю, что вы написали свои собственные конвертеры, как один из следующих:

Часть -частичное преобразование:

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, we need to extract the String-ID
            java.time.ZoneOffset.of(ttOdt.getOffset().toString()));
}

Анализ форматированного вывода другого экземпляра:

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

Не проверял, какой из них более эффективный ...

2 голосов
/ 25 января 2020

Может показаться, что эта необходимость не была предусмотрена в проекте. Для этого, казалось бы, простого требования не существует действительно хорошего и естественного варианта.

Мне нравится выбирать из чего-то. 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 числовых поля (против 7 в первом преобразовании де Хаара), тем самым снижая риск переноса неправильного значения по ошибке. И мы все еще избегаем форматирования в строку и разбора обратно (что для меня кажется пустой тратой, но приятно и коротко).

И, пожалуйста, оберните его в метод с хорошим именем, как это сделал деХаар.

...