大数跨境
0
0

Spring Boot中JSON日期处理的5种骚操作

Spring Boot中JSON日期处理的5种骚操作 Spring全家桶实战案例
2025-08-07
0
导读:Spring Boot 中 JSON 日期处理的5种方式
Spring Boot 3实战案例锦集PDF电子书已更新至130篇!

🎉🎉《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种日期格式化方案,帮助开发者根据业务需求选择最优实践。

2.实战案例

环境准备

public record User(Long id, String name, Date createTime) {}
@GetMapping("/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:ss    time-zone: "GMT+8"

如上配置后,再次访问接口

缺点:仅支持SimpleDateFormat格式,无法针对不同字段设置不同格式,灵活性差。若项目中有多种日期格式需求,需结合其他方式使用。如下源码:

2.2 @JsonFormat注解

在实体类字段上使用注解,精确控制单个字段的日期格式和时区。灵活性高,适合不同字段需要不同格式的场景(如生日用年月日,创建时间用年月日时分秒)。

public record User(    Long id, String name,     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8"Date birthday,    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8"Date createTime) {}

我们只需要在实体类中对应的字段上使用 @JsonFormat 注解即可。

缺点:需在每个日期字段上单独配置,若字段较多则代码冗余。无法动态修改格式,硬编码在实体类中。

2.3 自定义ObjectMapper

通过配置 Jackson2ObjectMapperBuilderCustomizer,可以设置 Jackson 默认的日期格式,实现全局统一的日期格式输出。这种方式适用于整个项目中所有日期字段需统一格式的情况,维护方便,适合大型项目使用。

@Componentpublic class JacksonConfig implements Jackson2ObjectMapperBuilderCustomizer {  @Override  public void customize(Jackson2ObjectMapperBuilder builder) {    builder.simpleDateFormat("yyyy-MM-dd HH:mm").timeZone("GMT+8") ;  }}

此种方式的作用域与上面的application.yml方式一样。

缺点:强制全局统一格式。有特殊需求的地方就必须通过 @JsonFormat 进行修改。

2.4 使用@JsonComponent注解

通过 @JsonComponent 注解注册一个全局的日期序列化器,可以对所有 Date 类型进行统一格式化。这种方式适用于项目中所有日期字段都需要自定义格式,且希望集中管理格式逻辑。

@JsonComponentpublic class GlobalDateSerializer extends JsonSerializer<Date> {
  @Override  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> {
  @Override  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,    @JsonSerialize(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 轻松实现强大的责任链模式

性能优化!Spring大事务7条优化建议及示例

请不要自己写!Spring Boot非常实用的内置功能

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读38
粉丝0
内容832