java中配置jackson日期格式有三类方式:全局配置(application.yml设date-format、time-zone等,推荐统一格式)、@jsonformat注解(字段级灵活控制)、自定义序列化器(应对复杂逻辑)。需注意date/calendar受时区影响,localdatetime不受time-zone控制,instant建议保持iso-8601格式。

Java 中配置 Jackson 自定义日期和时间序列化格式,核心是控制 Jackson 如何把 Date、LocalDateTime 等类型转成 JSON 字符串。方式分三类:全局配置最省力,注解方式最灵活,自定义序列化器最可控。选哪种取决于项目规模、统一性要求和是否需差异化处理。
全局配置(推荐用于统一格式)
适用于 Spring Boot 项目,通过 application.yml 一次性设定所有日期字段的输出样式:
- 必须关闭时间戳输出:
spring.jackson.serialization.write-dates-as-timestamps: false - 指定格式字符串:
spring.jackson.date-format: yyyy-MM-dd HH:mm:ss(注意是 JavaSimpleDateFormat语法) - 显式声明时区:
spring.jackson.time-zone: Asia/Shanghai,避免服务器默认时区导致偏差 - 对 Java 8 时间类(如
LocalDateTime)也生效,Spring Boot 2.0+ 默认已注册JavaTimeModule
示例配置:
spring:jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: Asia/Shanghai
serialization:
write-dates-as-timestamps: false
@JsonFormat 注解(适合局部或差异化控制)
在字段或 getter 方法上直接标注,优先级高于全局配置,适合个别字段需要特殊格式(如只显示日期、用斜杠分隔等):
- 作用于
java.util.Date、Calendar、LocalDateTime、Instant等标准类型 - 写法:
@JsonFormat(pattern = "yyyy/MM/dd HH:mm", timezone = "GMT+8") - 若用在 getter 上(如
getCreatedAtFormatted()),可派生只读格式化字段,不污染原始数据结构
自定义序列化器(应对复杂逻辑或非标类型)
当需要动态格式(如按用户偏好切换)、处理 Joda-Time 或自定义时间包装类时使用:
- 继承
JsonSerializer<t></t>,重写serialize()方法,手动调用DateTimeFormatter或SimpleDateFormat - 注册到 ObjectMapper:
objectMapper.registerModule(new SimpleModule().addSerializer(MyDate.class, new MyDateSerializer())) - 或直接在字段上标注:
@JsonSerialize(using = CustomLocalDateTimeSerializer.class)
注意事项
不同日期类型行为略有差异:
-
java.util.Date和Calendar直接受date-format和time-zone控制 -
LocalDateTime默认不带时区,time-zone配置对其无效;若需时区转换,应改用ZonedDateTime或配合@JsonFormat显式指定 -
Instant表示时间戳,通常建议保持 ISO-8601 格式(如"2026-10-10T10:10:00Z"),避免用date-format强转为本地时间造成歧义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











