关于在Springboot中设置时间格式问题

目录

  • 1-设置全局时间格式
      • 1.Date类型的时间
      • 2.JDK8时间
      • 3.使Date类和JDK8时间类统统格式化时间
  • 2-关于@DateTimeFormat注解

1-设置全局时间格式

1.Date类型的时间

对于老项目来说,springboot中许多类使用的是Date类型的时间,没有用到LocalDateTime等JDK8时间类,那么直接在配置文件中设置json序列化时间格式即可

  # 配置文件中配置jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8

2.JDK8时间

如果项目中的时间采用的是LocalDateTime、LocalDate、LocalTime等JDK8时间类,Jackson默认情况下不支持这些时间类的序列化,那么我们需要显式的配置它。

// 方案1
@Configuration
public class JacksonConfig {@Beanpublic Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();// 注册 JavaTimeModule 以支持 JDK 8 时间类JavaTimeModule javaTimeModule = new JavaTimeModule();// 配置日期时间格式DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 自定义 LocalDateTime 序列化器和反序列化器javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));// 自定义 LocalDate 序列化器和反序列化器(如果需要)javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));// 自定义 LocalTime 序列化器和反序列化器(如果需要)javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));builder.modules(javaTimeModule);// 其他全局配置builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 禁用时间戳格式return builder;}
}
// 方案2
@Configuration
public class JacksonConfig {@Beanpublic ObjectMapper objectMapper() {ObjectMapper objectMapper = new ObjectMapper();// 注册 JavaTimeModule 以支持 JDK 8 时间类JavaTimeModule javaTimeModule = new JavaTimeModule();// 配置日期时间格式DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 自定义 LocalDateTime 序列化器和反序列化器javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));// 自定义 LocalDate 序列化器和反序列化器(如果需要)javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));// 自定义 LocalTime 序列化器和反序列化器(如果需要)javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));objectMapper.registerModule(javaTimeModule);// 其他全局配置objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 禁用时间戳格式return objectMapper;}
}

注意!!!当你显式通过配置类进行配置的时候,配置文件中对于Date类型的格式配置以及时区通通失效了,这是因为自定义的配置会覆盖Springboot的自动配置,当检测到你自定义配置时,自动配置不会再生效

3.使Date类和JDK8时间类统统格式化时间

如果你的项目比较乱,这些类混合在用,那么你需要在显式配置的时候捎带上Date类如何序列化的规则,如下

@Configuration
public class JacksonConfig {@Beanpublic ObjectMapper objectMapper() {ObjectMapper objectMapper = new ObjectMapper();// 设置全局日期格式(影响 java.util.Date)objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));// 注册 JavaTimeModule 以支持 JDK 8 时间类JavaTimeModule javaTimeModule = new JavaTimeModule();// 配置日期时间格式DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 自定义 LocalDateTime 序列化器和反序列化器javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));// 自定义 LocalDate 序列化器和反序列化器javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));// 自定义 LocalTime 序列化器和反序列化器javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));objectMapper.registerModule(javaTimeModule);// 禁用时间戳格式(影响 java.util.Date 和 JDK 8 时间类)objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);return objectMapper;}
}

以上这些配置根据项目情况选择合适的序列化/反序列化方案,这些方案适用于json的入参/出参的序列化规则,也就是说,当你的入参是json格式时,对应的时间只要适用于你规定的格式,那么jackson将会自动处理
当你想自定义某个类中的时间属性以特定格式返回的时候,你可以使用@JsonFormat注解,该注解优先级大于项目全局时间格式

2-关于@DateTimeFormat注解

@DateTimeFormat 注解主要用于入参时格式化日期参数,尤其是在处理表单提交或 URL 请求参数时。它不会影响出参(即返回给客户端的 JSON 或其他格式响应)的日期格式,该注解对Date类和JDK8时间类都生效

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

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

相关文章

面试篇:Java并发与多线程

基础概念 什么是线程?线程和进程的区别是什么? 线程 是程序执行的最小单位,它是 CPU 调度和执行的基本单元。一个进程可以包含多个线程,这些线程共享进程的资源(如内存),但每个线程有自己的栈…

【Qt/C++】QPrinter关于QInternal::Printer的解析

1. 问题分析 QInternal::Printer在Qt框架中并不是一个直接暴露给用户的API。相反,它是一个枚举值,用于标识QPaintDevice的类型。在Qt中,QPaintDevice是一个抽象类,用于任何可以进行绘制的设备,如窗口、图像、打印机等…

uniapp返回上一页接口数据更新了,页面未更新

注意:不是组件套组件可以不使用setTimeout延时 返回上一页一般会走onshow,但是接口更新了页面未更新 onShow(() > {// 切换城市后重新调用数据if (areaId.value) {const timer setTimeout(async () > {timer && clearTimeout(timer);…

MCU开发学习记录11 - ADC学习与实践(HAL库) - 单通道ADC采集、多通道ADC采集、定时器触发连续ADC采集 - STM32CubeMX

名词解释: ADC: Analog-to-Digital SAR:Successive Approximation Register 本文将介绍ADC的概念、相关函数以及STM32CubeMX生成ADC的配置函数。针对于ADC实践:单通道采集芯片内部温度传感器(ADC1_ch16)&a…

68元撬动未来:明远智睿2351开发板重塑嵌入式开发生态

在嵌入式开发领域,价格与性能的矛盾始终存在:高端开发板功能强大但成本高昂,低价产品则往往受限于性能与扩展性。明远智睿2351开发板以68元(含税)的定价打破这一僵局,通过四核1.4G处理器、全功能Linux系统与…

关于ubuntu密码正确但是无法登录的情况

参考这个文章: https://blog.csdn.net/cuichongxin/article/details/117462494 检查一下是不是用户被lock了 输入passwd -s username 如果用户是L状态,那么就是lock了。 使用 passwd -u username 解锁 关于 .bashrc 不生效 有几点: ~/.…

LeetCode-47. 全排列 II

1、题目描述: 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输入:nums [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1]]示例 2: 输入:nums [1,2,3] 输出&am…

Python 设计模式:访问者模式

1. 什么是访问者模式? 访问者模式是一种行为设计模式,它允许你在不改变对象结构的前提下,定义新的操作。通过将操作封装在访问者对象中,访问者模式使得你可以在不修改元素类的情况下,向元素类添加新的功能。 访问者模…

基于stm32的智能门锁系统

标题:基于stm32的智能门锁系统 内容:1.摘要 摘要:随着科技的飞速发展,人们对家居安全的要求日益提高,智能门锁系统应运而生。本研究的目的是设计并实现一个基于STM32的智能门锁系统。采用STM32微控制器作为核心控制单元,结合指纹…

GitHub 常见高频问题与解决方案(实用手册)

目录 1.Push 提示权限错误(Permission denied) 2.push 报错:rejected non-fast-forward 3.忘记添加 .gitignore,上传了无关文件 4. 撤销最近一次 commit 5.clone 太慢或失败 6.如何切换/创建分支 7.如何合并分支 8.如何删除远程分支 9.如何 Fork + PR(Pull Reque…

【MySQL数据库入门到精通-04 DML操作】

一、DML DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。 二、添加数据 1.给指定字段添加数据 代码如下(示例): insert into 表名 (字段1,字…

2022 年 9 月青少年软编等考 C 语言六级真题解析

目录 T1. 栈的基本操作T2. stack or queue思路分析T3. 合影效果T4. 发型糟糕的一天思路分析T1. 栈的基本操作 题目链接:SOJ D1188 此题为 2022 年 6 月三级第二题仅有栈操作的版本,见 2022 年 6 月青少年软编等考 C 语言三级真题解析中的 T2。 T2. stack or queue 题目链…

美创市场竞争力突出!《2025中国数据安全市场研究报告》发布

数据要素时代,数据已成国家战略性资源,数据安全关乎国家安全!数说安全发布的《2025中国数据安全市场研究报告》(以下简称《报告》)显示,2024年数据安全市场逆势增长,市场规模首次突破百亿。《报…

VUE Element-ui Message 消息提示组件自定义封装

为了让message 信息提示的更加方便快捷,减少不同地方的调用,避免代码的重复,特意再官方message 组件的基础上二次封装,使代码更加的优雅和高效。 实现效果: 代码组件: 封装成 message.js 文件,…

高防IP能抵御哪些类型的网络攻击?

高防IP(High Defense IP)是一种专门针对网络攻击设计的防护服务,主要通过流量清洗、协议分析、行为检测等技术抵御多种网络攻击。以下是其能防御的主要攻击类型及原理: ​​一、常见防御的攻击类型​​ ​​DDoS攻击(分…

小红书文字配图平替工具

小红书的文字配图只有手机版有,想找一个电脑版的,查了一下。以下是几款类似小红书风格的花字、艺术字生成工具,适合制作吸睛的社交媒体配图,分为 手机APP 和 在线工具 两类,供你选择: 一、手机APP推荐 醒图…

【浙江大学DeepSeek公开课】走向数字社会:从DeepSeek到群体智慧

从DeepSeek到群体智慧 一、人工智能发展脉络二、DeepSeek大模型的意义与特点三、人工智能促进社会数字化转型四、群体智慧与数字社会 一、人工智能发展脉络 图灵与图灵机:1937年,图灵发表论文《On computable numbers, with an application to the Ents…

解读大型语言模型:从Transformer架构到模型量化技术

一、生成式人工智能概述 生成式人工智能(Generative Artificial Intelligence)是一种先进的技术,能够生成多种类型的内容,包括文本、图像、音频以及合成数据等。其用户界面的便捷性极大地推动了其广泛应用,用户仅需在…

JSON实现动态按钮管理的Python应用

在开发桌面应用程序时,动态生成用户界面元素并根据配置文件灵活管理是一项常见需求。本文将介绍如何使用Python的wxPython库结合JSON配置文件,开发一个支持动态按钮创建、文件执行和配置管理的桌面应用程序。该应用允许用户通过设置界面配置按钮名称和关…

序章:写在前面

目录 为什么要学习 Python?那么,Python 到底是什么呢?Python 的用户多吗?Python 的语法究竟是怎样的?C 语言JavaPython Python 好学吗? 为什么要学习 Python? 这个问题或许会让不少人感到不解。…