Java 自定义反序列化格式为的日期

Java 自定义反序列化格式为的日期,java,jackson,Java,Jackson,[“上次修改”])]有根本原因 java.time.format.DateTimeParseException:无法分析文本“2018-06-06T13:19:53+00:00”,在索引19处找到未分析的文本 入站格式为2018-06-06T13:19:53+00:00 这是一种奇怪的格式 我尝试了以下方法: public class XYZ { @DateTimeFormat(pattern = "yyyy-MM-ddTHH:mm:ss+00:00", iso = ISO.DATE

[“上次修改”])]有根本原因 java.time.format.DateTimeParseException:无法分析文本“2018-06-06T13:19:53+00:00”,在索引19处找到未分析的文本

入站格式为
2018-06-06T13:19:53+00:00

这是一种奇怪的格式

我尝试了以下方法:

public class XYZ {  
    @DateTimeFormat(pattern = "yyyy-MM-ddTHH:mm:ss+00:00", iso = ISO.DATE_TIME)
    private LocalDateTime lastModified;
}  
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {

    private static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ss+00:00";

    private final DateTimeFormatter formatter;

    public LocalDateTimeDeserializer() {
        this.formatter = DateTimeFormatter.ofPattern(PATTERN);
    }

    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return LocalDateTime.parse(p.getText(), formatter);
    }
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
objectMapper.setDateFormat(df);
入站格式为
2018-06-06T13:19:53+00:00

这是一种奇怪的格式

这是一种格式,由和认可:


当接收作为查询参数的值时,以下各项应按预期工作:

@DateTimeFormat(iso=DateTimeFormat.iso.DATE\u-TIME)
私有LocalDate-dateTime;
由于
2018-06-06T13:19:53+00:00
表示与UTC偏移的日期和时间,因此最好使用,而不是:

@DateTimeFormat(iso=DateTimeFormat.iso.DATE\u-TIME)
私人OffsetDateTime日期时间;
只需确保
+
编码为
%2B


使用Jackson,您可以将
Jackson-datatype-jsr310
依赖项添加到应用程序中。本模块将为您提供和的类型


com.fasterxml.jackson.datatype
您的计算机中的模块:

ObjectMapper mapper=new ObjectMapper();
registerModule(新的JavaTimeModule());
禁用(SerializationFeature.WRITE_DATES_作为时间戳);
Jackson将为您处理序列化和反序列化

如果出于某种原因,您对UTC的偏移量不感兴趣,并且希望继续使用,则可以扩展Jackson提供的,并使用自定义的:

公共类CustomLocalDateTimeDeserializer扩展LocalDateTimeDeserializer{
公共CustomLocalDateTimeDeserializer(){
super(DateTimeFormatter.ISO\u OFFSET\u DATE\u TIME);
}
}
然后对字段进行注释,如下所示:

@JsonDeserialize(使用=CustomLocalDateTimeDeserializer.class)
私有LocalDateTime日期时间;

没有任何东西可以阻止您创建自己的反序列化程序。下面是一个非常简单的例子:

public class XYZ {  
    @DateTimeFormat(pattern = "yyyy-MM-ddTHH:mm:ss+00:00", iso = ISO.DATE_TIME)
    private LocalDateTime lastModified;
}  
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {

    private static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ss+00:00";

    private final DateTimeFormatter formatter;

    public LocalDateTimeDeserializer() {
        this.formatter = DateTimeFormatter.ofPattern(PATTERN);
    }

    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return LocalDateTime.parse(p.getText(), formatter);
    }
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
objectMapper.setDateFormat(df);
入站格式为2018-06-06T13:19:53+00:00

如果能够在整个ObjectMapper上设置日期格式,则可以执行以下操作:

public class XYZ {  
    @DateTimeFormat(pattern = "yyyy-MM-ddTHH:mm:ss+00:00", iso = ISO.DATE_TIME)
    private LocalDateTime lastModified;
}  
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {

    private static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ss+00:00";

    private final DateTimeFormatter formatter;

    public LocalDateTimeDeserializer() {
        this.formatter = DateTimeFormatter.ofPattern(PATTERN);
    }

    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return LocalDateTime.parse(p.getText(), formatter);
    }
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
objectMapper.setDateFormat(df);

这是

中的一部分示例,尝试了一些答案,这一个效果最好。