Spring Boot返回Date的格式由UTC改为时间戳

在升级到SpringBoot2.0后,发现日期对象自动转换为UTC字符串,而非时间戳。本文介绍如何通过在application.properties中添加配置项,使SpringBoot恢复将Date对象转换为时间戳的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前使用spring boot 1.5.9,返回的对象中有Date自动回转换为时间戳,但是换了2.0.0版本后,spring 自动给转成UTC字符串了。需要修改配置,在application.properties添加:

spring:
  jackson:
    serialization:
      write-dates-as-timestamps: true
### Spring Boot 处理时间戳 在开发基于 Spring Boot 的应用程序时,处理时间戳是一个常见的需求。为了确保日期和时间数据的一致性和准确性,Spring 提供了几种方法来操作时间戳。 #### 使用 `@JsonFormat` 注解格式时间戳 当需要序列化或反序列化 Java 对象中的日期字段时,可以通过 `@JsonFormat` 来指定输出的时间格式: ```java import com.fasterxml.jackson.annotation.JsonFormat; import java.util.Date; public class Event { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date eventDate; // getter and setter methods... } ``` 此配置会将 `eventDate` 字段按照设定的模式转换成字符串形式返回给客户端[^1]。 #### 利用 `LocalDateTime` 和 `ZonedDateTime` 类型 Java 8 引入了新的日期时间 API,在 Spring Boot 应用里推荐优先考虑这些类而不是传统的 `java.util.Date` 或者 `Calendar`。对于存储带有时区信息的时间点来说,应该选用 `ZonedDateTime`; 如果只需要记录本地发生的具体时刻,则可采用 `LocalDateTime`: ```java import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; // 创建当前时间的对象实例 LocalDateTime now = LocalDateTime.now(); // 将其转化为特定格式的字符串表示 String formattedNow = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")); // 转换成 ZonedDataTime 并设置为中国标准时间 CST (UTC+08:00) ZonedDateTime zdtCst = now.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("Asia/Shanghai")); ``` 上述代码片段展示了如何创建并格式化不同类型的日期对象以及调整至不同的时区。 #### 自定义 Jackson 序列化器/反序列化器 如果默认的行为无法满足业务逻辑的要求,还可以自定义 Jackson 的序列化方式。这允许开发者完全控制 JSON 数据交换过程中关于时间戳的部分是如何被解析出来的: ```java import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; @Component public class CustomJacksonConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer customTimestampSerialization() { return builder -> builder.serializerByType(LocalDateTime.class, new ToStringSerializer()) .deserializerByType(LocalDateTime.class, new StdDeserializer<>(LocalDateTime.class) { @Override public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String dateStr = p.getValueAsString(); DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; return LocalDateTime.parse(dateStr, formatter); } }); } } ``` 这段配置使得所有的 `LocalDateTime` 类型都会自动地以 ISO 8601 格式的字符串进行传输,并且能够正确地从这种格式重新构建回原始的数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值