SpringBoot 日期格式化的两种方式
在Spring Boot中处理日期格式化是一个常见的需求,涉及数据库存储、接口参数传递、序列化等场景。以下是综合多个实践和最佳方案的总结:
一、全局日期格式化配置
通过配置文件统一设置全局日期格式,适用于大部分场景,减少代码侵入性:
- 返回前端格式化
在application.yml中配置Jackson的全局日期格式和时区:
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss # 统一返回格式
time-zone: GMT+8 # 时区设置
serialization:
write-dates-as-timestamps: false # 禁用时间戳格式
效果:所有Date或LocalDateTime类型的字段会按照指定格式返回给前端
- 返回时间戳格式
若需返回时间戳(如兼容旧系统):
spring:
jackson:
serialization:
write-dates-as-timestamps: true # 启用时间戳
二、注解方式处理
针对特定字段或场景,使用注解灵活控制格式:
- @JsonFormat(出参格式化)
在实体类字段上指定返回格式和时区:
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date createDate;
该注解影响JSON序列化,适用于返回给前端的字段
- @DateTimeFormat(入参格式化)
处理接口入参的日期字符串转换:
@PostMapping("/test")
public void test(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date date) {
// ...
}
适用于GET请求参数或表单提交
三、自定义参数转换器
处理复杂日期格式或多种输入类型(如支持yyyy-MM、yyyy-MM-dd HH:mm等):
- 实现Converter接口
自定义字符串到LocalDateTime的转换逻辑:
@Bean
public Converter localDateTimeConverter() {
return source -> LocalDateTime.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
}
需在配置类中注册,支持多种格式的正则匹配
四、数据库与Java类型映射建议
- 数据库字段类型
日期时间:datetime(范围广)或timestamp(带时区)
纯日期:date
- Java类型选择
传统日期:java.util.Date(需注意线程安全问题)
Java 8+:优先使用LocalDateTime、LocalDate等新时间API,避免时区混乱
五、常见问题与最佳实践
- 时区问题
所有配置必须明确指定时区(如GMT+8),否则默认使用系统时区,可能导致时间偏差 - 兼容性处理
前端传参:支持字符串(yyyy-MM-dd HH:mm:ss)或时间戳。
序列化工具:若使用Fastjson,需配合@JSONField(format="...")注解
- 全局与局部配置结合
推荐方案:全局配置为主,结合@JsonFormat处理特殊字段。
避免冲突:不要同时启用全局格式化和时间戳配置
六、扩展场景
- 处理@RequestBody的日期参数
使用@JsonFormat注解实体类字段,或通过自定义DateFormat类实现复杂解析逻辑 - 旧系统兼容
若需支持JSON-Lib格式,需注意Fastjson无法反序列化,建议统一为时间戳或标准字符串
总结
- 简单场景:全局配置 + @JsonFormat注解。
- 复杂需求:自定义转换器 + 全局时区设置。
- 数据库设计:结合业务选择datetime或timestamp,Java类型优先使用新时间API