Как обрабатывать дату с и без зоны - PullRequest
1 голос
/ 05 мая 2019

Мой клиент отправляет мне даты в ISO8601, который иногда содержит миллисекунды с зоной, а иногда без миллисекунды и зоны.

, например: 2019-05-01T06:55:43+01:00, 2019-05-01T06:55

Я использую API нового времени Java 8 (LocalDateTime, DateTimeFormatter и т. Д.)

Я не нашел Date класса с форматером, который может обрабатывать как с миллисекундами и зонами, так и без этого.

Я пытаюсьсделать проверку даты ввода, используя один формат

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(templateFormat, locale);


    try {
        ldt = LocalDateTime.parse(context, formatter );
        String result = ldt.format(formatter);
        return result.equals(context);
    } catch (DateTimeParseException e) {
        try {
            LocalDate ld = LocalDate.parse(context, formatter );
            String result = ld.format(formatter);
            return result.equals(context);

Я спрашиваю, есть ли форматер, который кэширует оба, я могу использовать несколько классов даты, и если мне не удается перейти к следующему, например (LocalDateTime, LocalDate, OffsetDateTime), но мне нужно использовать один форматер

Ответы [ 2 ]

3 голосов
/ 05 мая 2019

Различные типы

Как прокомментировал Оле В.В., ваши входные данные:

  • 2019-05-01T06: 55: 43 + 01: 00
  • 2019-05-01T06: 55

… это два разных животных.

Первый представляет момент, конкретную точку на временной шкале.Значение включает три элемента информации:

  • дата
  • время суток
  • смещение от UTC

Второй вход имеет только дату и время суток.В нем отсутствует контекст часового пояса или смещения от UTC .Таким образом, это значение не представляет момент.Это не точка на временной шкале.Это значение представляет потенциальных моментов в диапазоне около 26-27 часов, диапазоне часовых поясов по всему земному шару.Второй означает 6 утра в Токио?Или в Париже, когда 6 часов утра происходит через несколько часов?Или еще больше часов спустя, когда в Квебек прибудет 6 часов утра?

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

Синтаксический анализ

, например: 2019-05-01T06: 55: 43 + 01: 00, 2019-05-01T06: 55

Кответьте на свой конкретный вопрос:

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

Оба входа имеют стандартный ISO 8601 формат.Классы java.time по умолчанию используют стандартные форматы при разборе / генерации строк.Поэтому нет необходимости указывать шаблоны форматирования.

try {
    OffsetDateTime odt = OffsetDateTime.parse( input ) ;
    …
} catch ( DateTimeParseException e ) {
    LocalDateTime ldt = LocalDateTime.parse( input ) ;
    …
}
0 голосов
/ 05 мая 2019

Если вы можете по умолчанию пропустить значения, вы можете использовать класс OffsetDateTime для хранения этого.https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html

OffsetDateTime является неизменным представлением даты-времени со смещением.Этот класс хранит все поля даты и времени с точностью до наносекунд, а также смещение от UTC / Гринвич.Например, значение «2 октября 2007 года в 13: 45.30.123456789 +02: 00» может быть сохранено в OffsetDateTime.

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