目录
一、@DateTimeFormat
二、@JsonFormat
三、注解
3.1 JsonFormat
3.2 DateTimeFormat
四、二者的区别
引言:
在Java Web开发中,日期和时间的处理是一个常见的需求。Spring框架和Jackson库提供了@DateTimeFormat和@JsonFormat两个注解来帮助我们更好地处理日期和时间。然而,这两个注解在使用上有一些差异,下面我们将详细介绍这两个注解的使用场景和区别。
一、@DateTimeFormat
@DateTimeFormat是Spring框架提供的注解,主要用于处理表单数据绑定时的日期时间格式问题。当你在前端页面通过表单提交一个日期或时间字段时,Spring会自动将这个字段转换为Java中的Date或LocalDateTime对象。但是,由于不同的浏览器或用户可能使用不同的日期时间格式,因此需要一个统一的规则来解析这些日期时间字符串。这就是@DateTimeFormat注解的作用。
使用场景:
- 在Controller层接收前端传来的日期时间字符串,并将其转换为Java中的日期时间对象。
示例:
Controller层:
@GetMapping("/list")
public Result selectPlanWork(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate) {
ListPlanWorkVO listPlanWorkVO = planWorkServiceImp.selectList(startDate, endDate);
return Result.success(listPlanWorkVO);
}
测试:
调试:
在这个例子中,通过knife4j接口文档测试,用户通过前端表单提交一个符合"yyyy-MM-dd"格式的日期时间字符串时,Spring会根据你提供的格式自动将这个字符串转换为LocalDate
对象,并传递给selectPlanWork
方法的startDate
和endDate
参数。
二、@JsonFormat
@JsonFormat是Jackson库提供的注解,主要用于处理JSON序列化和反序列化时的日期时间格式问题。当我们将Java对象转换为JSON字符串(序列化)或将JSON字符串转换为Java对象(反序列化)时,日期时间字段的格式可能需要特殊处理。@JsonFormat注解可以帮助我们定义这些规则。
使用场景:
- 在与前端交互时,将Java对象转换为JSON字符串,或将JSON字符串转换为Java对象。
示例:
实体类中的封装:
@Data
@Schema(description = "请假登记信息")
@NoArgsConstructor
@AllArgsConstructor
public class LeaveStatistics implements Serializable {
@Schema(description = "主键ID")
private Integer keyid;
@Schema(description = "学号")
private String id;
@Schema(description = "姓名")
private String name;
@Schema(description = "请假类型")
private String leaveType;
@Schema(description = "起始时间")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate logintime;
@Schema(description = "截止时间")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate endtime;
@Schema(description = "请假理由描述")
private String describea;
}
Controller层:
@PostMapping
@Operation(summary = "添加请假名单")
public Result addLeavePoint(@RequestBody LeaveStatistics leaveStatistics){
leaveStatisticsService.addLeave(leaveStatistics);
return Result.success();
}
测试:
调试:
在这个例子中,当我们将LeaveStatistics对象转换为JSON字符串时,LocalDate字段会被格式化为"yyyy-MM-dd "的格式,并且使用GMT+8的时区(告诉@JsonFormat接数据的格式是GMT+8
)。同样地,当我们从JSON字符串中解析LeaveStatistics对象时,也会按照这个规则来解析LocalDate字段。
同样的,我们前端也会接收到相同的格式的日期数据
三、注解
3.1 JsonFormat
注解用于指定JSON属性的序列化和反序列化的格式。它可以用于字段、getter或setter方法上。
主要属性:
shape
:指定序列化的基本形式(如Shape.OBJECT
、Shape.ARRAY
等,但对于日期时间类型通常不需要修改)。pattern
:定义日期/时间的格式。这是最常用的属性之一,用于指定Java日期时间对象(如LocalDate
、LocalDateTime
、ZonedDateTime
等)转换为JSON字符串的格式。timezone
:指定时区,用于序列化和反序列化过程中处理时区差异。locale
:指定地区设置,影响日期时间的格式化。
3.2 DateTimeFormat
@DateTimeFormat
注解用于Spring MVC中,以指定绑定到Web请求参数、路径变量、头信息或cookie的日期/时间格式。它主要用于将字符串解析为日期/时间对象,或者将日期/时间对象格式化为字符串。、
主要属性:
pattern
:与@JsonFormat
类似,指定日期/时间的格式。iso
:一个方便的枚举,用于选择ISO 8601的日期时间格式之一。style
:与iso
结合使用,以选择更具体的日期/时间风格。
四、二者的区别
- 来源与用途:@DateTimeFormat是Spring框架提供的注解,主要用于处理表单数据绑定时的日期时间格式问题;而@JsonFormat是Jackson库提供的注解,主要用于处理JSON序列化和反序列化时的日期时间格式问题。
- 使用场景:@DateTimeFormat主要在Controller层使用,处理前端传来的表单数据;而@JsonFormat则主要在DTO(Data Transfer Object)或实体类中使用,处理与前端交互的JSON数据。
- 格式化规则:两者都可以定义日期时间的格式化规则,但@DateTimeFormat通常用于处理更复杂的日期时间格式,如包含时区信息的日期时间等。而@JsonFormat则更注重于JSON数据的格式化。
总的来说,@DateTimeFormat和@JsonFormat都是用于处理日期时间格式的注解,但它们的使用场景和来源有所不同。在实际开发中,我们需要根据具体的需求来选择合适的注解。