Java Jackson JsonParser将DateTime按月偏移-1
我的应用程序应该通过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。你知道这是什么原因吗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
@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;
}