Java的@DateTimeFormat注解与@JsonFormat注解的使用对比

Java的@DateTimeFormat注解与@JsonFormat注解的使用对比

在Java开发中,处理日期和时间格式时,我们经常会使用到@DateTimeFormat@JsonFormat注解。这两个注解主要用于格式化日期和时间,但在使用场景和功能上有所不同。本文将详细介绍这两个注解的使用方法,并对比它们的异同点。

引入我的其他博客:
1、Java 前后端时间格式转换注解
https://blog.csdn.net/qq_29689343/article/details/125749447

文章目录

  • Java的@DateTimeFormat注解与@JsonFormat注解的使用对比
    • 一、简介
    • 二、使用场景
      • 1. @DateTimeFormat注解
      • 2. @JsonFormat注解
    • 三、基本使用
      • 1. @DateTimeFormat的基本使用
      • 2. @JsonFormat的基本使用
    • 四、功能详解
      • 1. @DateTimeFormat注解的功能
      • 2. @JsonFormat注解的功能
    • 五、最佳实践及案例
      • 1. 在Spring Boot项目中使用@DateTimeFormat和@JsonFormat
      • 2. 处理不同格式的日期
    • 六、总结

一、简介

在Spring和Jackson框架中,日期和时间格式化是一个常见需求。@DateTimeFormat注解主要用于Spring的表单绑定,而@JsonFormat注解则用于Jackson的JSON序列化和反序列化。了解这两个注解的使用场景和方法,可以帮助开发者更高效地处理日期和时间。

二、使用场景

1. @DateTimeFormat注解

@DateTimeFormat注解通常用于Spring MVC中,主要用于将字符串日期转换为Java的日期对象,或者将Java的日期对象转换为特定格式的字符串。

2. @JsonFormat注解

@JsonFormat注解主要用于Jackson库,通常在序列化和反序列化JSON数据时使用,用于指定日期和时间的格式。

三、基本使用

1. @DateTimeFormat的基本使用

在Spring MVC中,@DateTimeFormat注解可以用于控制器方法的参数:

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;@RestController
public class DateController {@GetMapping("/date")public String getDate(@RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) {return "Parsed date is: " + date.toString();}
}

2. @JsonFormat的基本使用

在使用Jackson进行JSON序列化和反序列化时,可以使用@JsonFormat注解来指定日期格式:

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;import java.time.LocalDate;public class User {@JsonFormat(pattern = "yyyy-MM-dd")private LocalDate birthDate;// getters and setterspublic static void main(String[] args) throws Exception {User user = new User();user.setBirthDate(LocalDate.of(1990, 1, 1));ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(user);System.out.println(json); // {"birthDate":"1990-01-01"}User deserializedUser = mapper.readValue(json, User.class);System.out.println(deserializedUser.getBirthDate()); // 1990-01-01}
}

四、功能详解

1. @DateTimeFormat注解的功能

  • 作用范围:主要用于Spring MVC的请求参数绑定和表单数据绑定。
  • 支持的类型:支持java.util.Datejava.time.LocalDatejava.time.LocalDateTime等。
  • 常用属性
    • pattern:指定日期格式模式,例如"yyyy-MM-dd"
    • iso:使用ISO标准格式,例如DateTimeFormat.ISO.DATE

2. @JsonFormat注解的功能

  • 作用范围:主要用于Jackson的JSON序列化和反序列化。
  • 支持的类型:支持java.util.Datejava.time.LocalDatejava.time.LocalDateTime等。
  • 常用属性
    • pattern:指定日期格式模式,例如"yyyy-MM-dd"
    • shape:指定数据的形状,例如JsonFormat.Shape.STRING
    • timezone:指定时区,例如"GMT+8"

五、最佳实践及案例

1. 在Spring Boot项目中使用@DateTimeFormat和@JsonFormat

在Spring Boot项目中,可以同时使用@DateTimeFormat@JsonFormat来处理不同场景下的日期格式化需求。

import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;import java.time.LocalDate;public class Event {@DateTimeFormat(pattern = "yyyy-MM-dd")@JsonFormat(pattern = "yyyy-MM-dd")private LocalDate eventDate;// getters and setters
}

2. 处理不同格式的日期

