Java 使用ObjectMapper';setDateFormat';和使用@JsonDeserialize的自定义日期反序列化程序

Java 使用ObjectMapper';setDateFormat';和使用@JsonDeserialize的自定义日期反序列化程序,java,json,date,simpledateformat,json-deserialization,Java,Json,Date,Simpledateformat,Json Deserialization,我正在尝试使用将文件中的JSON转换为Java对象 JSON文件:sample-date-str.JSON { "eventDate"="2017-06-27 10:04:26.573503+05:30" } javapojo:SampleDatePOJO class SampleDatePOJO{ private Date eventDate; getter and setter.... toString... } 用于将JSON转换为Java对象的J

我正在尝试使用将文件中的JSON转换为Java对象

JSON文件:sample-date-str.JSON

{
    "eventDate"="2017-06-27 10:04:26.573503+05:30"
}
javapojo:SampleDatePOJO

class SampleDatePOJO{

    private Date eventDate;

    getter and setter....

    toString...
}
用于将JSON转换为Java对象的Java代码:

ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSX")); //this will convert Date to IST format which is okay.
SampleDatePOJO sampleDatePOJO = mapper.readValue(new File("sample-date-str.json"), SampleDatePOJO.class);
System.out.println(sampleDatePOJO.getEventDate()); //this gives output "Tue 
Jun 27 10:43:59 IST 2017"
注意:如果我删除mapper.setDateFormat(..)并在“eventDate”字段上使用@JsonFormat(pattern=“yyyy-MM-dd HH:MM:ss.ssssss x”,timezone=“IST”),它将给出相同的输出

自定义反序列化程序的Java代码

public class CustomDateDeserializer extends JsonDeserializer<Date>{

    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSXXX");

        Date dateTmp = null;
        try {
            dateTmp = sdf.parse(p.getValueAsString());
        } catch (ParseException e) {

            e.printStackTrace();
        }
        return dateTmp;
    }
}
收到的输出为:

System.out.println(sampleDatePOJO.getEventDate())//“2017年6月27日星期二10:13:59 IST”

这是正确的,因为毫秒“573503”部分添加到日期

我需要理解为什么我的setDateFormat和@JsonFormat不起作用。或者,如果它们工作正常,为什么相同格式的输出会有差异。
非常感谢您的帮助。

您是否注意到,在前两次转换中,您使用的是日期模式中的单个
X
(yyyy-MM-dd HH:MM:ss.ssssss X)
。 但是在定制的序列化程序中,您使用的是正确的
XXX
(yyyy-MM-dd-HH:MM:ss.ssssss-XXX)


这种模式差异实际上导致了所有差异(30分钟的差异)。如果在不同的机制中使用相同的模式,那么输出也将保持不变。

但为什么要将573503视为毫秒?他们不是打算从另一端算起微秒(百万分之一秒)吗?相关:。请看:如果模式为“X”,时区为“GMT+05:30”,则生成“+05”。由于只有一个
X
,偏移量中的30分钟将被忽略,
SimpleDateFormat
会把一切都搞糟。同样,作为@OleV.V。在上面的评论中说,你确定你真的想考虑573503毫秒,并把它添加到日期吗?这听起来不是更正确的方法,因为小数点后的所有内容都应该被视为秒的分数。
@JsonDeserialize(using=CustomDateDeserializer.class)