Как преобразовать ZonedDateTime в XMLGregorianCalendar в Java 7 - PullRequest
1 голос
/ 13 июля 2020

Мое java 7 приложение, использующее службу, которая находится в Java 8, я получаю дату в виде строки, например

"2020-04-13T12:36:13Z" 

, которая на самом деле является ZonedDateTime. мне нужно преобразовать эту строку в XMLGregorianCalendar и отправить в другую службу? Поскольку мое приложение находится в java 7, я не смог проанализировать строку до ZonedDateTime. Есть ли способ сделать это преобразование?

1 Ответ

2 голосов
/ 13 июля 2020

Легко, когда знаешь как.

    String receivedDateTimeString = "2020-04-13T12:36:13Z";
    
    XMLGregorianCalendar xmlgc = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(receivedDateTimeString);
    
    System.out.println(xmlgc);

Вывод:

2020-04-13T12: 36: 13Z

ZonedDateTime.toString() иногда создает формат ISO 8601 (а иногда и расширенный формат с идентификатором зоны, который не является частью ISO 8601). В вашем случае у вас есть чистый ISO 8601. Даты и время в документах XML используют вариант ISO 8601, это достаточно близко, чтобы мы могли считать их одинаковыми для нашей цели. Таким образом, экземпляр XMLGregorianCalendar создается непосредственно из строки ISO 8601, а его метод toString возвращает ту же строку ISO 8601.

ThreeTen Backport позволяет использовать ZonedDateTime в Java 7

Вы можете, и вы также можете предпочесть использовать ZonedDateTime в Java 7, а не XMLGregorianCalendar. Это использование проходит через ThreeTen Backport, бэкпорт от java .time до Java 6 и 7, см. Ссылки внизу.

import org.threeten.bp.ZonedDateTime;

public class DemoZonedDateTimeInJava7 {

    public static void main(String[] args) {
        String receivedDateTimeString = "2020-04-13T12:36:13Z";
        ZonedDateTime zdt = ZonedDateTime.parse(receivedDateTimeString);
        System.out.println(zdt);
    }

}

2020-04-13T12: 36: 13Z

  • В Java 8 и новее, а также на более новых Android устройствах (начиная с уровня API 26) современный API встроен.
  • В не- Android Java 6 и 7 получают ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • On (более старые) Android используйте Android издание ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортировали классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

...