如何使用 Jackson 反序列化 JS 日期?

2022-08-31 13:24:27

我从ExtJS获得一个日期字符串,格式为:

“2011-04-08T09:00:00”

当我尝试反序列化此日期时,它会将时区更改为印度标准时间(将+ 5:30添加到时间)。这就是我反序列化日期的方式:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);

这样做也不会改变时区。我仍然在IST中得到日期:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);

如何以日期的方式反序列化日期,而不会有时区的麻烦?


答案 1

我找到了一个解决方法,但有了这个,我需要在整个项目中注释每个日期的设置者。有没有办法在创建对象映射器时指定格式?

以下是我所做的:

public class CustomJsonDateDeserializer extends JsonDeserializer<Date>
{
    @Override
    public Date deserialize(JsonParser jsonParser,
            DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        String date = jsonParser.getText();
        try {
            return format.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }

    }

}

并注释了每个日期字段的 setter 方法,如下所示:

@JsonDeserialize(using = CustomJsonDateDeserializer.class)

答案 2

这对我有用 - 我正在使用杰克逊2.0.4

ObjectMapper objectMapper = new ObjectMapper();
final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
objectMapper.setDateFormat(df);