知者何南 发表于 2024-8-16 02:55:46

前后端教你如何正确利用@DateTimeFormat与@JsonFormat

目录
一、@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);
    } 测试:
https://i-blog.csdnimg.cn/direct/c5cc2465855a4fbc8276d8126eb6a1ae.png
调试:
https://i-blog.csdnimg.cn/direct/5dca7743a42646c2b815b15fa24e72ed.png
在这个例子中,通过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();
   } 测试:
https://i-blog.csdnimg.cn/direct/3a6f0a12c99741c7a2c23efd421a28e7.png
调试:
https://i-blog.csdnimg.cn/direct/7b9950a0d1d14fca877afdb655f90090.png
在这个例子中,当我们将LeaveStatistics对象转换为JSON字符串时,LocalDate字段会被格式化为"yyyy-MM-dd "的格式,并且利用GMT+8的时区(告诉@JsonFormat接数据的格式是GMT+8)。同样地,当我们从JSON字符串中剖析LeaveStatistics对象时,也会按照这个规则来剖析LocalDate字段。
https://i-blog.csdnimg.cn/direct/bcdc3543f28845c895b45eec2f082409.png
同样的,我们前端也会吸收到雷同的格式的日期数据
三、注解

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都是用于处理日期时间格式的注解,但它们的利用场景和来源有所不同。在实际开发中,我们必要根据具体的需求来选择符合的注解。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 前后端教你如何正确利用@DateTimeFormat与@JsonFormat