在不同的场景下,可能需要处理不同格式的日期。例如,在请求参数中使用@DateTimeFormat,在JSON序列化时使用@JsonFormat

import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
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;@RestController
public class EventController {@GetMapping("/event")public Event getEvent(@RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) {Event event = new Event();event.setEventDate(date);return event;}
}class Event {@JsonFormat(pattern = "MM/dd/yyyy")private LocalDate eventDate;// getters and setters
}

在这个例子中,请求参数使用yyyy-MM-dd格式,而返回的JSON数据使用MM/dd/yyyy格式。

六、总结

@DateTimeFormat@JsonFormat是处理日期和时间格式化的两个重要注解。@DateTimeFormat主要用于Spring MVC的请求参数绑定,而@JsonFormat主要用于Jackson的JSON序列化和反序列化。了解它们的使用场景和功能,可以帮助开发者更高效地处理日期和时间格式化需求。

通过本文的介绍,希望读者能够更清晰地理解@DateTimeFormat@JsonFormat的使用方法,并在实际项目中灵活应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智谱AI布局情感智能:收购聆心智能,推出CharacterGLM大模型

#聆心智能、智谱AI、全资收购 话题:聆心智能被智谱AI全资收购 #CharacterGLM超拟人大模型 话题:聆心智能与智谱AI合作发布CharacterGLM超拟人大模型 #投资 话题:智谱AI投资了聆心智能的天使轮以及Pre-A轮融资 曝智谱AI全资收购清华系大模…

小模型狂飙!6家巨头争相发布小模型,Andrej Karpathy:大语言模型的尺寸竞争正在倒退...

