java - 如何在 spring-mvc 中跳过杰克逊时区校正?
问题描述
我想配置jackson
为使用以下格式输出任何日期/时间值:
spring.jackson.date-format=yyyy-MM-dd'T'HH:mm:ss
我正在获取许多数据库行并将它们作为json
地图返回。
@RestController
public class MyService {
@GetMapping
public List<Map<String, Object>> get(Param params) {
return jdbcTemplate.queryForList(sql, params);
}
}
问题:数据库和 jvm 默认时区是Europe/Berlin
,因此是 UTC+2。因此,杰克逊java.sql.Timestamp
首先自动将任何数据库接收到的转换为 UTC(减去 2 小时),然后通过 json 输出它们。
在mysql
数据库本身中,它是一种datetime
类型。
但我只想让杰克逊“按原样”输出时间戳,无需事先转换!是否可以跳过时区校正?
我只想在没有对话的情况下忽略时区。把它剪掉。
解决方案
方法 #1:设置默认时区
您可以以 . 使用的日期格式设置时区ObjectMapper
。它将用于Date
和子类:
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(dateFormat);
在 Spring 应用程序中,要配置ObjectMapper
,您可以执行以下操作:
@Bean
public ObjectMapper objectMapper() {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(dateFormat);
return mapper;
}
在 Spring Boot 中,您可以使用该属性spring.jackson.time-zone
来定义时区:
spring.jackson.time-zone: Europe/Berlin
有关常见应用程序属性的更多详细信息,请参阅文档。
方法 #2:使用 Java 8 日期和时间 API
而不是使用Timestamp
,您可以考虑LocaDateTime
从JSR-310。它是在 Java 8 中引入的。“本地”日期和时间类(LocalDateTime
和LocalDate
)LocalTime
不依赖于任何一个地区或时区。从LocalDateTime
文档中:
此类不存储或表示时区。相反,它是对日期的描述,用于生日,结合挂钟上的当地时间。如果没有诸如偏移或时区之类的附加信息,它就不能代表时间线上的瞬间。
此答案将为您提供有关新日期和时间类的更多详细信息。
Jackson 有一个支持 JSR-310 类型的模块。将其添加到您的依赖项中:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.9</version>
</dependency>
然后在您的实例中注册JavaTimeModule
模块:ObjectMapper
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
大多数 JSR-310 类型将使用标准ISO-8601字符串表示进行序列化。如果需要自定义格式,可以使用自己的序列化器和反序列化器实现。有关详细信息,请参阅文档。
推荐阅读
- python-3.x - 导入我的包时出现 ModuleNotFoundError,但单独运行时不会
- python - Python - 通过 c_rating 创建平均估计工资条形图,但按性别执行 facet_wrap
- r - R中的二次规划求解函数
- react-native - 使用 Expo 在 Android 上的 react-native-paper 图标错误
- javascript - 如何获得与谷歌搜索栏下显示的相同的预测搜索数据
- r - 创建具有特定数据格式的关联图
- r - 在 r 中创建正负条形图
- json - JSON对象Swift中的JSON对象
- ionic-framework - 动态更改侧面时,Ionic 5 离子菜单无法正确设置动画
- python - 为什么函数有时返回 0 有时返回 False?