Spring Boot 中的 @DateTimeFormat 和 @JsonFormat 的用法及作用详解

 更新时间:2024年11月28日 11:41:24   作者:小林想被监督学习  
本文介绍了SpringBoot中的@DateTimeFormat和@JsonFormat注解的用法,解释了它们在处理日期和时间数据时的作用,并通过实例代码展示了如何在REST控制器中使用这些注解,感兴趣的朋友跟随小编一起看看吧

        在开发 Spring Boot 应用时,处理日期和时间数据是一个常见的需求。Spring Boot 提供了两个注解 @DateTimeFormat@JsonFormat 来帮助我们处理这些问题。这两个注解分别用于将日期字符串解析为日期对象以及将日期对象格式化为字符串。本文将详细介绍这两个注解的用法及作用,并通过实例代码进行说明。

@DateTimeFormat 注解

@DateTimeFormat 是一个 Spring 框架提供的注解,用于格式化和解析日期时间字段。它主要用于将请求参数或表单数据中的日期字符串解析为 Java 的日期对象。

用法

@DateTimeFormat 可以应用于以下数据类型:

  • java.util.Date
  • java.util.Calendar
  • java.time.LocalDate
  • java.time.LocalDateTime
  • java.time.ZonedDateTime

该注解的常用属性包括:

  • pattern:指定日期格式的模式字符串,例如 "yyyy-MM-dd"
  • iso:指定标准的 ISO 日期时间格式。可选值为 DateTimeFormat.ISO.DATEDateTimeFormat.ISO.TIMEDateTimeFormat.ISO.DATE_TIME

示例

假设我们有一个处理日期的 REST 控制器:

package com.example.demo.controller;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@RestController
public class DateController {
    @GetMapping("/date")
    public String handleDate(@RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) {
        return "Parsed date: " + date.format(DateTimeFormatter.ISO_DATE);
    }
    @GetMapping("/datetime")
    public String handleDateTime(@RequestParam("datetime") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime dateTime) {
        return "Parsed datetime: " + dateTime.format(DateTimeFormatter.ISO_DATE_TIME);
    }
}

在上述示例中:

  • /date 端点处理格式为 "yyyy-MM-dd" 的字符串,并将其解析为 LocalDate 对象。
  • /datetime 端点处理 ISO 标准格式的日期时间字符串,并将其解析为 LocalDateTime 对象。

你可以通过以下 URL 测试这些端点:

http://localhost:8080/date?date=2023-10-01
http://localhost:8080/datetime?datetime=2023-10-01T10:15:30

@JsonFormat 注解

@JsonFormat 是 Jackson 库提供的注解,用于序列化和反序列化 JSON 数据中的日期时间字段。它可以帮助我们将日期时间对象格式化为特定的字符串格式,或将特定格式的字符串解析为日期时间对象。

用法

@JsonFormat 可以应用于类的字段或方法上。其常用属性包括:

  • pattern:指定日期时间格式的模式字符串。
  • shape:指定日期时间的格式化类型。常用值为 JsonFormat.Shape.STRING
  • timezone:指定时区。

示例

假设我们有一个包含日期时间字段的实体类,并使用 @JsonFormat 注解格式化日期时间:

package com.example.demo.model;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class Event {
    private String name;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate date;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "UTC")
    private LocalDateTime dateTime;
    // getters and setters
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public LocalDate getDate() {
        return date;
    }
    public void setDate(LocalDate date) {
        this.date = date;
    }
    public LocalDateTime getDateTime() {
        return dateTime;
    }
    public void setDateTime(LocalDateTime dateTime) {
        this.dateTime = dateTime;
    }
}

接着,我们创建一个 REST 控制器来测试该实体类的序列化和反序列化:

package com.example.demo.controller;
import com.example.demo.model.Event;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
@RestController
public class EventController {
    @GetMapping("/event")
    public Event getEvent() {
        Event event = new Event();
        event.setName("Spring Boot Workshop");
        event.setDate(LocalDate.of(2023, 10, 1));
        event.setDateTime(LocalDateTime.of(2023, 10, 1, 10, 15, 30));
        return event;
    }
    @PostMapping("/event")
    public String createEvent(@RequestBody Event event) {
        // 持久化逻辑...
        return "Event created: " + event.getName();
    }
}

