杰克逊DateFormatter设置时区而不更改时间

时间:2018-09-17 15:22:52

标签: java jackson simpledateformat

我对杰克逊有问题。 我在数据库中有以下格式的日期: 2018-01-01 13:00:00

我将数据库条目转换为“日期”对象。

我现在希望杰克逊对象映射器以以下格式打印日期: 2018-01-01T13:00:00.000 + 0200

现在,我有以下代码在其中设置对象映射器

private static ObjectMapper init() {
    ObjectMapper mapper = new ObjectMapper();

    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM dd'T'HH:mm:ss.SSSZ");
    dateFormat.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
    mapper.setDateFormat(dateFormat);
    mapper.registerModule(new JavaTimeModule());
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    return mapper;
}

现在的问题是,日期打印如下: 2018-01-01T15:00:00.000 + 0200

格式化日期并添加时区信息时,它会计算新时间。我所有的日期都使用“欧洲/柏林”时区,但我没有将此信息与数据库一起保存。

有什么方法可以在不更改时间的情况下添加时区信息?

致谢

1 个答案:

答案 0 :(得分:0)

解决方案是使用自定义的DateFormat类,我可以在其中处理格式。

非常重要: 您必须实现“克隆”方法。如果使用Eclipse,则只会显示缺少格式和解析方法的错误。缺少克隆方法,并且在DateFormat类上出现了一些nullpointer异常。

mapper.setDateFormat(JsonDateFormat);

public class JsonDateFormat extends DateFormat implements Serializable, Cloneable {

    @Override
    public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
        // TODO DO STUFF
        return toAppendTo;
    }

    @Override
    public Date parse(String source, ParsePosition pos) {
        // TODO DO STUFF
        return null;
    }

    @Override
    public Object clone() {
        return new JsonDateFormat();
    }

}