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

简介: 【6月更文挑战第11天】在开发 Spring Boot 应用时,处理日期和时间数据是一个常见的需求。Spring Boot 提供了两个注解 @DateTimeFormat 和 @JsonFormat 来帮助我们处理这些问题。

在开发 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 控制器:

java复制代码

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 注解格式化日期时间:

java复制代码

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 控制器来测试该实体类的序列化和反序列化:

java复制代码

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

返回结果:

json复制代码

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

POST 请求

bash复制代码

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 应用至关重要。

相关文章
|
7天前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
95 12
|
5月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,日期时间格式化是前后端交互的常见痛点。本文详细解析了 **@DateTimeFormat** 和 **@JsonFormat** 两个注解的用法,分别用于将前端传入的字符串解析为 Java 时间对象,以及将时间对象序列化为指定格式返回给前端。通过完整示例代码,展示了从数据接收、业务处理到结果返回的全流程,并总结了解决时区问题和全局配置的最佳实践,助你高效处理日期时间需求。
696 0
|
5月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,处理前后端日期交互是一个常见问题。本文通过 **@DateTimeFormat** 和 **@JsonFormat** 两个注解,详细讲解了如何解析前端传来的日期字符串以及以指定格式返回日期数据。文章从实际案例出发,结合代码演示两者的使用场景与注意事项,解决解析失败、时区偏差等问题,并提供全局配置与局部注解的实践经验。帮助开发者高效应对日期时间格式化需求,提升开发效率。
1528 2
|
NoSQL Java MongoDB
SpringBoot中MongoDB的那些高级用法
本文探讨了在Spring Boot项目中使用MongoDB的多种方式及其高级用法。MongoDB作为一种NoSQL数据库,在某些场景下相较于SQL数据库有着独特的优势。文中详细介绍了在Spring Boot中使用MongoDB的三种主要方式:直接使用官方SDK、使用Spring JPA以及使用MongoTemplate,并对比分析了它们之间的差异。此外,文章深入讲解了Spring Data MongoDB提供的各种注解(如@Id, @Document, @Field等)以简化操作流程,并探讨了MongoTemplate监听器的应用,如设置主键值、记录日志等。
783 2
|
JSON Java API
哇塞!Spring Boot 中的 @DateTimeFormat 和 @JsonFormat,竟能引发数据时间大变革!
【8月更文挑战第29天】在Spring Boot开发中,正确处理日期时间至关重要。
461 1
|
NoSQL Java MongoDB
SpringBoot中MongoDB的那些骚操作用法
MongoDB作为一种NoSQL数据库,在不需要传统SQL数据库的表格结构的情况下,提供了灵活的数据存储方案。在Spring Boot中可以通过官方SDK、Spring JPA或MongoTemplate等方式集成MongoDB。文章重点介绍了Spring Data MongoDB提供的注解功能,例如`@Id`、`@Document`和`@Field`等,这些注解简化了Java对象到MongoDB文档的映射。此外,文中还讨论了MongoTemplate监听器的使用,包括设置主键值和日志记录等高级特性。
482 0
SpringBoot中MongoDB的那些骚操作用法
|
Java API
SpringBoot Scheduled 常见用法
SpringBoot Scheduled 常见用法
159 0
|
前端开发 Java 开发者
深入理解 Spring Boot 注解:核心功能与高级用法详解
深入理解 Spring Boot 注解:核心功能与高级用法详解
1361 1
|
2月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
741 0
|
6月前
|
前端开发 Java 数据库
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
321 0