问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://blog.csdn.net/2301_77058976/article/details/140241914

在Java Web开发中,日期和时间的处理是一个常见的需求。Spring框架和Jackson库分别提供了@DateTimeFormat和@JsonFormat两个注解来帮助我们更好地处理日期和时间。本文将详细介绍这两个注解的使用场景、主要属性以及它们之间的区别。

一、@DateTimeFormat

@DateTimeFormat是Spring框架提供的注解,主要用于处理表单数据绑定时的日期时间格式问题。当你在前端页面通过表单提交一个日期或时间字段时,Spring会自动将这个字段转换为Java中的Date或LocalDateTime对象。但是,由于不同的浏览器或用户可能使用不同的日期时间格式,因此需要一个统一的规则来解析这些日期时间字符串。这就是@DateTimeFormat注解的作用。

使用场景:

  • 在Controller层接收前端传来的日期时间字符串,并将其转换为Java中的日期时间对象。

示例:

@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结合使用,以选择更具体的日期/时间风格。

四、二者的区别

  1. 来源与用途:@DateTimeFormat是Spring框架提供的注解,主要用于处理表单数据绑定时的日期时间格式问题;而@JsonFormat是Jackson库提供的注解,主要用于处理JSON序列化和反序列化时的日期时间格式问题。
  2. 使用场景:@DateTimeFormat主要在Controller层使用,处理前端传来的表单数据;而@JsonFormat则主要在DTO(Data Transfer Object)或实体类中使用,处理与前端交互的JSON数据。
  3. 格式化规则:两者都可以定义日期时间的格式化规则,但@DateTimeFormat通常用于处理更复杂的日期时间格式,如包含时区信息的日期时间等。而@JsonFormat则更注重于JSON数据的格式化。

总的来说,@DateTimeFormat和@JsonFormat都是用于处理日期时间格式的注解,但它们的使用场景和来源有所不同。在实际开发中,我们需要根据具体的需求来选择合适的注解。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号