使用@JsonFormat并进一步了解:格式化java.util.Date对象

news/2024/5/5 21:45:53/文章来源:https://www.cnblogs.com/luo630/p/16715892.html

Java 8

Spring Boot 2.7.3

jackson 2.13.3

--

ben发布于博客园

0、前言

开发过程中遇到问题:

前端调用接口得到的时间对象(java.util.Date)总是存在这样那样的问题。

调查后发现,可以使用 @JsonFormat注解(来自jackson依赖包)解决相关问题。

ben发布于博客园

新建spring boot项目,引入:

spring-boot-starter-web

lombok

其中包含了 jackson依赖包:

 

注,参考资料#1 一定要看看。 ben发布于博客园

 

1、使用@JsonFormat处理java.util.Date对象

建一个接口获取当前时间(各种Date对象):

AppV2Controller

@RestController
@RequestMapping(value = {"/api/app/v2"})
@RequiredArgsConstructor
@Slf4j
public class AppV2Controller {@GetMapping(value = "/get1")public RespVO get1() {RespVO vo = new RespVO();Date now = new Date();// 时间vo.setTime(now);vo.setTimeFmt1(now);vo.setTimeFmt2(now);vo.setTimeFmt3(now);vo.setTimeServerLocal(now);vo.setTimeServerLocal2(now);vo.setTimeServerLocal3(now);// 数字vo.setIntMax(Integer.MAX_VALUE);vo.setLongMax(Long.MAX_VALUE);vo.setIntMaxStr(Integer.MAX_VALUE);vo.setLongMaxStr(Long.MAX_VALUE);return vo;}
}

RespVO

RespVO类
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;@Data
public class RespVO {// 默认格式private Date time;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date timeFmt1;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")private Date timeFmt2;@JsonFormat(shape = JsonFormat.Shape.NUMBER)private Date timeFmt3;// 有效:值可以根据 TimeZone.getAvailableIDs() 的结果进一步获取@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")private Date timeServerLocal;// 有效,同上@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date timeServerLocal2;// 无效@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "UTC+8")private Date timeServerLocal3;private Integer intMax;private Long longMax;// Integer 序列化为字符串@JsonFormat(shape = JsonFormat.Shape.STRING)private Integer intMaxStr;// Long 序列化为字符串@JsonFormat(shape = JsonFormat.Shape.STRING)private Long longMaxStr;}

