@jsonformat注解用于控制java日期字段的序列化与反序列化格式,需配合pattern和timezone(如"gmt+8")使用,并确保javatimemodule已注册以支持java.time类型。

在 Java 中使用 Jackson 库时,@JsonFormat 注解是控制日期字段序列化与反序列化格式最常用的方式。只要正确配置 pattern 和时区(必要时),就能让 Date、LocalDateTime、ZonedDateTime 等类型按指定格式(如 "yyyy-MM-dd HH:mm:ss")输出或解析。
确保字段类型支持 @JsonFormat
@JsonFormat 对不同日期类型的支持略有差异:
- java.util.Date / Calendar:原生支持,直接加注解即可
-
java.time.LocalDateTime:需搭配
@JsonDeserialize+@JsonSerialize或启用 JavaTimeModule(Jackson 2.6+ 默认注册) -
java.time.LocalDate / LocalTime:同样依赖 JavaTimeModule,pattern 需匹配(如
"yyyy-MM-dd")
若用的是 LocalDateTime 却没生效,大概率是缺少模块注册 —— Spring Boot 项目通常自动配置,纯 Jackson 需手动添加:
ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule());
正确写法示例(含时区建议)
仅写 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 可能导致时区问题(如序列化成 UTC 时间但显示为本地时间)。推荐显式指定时区:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 全局默认时区(推荐):
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - 使用系统默认:
timezone = "GMT+8"或timezone = "Asia/Shanghai" - 若不设 timezone,Jackson 默认用 UTC,可能和前端预期不符
示例实体类:
public class Event {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime updateTime;
}
注意反序列化时的 pattern 兼容性
当 JSON 输入为字符串(如 "2024-05-20 14:30:00")时,pattern 必须严格匹配,否则抛 JsonProcessingException:
- 输入含秒:pattern 必须含
ss;不含秒则不能写ss - 输入带毫秒(如
"2024-05-20 14:30:00.123"):pattern 应为"yyyy-MM-dd HH:mm:ss.SSS" - 建议前后端约定统一格式,避免因空格、大小写(如
HHvshh)导致失败
Spring Boot 全局配置替代方案
若多个字段都用相同格式,可避免重复注解,改用全局配置:
- 在
application.yml中设置:
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
- 该配置对
Date类型生效;LocalDateTime还需额外配置:
spring:
jackson:
serialization:
write-dates-as-timestamps: false
java-time-module:
date-format: yyyy-MM-dd HH:mm:ss
此时字段上可省略 @JsonFormat,保持代码简洁。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










