Я пытаюсь проанализировать следующую строку даты, полученную из полезной нагрузки события Bitbucket :
2017-09-19T10:39:36+1000
Когда входящая дата находится в смещении +0000
, тогда она работает, но +1000
не.
Это немного нестандартная (с точки зрения JDK) строка даты, в которой в смещении нет двоеточия.Поэтому я создал пользовательский DateTimeFormatter, который работает, когда смещение равно +0000
:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.optionalStart()
.appendOffset("+HHMM", "+0000")
.optionalEnd()
.toFormatter();
Однако, когда смещение равно +1000
, как указано выше, происходит сбой с:
Невозможно десериализовать значение типа java.time.OffsetDateTime
из строки «2017-09-19T10: 39: 36 + 1000»: не удалось десериализовать java.time.OffsetDateTime: (java.time.format.DateTimeParseException) Text '2017-09-19T10: 39: 36 + 1000 'не удалось проанализировать по индексу 19
Если в полученной строке даты используется смещение +0000
, то это работает.Как я могу проанализировать все часовые пояса?
Обновление - Дополнительный контекст:
Используется для создания экземпляра JavaTimeModule, используемого для информирования ObjectMapper о формате входящей даты:
JavaTimeModule javaTimeModule = new JavaTimeModule();
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.optionalStart()
.appendOffset("+HHMM", "+0000")
.optionalEnd()
.toFormatter();
// This also fails:
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssx");
LocalDateTimeDeserializer deserializer = new LocalDateTimeDeserializer(formatter);
javaTimeModule.addDeserializer(LocalDateTime.class, deserializer);
// MAPPER is an instance of com.fasterxml.jackson.databind.ObjectMapper
MAPPER.registerModule(javaTimeModule);