Java Jackson JsonParser将DateTime按月偏移-1

Java Jackson JsonParser将DateTime按月偏移-1,java,datetime,jackson,Java,Datetime,Jackson,我的应用程序应该通过HTTP请求接收JSON消息,我正在使用自定义反序列化程序映射一些类的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 d

我的应用程序应该通过HTTP请求接收JSON消息,我正在使用自定义反序列化程序映射一些类的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;
    }
}

我的问题是“final String date=p.readValueAs(String.class)”。p包含收到的值,其月份被-1抵消。

通过以下操作修复日期偏移:

// "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);

在属性中添加以下内容 spring.datasource.url=jdbc:mysql://Schema:YourDBusername 而DbPssword?usesl=false&useLegacyDatetimeCode=false&zeroDateTimeBehavior=convertToNull

spring.jackson.serialization.WRITE_DATES_为_TIMESTAMPS=false
spring.jackson.timezone=UTC

您不需要自定义反序列化程序。可以使用日期格式对属性进行注释,如下所示

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

这就应该奏效了。请参阅此问题的答案:

我的问题是“final String date=p.readValueAs(String.class)”。p包含收到的值,其月份被-1抵消。@M.Chris:如果删除所有剩余的代码,您的问题会更清楚。。。理想情况下,提供一个。
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
public ZonedDateTime getTime() {
    return time;
}