java - 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
在格式化日期和添加时区信息时,它会计算新时间。我所有的日期都使用“欧洲/柏林”时区,但我没有将它与数据库中的这些信息一起保存。
有什么方法可以在不更改时间的情况下添加时区信息?
问候
解决方案
解决方案是使用自定义 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();
}
}
推荐阅读
- php - 如何获取数组中每个数字的阶乘值?
- javascript - 使用 style-loader 访问 webpack 插件中生成的 css
- sql-server - 使用查询结果更新表中的列
- c# - 使用 C# 为 cmd 转义反斜杠
- bash - 内联数组替换
- react-native - React Native Navigation - startTabBasedApp - 如果单击则仅加载选项卡
- outlook - Jaspersoft 服务器 - 连接到 Microsoft Exchange
- hadoop - 德鲁伊中的确切不同计数
- sql-server - 特定时间范围的 TSQL 参数(前一天下午 4 点到今天中午)?
- css - 如何在 CSS 中有效地选择元素的所有直接子元素