过去一周,可谓是小模型战场最疯狂的一周,商业巨头改变赛道,向大模型say byebye~。 OpenAI、Apple、Mistral等“百花齐放”,纷纷带着自家性能优越的轻量化小模型入场。 小模型(SLM),是相对于大语言模型(LLM…

在C++里如何释放内存的时候不调用对象的析构函数?

今天,看到一个有趣的面试题,问题是:在C里如何释放内存的时候不调用对象的析构函数? 之所以有趣,是因为这个问题违反了C中资源管理的RAII(资源获取即初始化),它要求资源的释放应当和…

Istio 学习笔记

Istio 学习笔记 作者:王珂 邮箱:49186456qq.com 文章目录 Istio 学习笔记[TOC] 前言一、基本概念1.1 Istio定义 二、Istio的安装2.1 通过Istioctl安装2.2 通过Helm安装 三、Istio组件3.1 Gateway3.2 VirtulService3.2.1 route详解3.2.2 match详解3.2.3…

自动化测试学习2024年7月23日

2.2测试指标 1.可靠性指标 (1)热机双备 1)节点切换(是否成功及耗费的时间)、双机切换(业务是否中断)、节点回切(是否成功及耗费的时间)、双机回切(业务是否中…

java-空对象模式

空对象模式(Null Object Pattern)是一种行为设计模式,它通过提供一个无意义但是行为和调用接口与正常对象一致的“空”对象,来解决空引用带来的问题。在 Java 中,空对象模式通常用于避免对空引用的显式检查&#xff0c…

【前端 02】新浪新闻项目-初步使用CSS来排版

在今天的博文中,我们将围绕“新浪新闻”项目,深入探讨HTML和CSS在网页制作中的基础应用。通过具体实例,我们将学习如何设置图片、标题、超链接以及文本排版,同时了解CSS的引入方式和选择器优先级,以及视频和音频标签的…

【Gin】智慧架构的巧妙砌筑:Gin框架中控制反转与依赖注入模式的精华解析与应用实战(下)

【Gin】智慧架构的巧妙砌筑:Gin框架中控制反转与依赖注入模式的精华解析与应用实战(下) 大家好 我是寸铁👊 【Gin】智慧架构的巧妙砌筑:Gin框架中控制反转与依赖注入模式的精华解析与应用实战(下)✨ 喜欢的小伙伴可以点点关注 💝 …

怀旧必玩!重返童年,扫雷游戏再度登场!

Python提供了一个标准的GUI(图形用户界面)工具包:Tkinter。它可以用来创建各种窗口、按钮、标签、文本框等图形界面组件。 而且Tkinter 是 Python 自带的库,无需额外安装。 Now,让我们一起来回味一下扫雷小游戏吧 扫…

快速搞定分布式RabbitMQ---RabbitMQ进阶与实战

本篇内容是本人精心整理;主要讲述RabbitMQ的核心特性;RabbitMQ的环境搭建与控制台的详解;RabbitMQ的核心API;RabbitMQ的高级特性;RabbitMQ集群的搭建;还会做RabbitMQ和Springboot的整合;内容会比较多&#…

【C++】C++入门知识(上)

好久不见&#xff0c;本篇介绍一些C的基础&#xff0c;没有特别的主题&#xff0c;话不多说&#xff0c;直接开始。 1.C的第一个程序 C中需要把定义文件代码后缀改为 .cpp 我们在 test.cpp 中来看下面程序 #include <stdio.h> int main() {printf("hello world\n…

SQL Server 设置端口号:详细步骤与注意事项

目录 一、了解SQL Server端口号的基础知识 1.1 默认端口号 1.2 静态端口与动态端口 二、使用SQL Server配置管理器设置端口号 2.1 打开SQL Server配置管理器 2.2 定位到SQL Server网络配置 2.3 修改TCP/IP属性 2.4 重启SQL Server服务 三、注意事项 3.1 防火墙设置 3…

C++中的static_cast函数

static_cast 是 C 中的一个类型转换操作符&#xff0c;用于在编译时进行类型转换。它主要用于基本数据类型之间的转换&#xff0c;以及类的指针或引用之间的向上转换&#xff08;将派生类指针或引用转换为基类指针或引用&#xff09;和某些情况下的向下转换&#xff08;将基类指…

Java小抄|Java中的List与Map转换

文章目录 1 List<User> 转Map<User.id,User>2 基础类型的转换&#xff1a;List < Long> 转 Map<Long,Long> 1 List 转Map<User.id,User> Map<Long, User> userMap userList.stream().collect(Collectors.toMap(User::getId, v -> v, …

p28 vs环境-C语言实用调试技巧

int main() { int i0; for(i0;i<100;i) { printf("%d",i); } } 1.Debug 和Release的介绍 Debug通常称为调试版本&#xff0c;它包含调试信息&#xff0c;并且不做任何优化&#xff0c;便于程序员调试程序。 Release称为发布版本&#x…

24-列表的常用操作(下)

### 3.2增加 --- 作用&#xff1a;增加指定数据到列表中 - append&#xff08;&#xff09;&#xff1a;列表追加数据 1. 语法 python 列表序列.append(数据) 2. 体验 python name_list [Tom,Lily,Rose] name_list.append(xiaoming) # 结果 &#xff1a;[Tom,Lily,R…

PTPD 在 QNX 系统上的授时精度验证与误差排查

文章目录 0. 引言1.关键函数实现2. 验证策略与结果3. 授时误差的排查与解决3. 授时误差的排查与解决4. 结论 0. 引言 PTPD是一种时间同步的开源实现&#xff0c;在不同操作系统上的表现可能存在显著差异。 本文通过在QNX系统上运行PTPD&#xff0c;针对其授时精度进行详细验证…

探索算法系列 - 双指针

目录 移动零&#xff08;原题链接&#xff09; 复写零&#xff08;原题链接&#xff09; 快乐数&#xff08;原题链接&#xff09; 盛最多水的容器&#xff08;原题链接&#xff09; 有效三角形的个数&#xff08;原题链接&#xff09; 查找总价格为目标值的两个商品&…

优化算法:2.粒子群算法(PSO)及Python实现

一、定义 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;是一种模拟鸟群觅食行为的优化算法。想象一群鸟在寻找食物&#xff0c;每只鸟都在尝试找到食物最多的位置。它们通过互相交流信息&#xff0c;逐渐向食物最多的地方聚集。PSO就是基于这…

关于锁策略

在Java中对于多线程来说&#xff0c;锁是一种重要且必不可少的东西&#xff0c;那么我们将如何使用以及在什么时候使用什么样的锁呢&#xff1f;请各位往下看 悲观锁VS乐观锁 悲观锁&#xff1a; 在多线程环境中&#xff0c;冲突是非常常见的&#xff0c;所以在执行操作之前…