SpringBoot 日期格式化的两种方式

createh516小时前技术教程2

在Spring Boot中处理日期格式化是一个常见的需求,涉及数据库存储、接口参数传递、序列化等场景。以下是综合多个实践和最佳方案的总结:

一、全局日期格式化配置

通过配置文件统一设置全局日期格式,适用于大部分场景,减少代码侵入性:

  1. 返回前端格式化
    在application.yml中配置Jackson的全局日期格式和时区:
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss  # 统一返回格式
    time-zone: GMT+8                 # 时区设置
    serialization:
      write-dates-as-timestamps: false  # 禁用时间戳格式

效果:所有DateLocalDateTime类型的字段会按照指定格式返回给前端

  1. 返回时间戳格式
    若需返回时间戳(如兼容旧系统):
spring:
  jackson:
    serialization:
      write-dates-as-timestamps: true  # 启用时间戳

二、注解方式处理

针对特定字段或场景,使用注解灵活控制格式:

  1. @JsonFormat(出参格式化)
    在实体类字段上指定返回格式和时区:
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date createDate;

该注解影响JSON序列化,适用于返回给前端的字段

  1. @DateTimeFormat(入参格式化)
    处理接口入参的日期字符串转换:
@PostMapping("/test")
public void test(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date date) {
    // ...
}

适用于GET请求参数或表单提交

三、自定义参数转换器

处理复杂日期格式或多种输入类型(如支持yyyy-MM、yyyy-MM-dd HH:mm等):

  1. 实现Converter接口
    自定义字符串到LocalDateTime的转换逻辑:
@Bean
public Converter localDateTimeConverter() {
    return source -> LocalDateTime.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
}

需在配置类中注册,支持多种格式的正则匹配

四、数据库与Java类型映射建议

  1. 数据库字段类型

日期时间:datetime(范围广)或timestamp(带时区)

纯日期:date

  1. Java类型选择

传统日期:java.util.Date(需注意线程安全问题)

Java 8+:优先使用LocalDateTime、LocalDate等新时间API,避免时区混乱

五、常见问题与最佳实践

  1. 时区问题
    所有配置必须明确指定时区(如GMT+8),否则默认使用系统时区,可能导致时间偏差
  2. 兼容性处理

前端传参:支持字符串(yyyy-MM-dd HH:mm:ss)或时间戳。

序列化工具:若使用Fastjson,需配合@JSONField(format="...")注解

  1. 全局与局部配置结合

推荐方案:全局配置为主,结合@JsonFormat处理特殊字段。

避免冲突:不要同时启用全局格式化和时间戳配置

六、扩展场景

  1. 处理@RequestBody的日期参数
    使用@JsonFormat注解实体类字段,或通过自定义DateFormat类实现复杂解析逻辑
  2. 旧系统兼容
    若需支持JSON-Lib格式,需注意Fastjson无法反序列化,建议统一为时间戳或标准字符串

总结

  • 简单场景:全局配置 + @JsonFormat注解。
  • 复杂需求:自定义转换器 + 全局时区设置。
  • 数据库设计:结合业务选择datetime或timestamp,Java类型优先使用新时间API

相关文章

java 判断Date是上午还是下午

我要用Java生成表格统计信息,如下图所示:所以就诞生了本文的内容。在 Java 里,判断 Date 对象代表的时间是上午还是下午有多种方式,下面为你详细介绍不同的实现方法。方式一:使用java.ut...

吊打面试官(十一)--Java语言中日期处理相关问题总结

导读在Java中,日期处理是必然遇到的场景,也是问题较多的场景。下面我们将收集的日期问题场景做一个汇总。祝大家面试必过,吊打面试官。让我们0帧起手,开始说具体问题。1. 日期格式化大小写问题问题描述:...

玩转MySQL的时间类型:Date、DateTime、TimeStamp、Time

Mysql时间类型介绍在MySQL中,有四种不同的时间类型:DATE、DATETIME、TIMESTAMP和TIME。它们分别表示不同精度和范围的时间。DATE类型DATE类型用于存储日期,格式为'Y...

Java编程的那些屎山代码分析之一

在编程行业干过这么多年,已经学会了从代码看人,代码会告诉我们,这个人在这一行能否吃饱饭,能吃到多少肉。以下是个人总结的一些代码习惯问题和优化,单独一个也许不起眼,但堆积起来,就让一个项目代码变成一座屎...

日期和时间,你真的会输入吗?

日期和时间是Excel中一种特殊类型的数据,有关日期和时间的计算在各个领域中都有非常广泛的应用。以下讲解日期和时间类数据的特点及计算方法,以及日期与时间函数的相关应用。1. 输入日期数据按组合键,可以...