@DateTimeFormat 和 @JsonFormat 注解详解
在 Java 开发尤其是基于 Spring 的项目中,日期和时间的处理是必不可少的一部分。@DateTimeFormat
和 @JsonFormat
这两个注解被广泛用于日期和时间的格式化处理。本文将深入探讨这两个注解的使用场景、差异及实践应用。
1. 基础概念
@DateTimeFormat
和 @JsonFormat
注解分别来自 org.springframework.format.annotation
和 com.fasterxml.jackson.annotation
,用于在 Spring 和 Jackson 中处理日期和时间格式。
1.1 @DateTimeFormat
此注解主要在数据绑定过程中发挥作用,通常用于实体类中的日期字段或方法参数上,以便从 HTTP 请求(如 URL 参数或表单数据)中读取或写入日期和时间数据。
1.2 @JsonFormat
@JsonFormat
则专注于 JSON 数据的序列化和反序列化过程。它用于控制对象序列化成 JSON 时,日期字段的格式,以及反序列化时如何解析日期字段。
2. 使用场景与区别
区别 | @DateTimeFormat | @JsonFormat |
---|---|---|
使用方法 | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
使用场景 | 处理 HTTP 请求中的日期和时间数据,如 URL 参数、表单数据。 | 控制 JSON 序列化和反序列化时的日期和时间格式。 |
使用地方 | 实体类日期字段、字段的 setter 方法、控制器方法的参数。 | 实体类日期字段、字段的 setter 方法、控制器方法的参数。 |
来源 | Spring Framework | Jackson 库 |
3. 传参格式化
3.1 JSON 传参格式化
使用 @JsonFormat
可确保前后端日期时间格式一致,避免转换错误。
3.2 URL 传参格式化
使用 @DateTimeFormat
可确保 HTTP 请求中日期时间格式正确解析。
4. 全局时间格式化
在 Spring Boot 中,可以通过配置文件或 Java 配置类设置全局时间格式。
spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {converters.stream().filter(MappingJackson2HttpMessageConverter.class::isInstance).map(MappingJackson2HttpMessageConverter.class::cast).forEach(converter -> {ObjectMapper objectMapper = converter.getObjectMapper();objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));});}
}
通过上述配置,可以实现全局的日期和时间格式化,简化开发流程并提高代码的一致性。