在上述示例中:

  • /event GET 端点返回一个 Event 对象,其中日期和日期时间字段将根据 @JsonFormat 注解指定的格式序列化为 JSON 字符串。
  • /event POST 端点接受一个 JSON 请求体,并将其反序列化为 Event 对象。

你可以通过以下方式测试这些端点:

GET 请求

curl -X GET http://localhost:8080/event

返回结果:

{
    "name": "Spring Boot Workshop",
    "date": "2023-10-01",
    "dateTime": "2023-10-01 10:15:30"
}

POST 请求

curl -X POST http://localhost:8080/event -H "Content-Type: application/json" -d '{
    "name": "Spring Boot Workshop",
    "date": "2023-10-01",
    "dateTime": "2023-10-01 10:15:30"
}'

返回结果:

Event created: Spring Boot Workshop

小结

        在本文中,我们详细介绍了 Spring Boot 中的 @DateTimeFormat@JsonFormat 注解的用法及作用。@DateTimeFormat 主要用于将请求参数或表单数据中的日期字符串解析为日期对象,而 @JsonFormat 则用于序列化和反序列化 JSON 数据中的日期时间字段。

        通过这些注解,我们可以更方便地处理日期和时间数据,确保数据在不同层次间传递时的格式一致性。这对于开发高质量的 Spring Boot 应用至关重要

到此这篇关于Spring Boot 中的 @DateTimeFormat 和 @JsonFormat 的用法及作用的文章就介绍到这了,更多相关Spring Boot @DateTimeFormat 和 @JsonFormat内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 50 道Java 线程面试题(经典)

    50 道Java 线程面试题(经典)

    java 线程面试题是比较热门的面试题,下面小编给大家分享了50道java线程面试题必掌握,大家来一起学习吧为面试好好准备吧
    2016-11-11
  • Java8新特性之接口中的默认方法和静态方法详解

    Java8新特性之接口中的默认方法和静态方法详解

    今天带大家学习的是Java8新特性的相关知识,文章围绕着Java接口中的默认方法和静态方法展开,文中有非常详细的的代码示例,需要的朋友可以参考下
    2021-06-06
  • @JsonFormat 实现日期格式自动格式化

    @JsonFormat 实现日期格式自动格式化

    这篇文章主要介绍了@JsonFormat 实现日期格式自动格式化,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot整合Redis实现附近位置查找(LBS)功能

    SpringBoot整合Redis实现附近位置查找(LBS)功能

    Redis 提供了 GEO 数据结构,可以高效地存储和查询地理位置数据,本文将介绍如何使用 Spring Boot + Redis 来实现附近位置查找,需要的可以了解下
    2025-03-03
  • JAVA集合框架专题

    JAVA集合框架专题

    这篇文章主要介绍了JAVA集合框架的相关知识,文中讲解非常细致,帮助大家更好的理解学习JAVA框架,感兴趣的朋友快来了解下
    2020-06-06
  • 关于Gateway路由匹配规则解读

    关于Gateway路由匹配规则解读

    本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Gateway的核心功能之一,在配置路由时需要注意顺序、性能和安全性
    2025-02-02
  • 使用Mybatis Generator结合Ant脚本快速自动生成Model、Mapper等文件的方法

    使用Mybatis Generator结合Ant脚本快速自动生成Model、Mapper等文件的方法

    这篇文章主要介绍了使用Mybatis Generator结合Ant脚本快速自动生成Model、Mapper等文件的方法的相关资料,需要的朋友可以参考下
    2016-06-06
  • Java并发编程示例(五):线程休眠与恢复

    Java并发编程示例(五):线程休眠与恢复

    这篇文章主要介绍了Java并发编程示例(五):线程休眠与恢复,在本节,我们将开发一个程序,使用sleep()方法来实现每秒钟打印一次当前时间,需要的朋友可以参考下
    2014-12-12
  • java如何用Processing生成马赛克风格的图像

    java如何用Processing生成马赛克风格的图像

    这篇文章主要介绍了如何用java如何用Processing生成马赛克风格的图像,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Java Swing组件文件选择器JFileChooser简单用法示例

    Java Swing组件文件选择器JFileChooser简单用法示例

    这篇文章主要介绍了Java Swing组件文件选择器JFileChooser简单用法,结合实例形式分析了Swing组件中的文件选择器JFileChooser的简单使用方法,需要的朋友可以参考下
    2017-11-11

最新评论