2015-05-12 2 views
12

В Java 8 раз/JSR 310/threeten.org портировать ...Как работать с «необязательным» T в метке времени ISO-8601 в Java 8/JSR 310/threeten.org?

Q: Как разобрать ISO-8601 метки времени или с «T» или пробел «» между датой частью и времени часть?

формат ISO-8601 для временных меток определяет буквальный «T», чтобы отделить спецификацию даты от времени спецификации:

2015-05-12T15:42:00.123 

Многих приложений генерировать временные метки в этом формате с пробелом «» полукокс вместо ' Т». Ссылки показывают, что ISO-8601 допускает это по соглашению .

2015-05-12 15:42:00.123 

Поскольку я глотание данных из нескольких источников, которые я хочу, чтобы либо «T» или пространство «».

Я наблюдаю, что строка шаблона позволяет указать дополнительные компоненты, но я не вижу какой-либо способ определения «выбора» в строке шаблона ...

Q: Есть ли способ, чтобы сделать «выбрать-точно-один-из-следующего» в строке шаблона JSR 310?

Я был в состоянии получить эту работу путем построения DateTimeFormatter с двумя дополнительными узорами:

DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder() 
    .appendOptional(DateTimeFormatter.ISO_LOCAL_DATE_TIME) 
    .optionalStart().appendPattern("yyyy-MM-dd HH:mm:ss.SSS").optionalEnd() 
    .toFormatter(); 

Видя optionalStart() и optionalEnd() привел меня к:

DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder() 
    .appendPattern("[yyyy-MM-dd HH:mm:ss.SSS][yyyy-MM-dd'T'HH:mm:ss.SSS]") 
    .toFormatter(); 

Однако, Я не уверен, что это правильно способ справиться с этой ситуацией ...

В: Что такое Лучшее решение решение для обработки нескольких шаблонов DateTime?

Заранее спасибо.

+1

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

+3

Просто обратите внимание, что java.time не имеет специального способа обработки двух параметров во время разбора, таких как «» или «T». Это было бы разумным дополнением к API. Два вышеупомянутых решения будут успешно анализировать пустую строку или строку с двумя датами, поэтому вам нужно проверить их. – JodaStephen

+0

> будет успешно разбирать пустую строку или строку с двумя датами - . Меня беспокоило разбор двух дат ... не понимал, что также будет проходить пустая строка. Я напишу еще несколько тестов. Благодарю. –

ответ

6

Cleanse входных данных

Моя собственная практика:

  • Включите T по умолчанию.
  • Очистить входные данные до, вызывая java.time (или Joda-Time).

При приеме текста вне моего собственного кода I never доверять таким внешним входам. Черт, я даже не верю своим собственным внутренним входам. Я всегда ставил такие данные через уборщика. В рамках этой очистки я заменяю любой символ SPACE в любой ожидаемой строке ISO 8601 с помощью T.

String datetimeInput = input.replace(" ", "T") ; 

Я также привычку называть Google Guava библиотеку подрезать whitespace из входной строки. См. this Answer.

И проверьте наличие NULL, непечатаемых и других неприемлемых символов. Эти непечатные файлы делают для неприятных ошибок.

Только после этого я вызываю библиотеки времени (Joda-Time или java.time).

Trap Синтаксического Исключение

Кроме того, вы должны использовать try-catch ловушку для синтаксического анализа exception более корректно обрабатывать, когда строка ввода даты и время не соответствует вашим ожиданиям.

+0

> Я заменяю любой символ SPACE в любой ожидаемой строке ISO 8601 с помощью T . Это хороший совет и, кажется, самый чистый способ справиться с этой проблемой. –