Как получить дату с учетом смещения из XmlGregorianCalendar? - PullRequest
0 голосов
/ 24 июня 2019

У меня есть XMLGregorianCalendar в этой форме: 2019-06-24T18: 18: 55.007 + 02: 00

Как я могу получить правильную дату (с учетом смещения) в строке следующим образом: 24/06/2019 16: 18 ?

1 Ответ

1 голос
/ 25 июня 2019

Вы отметили свой вопрос java-6.Тем не менее, я представляю современный ответ, используя java.time, современный Java-интерфейс даты и времени.Это доступно в Java 6 через ThreeTen Backport (см. Ссылку внизу).

В зависимости от того, где вы получили XMLGregorianCalendar, вам может не потребоваться его иметь.Если я правильно понял, этот класс использовался для представления даты и времени в XML-документах, где они отформатированы, например, 2019-06-24T18:18:55.007+02:00.Этот формат достаточно близок к ISO 8601, чтобы классы java.time могли его анализировать напрямую, что мы предпочитаем:

    Locale userLocale = Locale.forLanguageTag("mt-MT"); // Maltese Malta
    DateTimeFormatter displayFormatter
            = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
                    .withLocale(userLocale);

    String fromXml = "2019-06-24T18:18:55.007+02:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(fromXml);
    String formattedUtcDateTime = dateTime.withOffsetSameInstant(ZoneOffset.UTC)
            .format(displayFormatter);
    System.out.println(formattedUtcDateTime);

Вывод из этого фрагмента (протестирован в Java 1.7.0_67 с ThreeTen Backport версии 1.3.6):

24/06/2019 16: 18

Предполагая, что форматирование предназначено для отображения пользователю, я рекомендую использовать локализованные форматы Java.Я выбрал мальтийский язык, потому что он точно соответствует вашему формату.Если ваш пользователь находится в другой локали, вы все равно должны рассмотреть формат этой локали.

Преобразование из XMLGregorianCalendar

Если вы получили XMLGregorianCalendar из устаревшего API, который вы не можете себе позволитьизменить только сейчас, есть несколько вариантов для его преобразования.

Один из них - вернуть строку из XMLGregorianCalendar:

    XMLGregorianCalendar xmlgc = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar("2019-06-24T18:18:55.007+02:00");
    String fromXml = xmlgc.toString();

Теперь все остальное, как указано выше.Pro: это коротко, и я не думаю, что в этом есть какие-то сюрпризы.Con: Для меня форматирование обратно в исходную строку и ее синтаксический анализ еще раз напоминает объезд.

Другой вариант проходит через устаревший GregorianCalendar класс:

    GregorianCalendar gc = xmlgc.toGregorianCalendar();
    ZonedDateTime zdt = DateTimeUtils.toZonedDateTime(gc);
    String formattedUtcDateTime = zdt.toOffsetDateTime()
            .withOffsetSameInstant(ZoneOffset.UTC)
            .format(displayFormatter);

Pro: я думаюэто официальное обращение.Против: эта строка длиннее, и, как я уже сказал, она использует плохо спроектированный и давно устаревший класс GregorianCalendar.

Ссылки

...