 启动后访问接口(Postman):/api/app/v2/get1,得到下面的响应:ben发布于博客园

{"time": "2022-09-21T11:41:11.079+00:00","timeFmt1": "2022-09-21 11:41:11","timeFmt2": "2022-09-21 11:41:11.079","timeFmt3": 1663760471079,"timeServerLocal": "2022-09-21 19:41:11","timeServerLocal2": "2022-09-21 19:41:11","timeServerLocal3": "2022-09-21 11:41:11","intMax": 2147483647,"longMax": 9223372036854775807,"intMaxStr": "2147483647","longMaxStr": "9223372036854775807"
}

默认返回的 time 是 UTC时间,格式有些长;

timeFmt1 、timeFmt2 也是UTC时间,后者多了毫秒数;

timeFmt3 返回 时间戳,使用了shape参数——Date对象转换为数字,推荐使用这种方式,前端可以直接建立 JavaScript 的Date对象——如果需要进一步处理

timeServerLocal、timeServerLocal2 返回了服务器本地时间,因为使用了timezone,不过,推荐使用 timeServerLocal2 这种格式的格式的 timezone属性——直观;

timeServerLocal3 的 timezone 配置失败,但未发生错误,返回了 UTC时间。ben发布于博客园

 

对于之后的Integer、Long型对象转换,默认是数字,设置 @JsonFormat 的 shapte属性为 JsonFormat.Shape.STRING 可以将其转换为 字符串。

 

2、转换Date对象:spring.jackson.date-format配置

S.B.项目的默认 Date对象 格式 很长,如,"2022-09-21T11:41:11.079+00:00"。

可以使用 参数 spring.jackson.date-format 进行配置,如下:

spring:jackson:date-format: yyyy-MM-dd HH:mm:ss.SSS

配置后,获取的默认时间对象格式出现了变化:

"time": "2022-09-21 11:10:45.434"

没有默认的那么长了,和配置一致。ben发布于博客园

 

默认返回的是UTC时间,还可以使用 spring.jackson.time-zone 设置默认返回的时间字符串的时区。

spring:jackson:date-format: yyyy-MM-dd HH:mm:ss.SSStime-zone: GMT+8

调用接口后返回:

{"time": "2022-09-21 19:15:06.022","timeFmt1": "2022-09-21 19:15:06","timeFmt2": "2022-09-21 19:15:06.022","timeFmt3": 1663758906000,"timeServerLocal": "2022-09-21 19:15:06","timeServerLocal2": "2022-09-21 19:15:06","timeServerLocal3": "2022-09-21 11:15:06",...

除了 timezone属性值 错误的 timeServerLocal3,其它的 时间字符串 都是 服务器时间格式化后的字符串(GMT+8)。ben发布于博客园

 

3、小结

时间对象转换为字符串,式样繁多,在和前端交互时,沟通比较复杂。

如前文所说,直接使用 时间戳方式 在前后端之间传递 时间数据比较好,可以避免做各种转换——UTC时间 和 本地时间 的转换。ben发布于博客园

 

@JsonFormat 来自 Jackson包,用来做 JSON数据 序列化/反序列化,Spring框架默认使用它。看完 参考资料#1 ,还可以配置其它依赖包来做序列化,比如,fastjson, gson。

 

在 Spring Boot 官方文档中,介绍了“Custom JSON Serializers and Deserializers”,可以看看。

启动 Spring Boot 项目时,可以看到一些 包含 jackson 字样的 Bean:

 

参考资料

1、Jackson使用详解

https://juejin.cn/post/6844904166809157639

三分恶 发布于 2020年05月23日 23:27

对jackson介绍的很详细

2、jackSon中@JsonFormat注解使用详解

https://blog.csdn.net/weixin_44130081/article/details/89641301

3、springboot之jackson的两种配置方式 

https://www.cnblogs.com/liaojie970/p/9396334.html

4、

ben发布于博客园

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

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

相关文章

区块链分叉带来的安全挑战

区块链分叉分为软分叉和硬分叉。本文主要探讨的是硬分叉,一种不支持向后兼容的软件升级方式。硬分叉是共识的分裂或者改变,共识就是区块链系统中各节点达成数据一致性的算法,正常情况下每个节点需要运行相同规则的算法,例如比特币…

计算机毕业设计之java+javaweb的影院管理系统-电影院管理系统

计算机毕业设计之javajavaweb的影院管理系统-电影院管理系统 项目介绍 影院的需求和管理上的不断提升,影院管理的潜力将无限扩大,影院管理系统在业界被广泛关注,本网站及对此进行总体分析,将影院信息管理的发展提供参考。影院管理系统对影院发展有着明显的带动效应,尤其对当地影…

【ManageEngine】OpManager 2022用户体验报告

关于SoftwareViews SoftwareReviews是Info-Tech Research Group的一个部门,是一家世界级的技术研究和咨询公司,拥有超过20年的基于研究的IT建议和技术实施。 SoftwareViews务实的工具和详细的客户洞察力帮助软件购买者在技术决策中取得最大成功。 Sof…

Java并发编程解析 | 基于JDK源码解析Java领域中ReentrantLock锁的设计思想与实现原理 (一)

苍穹之边,浩瀚之挚,眰恦之美; 悟心悟性,善始善终,惟善惟道! —— 朝槿《朝槿兮年说》写在开头在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。主要原因是,对于多线程实现实现并发,一直以…

全能赛道、热门方向、稀缺数据,“嬴彻-清华AIR杯”自动驾驶技术大赛火热开赛中

如果你关注自动驾驶,那有这样一个算法大赛,值得参与。由卡车自动驾驶领导者嬴彻科技与清华大学智能产业研究院(AIR)精心打造的“嬴彻-清华AIR杯”自动驾驶技术挑战赛正火热开赛中。这是国内首个同时覆盖干线物流和城市道路双赛道的大赛。决策规划是自动驾驶当下的热门方向和技术…

go语言的基本数据类型

基本数据类型中的常量已经介绍了 var const iota 。此处要对字符串特别说明,字符串也会被认为是基本数据类型,字符串实际在底层原理上与复合类型的数据非常相似。同事go语言支持八进制,6进制,科学计数法。空指针的值是nil。 整…

百度地图API

一、百度地图API接入 1、搜索百度地图开发平台 2、注册百度账号 3、登陆并申请成为开发者 4、在百度地图开发平台的首页选择控制台,在控制台中创建应用 创建好应用以后就能在控制台我的应用中看到这个应用,其中最重要的是AK,这是百度地图…

从0-1,如何用低代码搭建管理系统

关键字:功能模块、流程中心、OA 前言:对于搭建系统,字眼上都知道是怎么回事,但要怎么搭建到最后怎么呈现一个投入运作的系统,估计就很少人知道了。当然作为专业的程序员肯定知道怎么操作,但是不是必须要专业…

IDEA集成Git

介绍 参考视频教程: https://www.bilibili.com/video/BV1vy4y1s7k6?p27 1 配置 Git 忽略文件 1.1为什么要配置 问题 1:为什么要忽略他们? 答:与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之 间的差异。…

湖仓一体电商项目(十八):业务实现之编写写入DWD层业务代码

文章目录 业务实现之编写写入DWD层业务代码 一、代码编写 二、​​​​​​​​​​​​​​创建Iceberg-DWD层表 1、在Hive中添加Iceberg表格式需要的包 2、创建Iceberg表 三、代码测试 1、在Kafka中创建对应的topic 2、将代码中消费Kafka数据改成从头开始消费 3、执…

【展馆攻略】展馆室内精准定位导航服务,便捷无忧,所见必达!

近年来,室内定位导航服务被各大商场、园区、景区等场所广泛使用,逐渐融入到人们日常生活中。室内地图从传统的平面信息图发展到智能化3D可视化交互展示,实现了室内综合场景的精准定位导航。 在面对室内或者建筑物遮挡区域,室内导航…

浏览器如何渲染页面?

DOM 浏览器渲染页面的过程就像是盖房子,一般先请求服务器得到HTML文件,HTML文件就相当于网页的框架结构,不过一开始浏览器得到的是显示字节内容的HTML文件,必须要内化为自己看的懂的语言才行,于是就把字节转化为字符&…

vue小案列(hello world)

目录 1 页签图标的报错解决 2 创建vue实例 3 初识Vue分析 1 页签图标的报错解决 1 首先,在我们的html中定义一个容器,然后右键(Open with LIve Server)打开,需要安装LIve Server插件 打开之后发现控制台报如下错误&a…

2022年服装进销存软件排行榜重磅出炉!

小编调研了一下身边做服装行业的老板,普遍反映如今服装实体店越来越难做了,日常经营过程中,难免会遇到各种问题:商品种类多、款式多、库存多、活动多……这些都让老板们应接不暇,尽管每天早出晚归地管理店铺&#xff0…

怎么音频转文字?快把这些方法收好

相信不少的小伙伴,经常需要对自己的录音文件进行整理归纳吧,其中不乏是课堂的重点知识、会议上的重点纪要、谈判中的重点内容。那小伙伴们平时在整理的时候,大概都需要花费多少时间呢?为了能够将音频的内容完整呈现出来&#xff0…

SpringBoot多数据源

使用场景 在实际开发中,可能遇到多数据源的场景。 业务复杂(数据量大) 数据分布在不同的数据库中,对业务数据进行垂直拆分。 可以拆分为微服务架构,依赖的业务可以通过远程调用的方式来是实现,那么这种方…

机器学习中常见性能度量汇总

前言 如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 回归 在回归任务上,目前最常用的性能度量方式是均方误差 (Mean Squared Error, MSE): MSE1m∑i1…

flex布局

flex布局 开启flex功能 <html><head><style>.container{border: 1px solid #000;width: 400px;height: 400px;margin-left: 20px;margin-top: 20px;display: flex; // 开启flex布局}.item{width: 100px;height: 100px;color: #fff;text-align: center;line…

kubernetes(2)k8s环境搭建:kubeadm安装、二进制方式安装

环境平台规划 k8s里面之前我们了解过&#xff0c;主要的内容是master和node&#xff0c;所有这里可以划分为 单master集群多master集群 单master集群 缺点&#xff1a;master挂掉后&#xff0c;便不能去管理node节点了 多master集群 与之前的区别便是多了master 服务器硬件…

Prometheus监控进程

Prometheus监控进程 process-export主要用来做进程监控&#xff0c;比如某个服务的进程数、消耗了多少CPU、内存等资源。 一、process-exporter使用 ‍ 1.1 下载 process-exporter process-exporter GibHUB地址 process-exporter 下载地址 process-exporter可以使用命令行…