前后端教你如何正确使用@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);
    }

测试:

调试:

在这个例子中,通过knife4j接口文档测试,用户通过前端表单提交一个符合"yyyy-MM-dd"格式的日期时间字符串时,Spring会根据你提供的格式自动将这个字符串转换为LocalDate对象,并传递给selectPlanWork方法的startDateendDate参数。

二、@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.OBJECTShape.ARRAY等,但对于日期时间类型通常不需要修改)。
  • pattern:定义日期/时间的格式。这是最常用的属性之一,用于指定Java日期时间对象(如LocalDateLocalDateTimeZonedDateTime等)转换为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都是用于处理日期时间格式的注解,但它们的使用场景和来源有所不同。在实际开发中,我们需要根据具体的需求来选择合适的注解。

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何政@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值