Джексон deserialize ISO8601 fromatted дата-время в Java8 Мгновенное действие

Я пытаюсь десериализовать дату форматирования ISO8601 в Java8 Instant, используя Jackson. Я зарегистрировал JavaTimeModule с ObjectMapper, отключил WRITE_DATES_AS_TIMESTAMPS.

Однако, если вы попытаетесь десериализовать 2016-03-28T19: 00: 00.000 + 01: 00, это не сработает, потому что кажется, что JavaTimeModule будет десериализовать дату-время, отформатированное с учетом смещения часовой пояс UTC (например, 2016-03- 28T18: 00: 00.000Z). Затем я попытался использовать аннотацию @JsonFormat следующим образом:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "UTC")

И вот так:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = JsonFormat.DEFAULT_TIMEZONE)

Однако ни одна из этих функций не работает, и я получаю исключение:

com.fasterxml.jackson.databind.JsonMappingException: Unsupported field: YearOfEra (through reference chain: org.example.Article["date"])

Это означает, что параметр часового пояса игнорируется, а формат времени даты не знает, как форматировать Instant без часового пояса.

Есть ли способ десериализовать строку ISO8601, которая не относится к смещению часовой пояс UTC к Java 8 Мгновенно, используя Jackson и JavaTimeModule без написания пользовательского десериализатора?

Ответы

Ответ 2

Формат "Z" не работает с "+01: 00", поскольку это другой шаблон. JsonFormat использует шаблоны SimpleDateFormat. "Z" в верхнем регистре представляет только строгий RFC 822. Вы должны использовать синтаксис, например: "+0100", без двоеточия.

Смотрите: ISO 8601: 2004, Шаблоны SimpleDateFormat