🎉🎉《Spring Boot实战案例合集》目前已更新154个案例,我们将持续不断的更新。文末有电子书目录。
💪💪永久更新承诺
我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。
💌💌如何获取
订阅我们的合集《点我订阅》,并通过私信联系我们,我们将第一时间将电子书发送给您。
环境:SpringBoot3.4.2
1. 简介
在项目开发中,日期格式化是数据交互的核心需求之一。无论是用户界面展示、API接口响应,还是数据库持久化存储,不同场景对日期格式的要求存在显著差异:前端可能需要易读的yyyy-MM-dd格式,数据库存储偏好TIMESTAMP类型,而跨时区系统则需统一使用ISO 8601标准(如2025-01-01T14:30:00Z)。若处理不当,易导致时区错乱、解析失败或数据不一致等问题。如下默认Jackson默认日期输出格式:
该日期格式通常不是我们希望的格式,并且默认时区使用的是 "零时区",而对我们来说正确的是东八区(UTC+8)。
接下来,我们将系统梳理Spring Boot中Jackson库的5种日期格式化方案,帮助开发者根据业务需求选择最优实践。
环境准备
public record User(Long id, String name, Date createTime) {}("/query")public ResponseEntity<?> query() {return ResponseEntity.ok(new User(1L, "Pack_xg", new Date())) ;}
2.1 配置文件全局设置
在配置文件(application.yml或.properties)定义全局日期格式,统一处理所有日期字段。配置简单高效,适合全项目统一日期格式的场景,无需修改代码。
spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: "GMT+8"
如上配置后,再次访问接口
缺点:仅支持SimpleDateFormat格式,无法针对不同字段设置不同格式,灵活性差。若项目中有多种日期格式需求,需结合其他方式使用。如下源码:
2.2 @JsonFormat注解
在实体类字段上使用注解,精确控制单个字段的日期格式和时区。灵活性高,适合不同字段需要不同格式的场景(如生日用年月日,创建时间用年月日时分秒)。
public record User(Long id, String name,(pattern = "yyyy-MM-dd", timezone = "GMT+8") Date birthday,(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") Date createTime) {}
我们只需要在实体类中对应的字段上使用 @JsonFormat 注解即可。
缺点:需在每个日期字段上单独配置,若字段较多则代码冗余。无法动态修改格式,硬编码在实体类中。
2.3 自定义ObjectMapper
通过配置 Jackson2ObjectMapperBuilderCustomizer,可以设置 Jackson 默认的日期格式,实现全局统一的日期格式输出。这种方式适用于整个项目中所有日期字段需统一格式的情况,维护方便,适合大型项目使用。
public class JacksonConfig implements Jackson2ObjectMapperBuilderCustomizer {public void customize(Jackson2ObjectMapperBuilder builder) {builder.simpleDateFormat("yyyy-MM-dd HH:mm").timeZone("GMT+8") ;}}
此种方式的作用域与上面的application.yml方式一样。
缺点:强制全局统一格式。有特殊需求的地方就必须通过 @JsonFormat 进行修改。
2.4 使用@JsonComponent注解
通过 @JsonComponent 注解注册一个全局的日期序列化器,可以对所有 Date 类型进行统一格式化。这种方式适用于项目中所有日期字段都需要自定义格式,且希望集中管理格式逻辑。
public class GlobalDateSerializer extends JsonSerializer<Date> {public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;gen.writeString(sdf.format(date));}}
针对Date类型的序列化输出进行处理。
关于 @JsonComponent 更多用法,请查看下面链接:
Spring Boot 通过@JsonComponent注解完全控制JSON数据
2.5 @JsonSerialize + JsonSerializer
通过自定义类实现日期转换逻辑。适合需要特殊日期格式(如时间戳转特定字符串)的复杂场景。
public class DateSerializer extends JsonSerializer<Date> {public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-19 HH:mm:ss") ;gen.writeString(sdf.format(date));}}public record User(Long id, String name,Date birthday,(using = DateSerializer.class)Date createTime) {}
两者结合实现高度定制化日期转换逻辑。
缺点:需编写额外的序列化类,代码量较大。维护成本高,适合特殊需求,但普通场景显得过于复杂。
注:以上方式都支持Java8中的新的日期类型:LocalDate,LocalDateTime。
推荐文章
别等了!21 个 Spring Boot 高级技巧,开发效率瞬间翻倍
Spring Batch 秒级处理百万级数据,内存占用降低95%
技术专家:零代码,Spring Boot存储加密解密,支持JDBC、MyBatis及JPA
高级开发!弃用@ControllerAdvice,这种异常处理方式性能更佳
强大!Spring Boot 巧妙利用 SpEL 实现复杂的规则运算
请不要自己封装!Spring 自带24个工具类,让你开发效率飙升
强!Spring Boot + Camel 实现各种形式的消息路由(支持AI)
优雅!Chain 结合 Spring Boot 轻松实现强大的责任链模式


