一、注解方式
@DateTimeFormat
和 @JsonFormat
是Java中用于格式化日期和时间的注解。它们的应用场景稍有不同,但是他们的目标是相同的,那就是改变日期和时间的显示格式。
@DateTimeFormat
@DateTimeFormat
是Spring Framework中的一个注解,主要用于将String类型的日期时间转换为Date或者DateTime类型。
@DateTimeFormat
是Spring框架提供的注解,主要用于处理日期和时间的格式化与解析。它通常用在Spring MVC控制器的方法参数中,来绑定请求参数到日期类型,也可以用在响应模型的日期类型字段上,用于在视图渲染时的格式化。
这个注解有一些属性,例如iso
(使用ISO日期时间格式)和pattern
(自定义日期时间格式字符串)。这在处理HTTP请求参数时特别有用, 例如:
public class Event {
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private LocalDate date;
//...
}
在这个例子中,date
字段期望一个ISO 8601日期格式的字符串,如"2023-08-01"。如果请求中的参数与这个格式不符,那么Spring将抛出一个异常。
以下是另外一些用法的例子:
// 请求参数格式化
@RequestMapping(value = "/date")
public String getDate(@DateTimeFormat(pattern = "yyyy-MM-dd") Date date) {
// ...
}
// 响应模型格式化
public class MyModel {
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date myDate;
// ...
}
@JsonFormat
@JsonFormat
是Jackson库中的一个注解,用于定制Java对象序列化(转化为JSON)或反序列化(从JSON转化为Java对象)时的日期格式化。这在处理JSON数据时特别有用。例如:
public class Event {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private Date date;
//...
}
在这个例子中,当date
字段被序列化为JSON时,它将被格式化为"yyyy-MM-dd"格式的字符串,如"2023-08-01"。反过来,如果输入的JSON数据中的日期字段与这个格式不符,那么Jackson将抛出一个异常。
注意:这两个注解的工作原理都是基于Java的java.text.SimpleDateFormat
类,因此你可以在它们的pattern
属性中使用任何有效的日期和时间格式模式。
@JsonFormat
的主要属性不仅包括pattern
(日期时间格式字符串),还包含timezone
(时区)。
以下是另外一些用法的例子:
public class MyModel {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date myDate;
// ...
}
总的来说,@DateTimeFormat
更侧重于Spring MVC的请求/响应模型绑定和视图渲染,而@JsonFormat
主要用于Jackson的JSON序列化和反序列化。
二、配置文件
(1)application.properties
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
(2)application.yml
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8