Джексон JsonParser смещает DateTime месяц на -1 - PullRequest
0 голосов
/ 23 января 2020

Мое приложение должно получать сообщение JSON через HTTP-запрос, и я использую собственный десериализатор для сопоставления свойств LocalDateTime некоторых из моих классов. Но когда я получаю информацию через JsonParser, месяц смещается на -1.

Например, отправляемое сообщение: «2020-10-12T10: 20: 00.000Z» и сообщение внутри JsonParser: «2020-09-12T10: 20: 00.000Z».

Я использую Jackson 2.9.6 и SpringBoot 2.1.3. Любые идеи, что может быть причиной этого?

@Override
public LocalDate deserialize(final JsonParser p, final DeserializationContext ctxt)
        throws IOException {
    final String date = p.readValueAs(String.class);
    if (date == null) {
        return null;
    }

    try {
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        ZonedDateTime dateToParse = ZonedDateTime.parse(date, DateTimeFormatter.ISO_DATE_TIME);
        return dateToParse.toLocalDate();
    } catch (final DateTimeParseException ex) {
        LOGGER.error(ex.getMessage());
        return null;
    }
}

Моя проблема находится на "окончательная дата строки = p.readValueAs (String.class)". p содержит полученное значение, а его месяц смещен на -1.

Ответы [ 3 ]

0 голосов
/ 23 января 2020

добавьте ниже в свойствах spring.datasource.url = jdb c: mysql: // Схема: YourDBusername и DbPssword? UseSSL = false & useLegacyDatetimeCode = false & zeroDateTimeBehavior = convertToNull

springrial.jackson. WRITE_DATES_AS_TIMESTAMPS = ложь spring.jackson.time-zone = UT C

0 голосов
/ 23 января 2020

Вам не нужен специальный десериализатор. Вы можете аннотировать вашу собственность в формате даты следующим образом

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
public ZonedDateTime getTime() {
    return time;
}

И это должно сработать. См. Ответ на этот вопрос: Spring Data JPA - формат ZonedDateTime для json сериализация

0 голосов
/ 23 января 2020

Исправьте смещение даты, выполнив что-то вроде этого:

// "2020-00-01'T'12:00:00.00'0'"
String date = p.readValueAs(String.class); 
int month = Integer.parseInt(date.substring(5, 7)) + 1;
date = date.substring(0, 5) + (month < 10 ? "0" : "") + month + date.substring(7);

Вы не используете DateTimeFormatter, который вы создаете, вместо этого вы используете константу ISO_DATE_TIME.

Попробуйте использовать тот, который вы создаете:

DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
ZonedDateTime dateToParse = ZonedDateTime.parse(date, df);
...