首页 > 解决方案 > Jackson DateFormatter 设置时区而不更改时间

问题描述

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

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

我现在希望杰克逊 objectmapper 以以下格式打印出日期,例如:2018-01-01T13:00:00.000+0200

现在我有以下代码,我在其中设置了我的 objectmapper

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

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

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

问候

标签: javajacksonsimpledateformat

解决方案


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

非常重要: 您必须实施“克隆”方法。如果您使用 Eclipse,它只会显示缺少格式和解析方法的错误。克隆方法丢失了,我在 DateFormat 类中遇到了一些空指针异常。

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();
    }

}

推荐阅读