当前位置: 首页 > news >正文

关于在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时间类都生效

相关文章:

  • Git -> Git 所有提交阶段的回滚操作
  • 测试-时间规模化定律可以改进世界基础模型吗?
  • [Java · 铢积寸累] 数据结构 — 二维数组 - 概念引入
  • 【YOLOv8-pose部署至RK3588】模型训练→转换RKNN→开发板部署
  • docker保存镜像到本地
  • AutoJs相关学习
  • Spring Boot中`logging.config`配置项的详解及使用说明
  • Vscode指定缓存路径 .vscode 路径
  • 嘻游组件解密工具实战教程:资源解包与UI替换全流程
  • Java从入门到“放弃”(精通)之旅——抽象类和接口⑨
  • Linux新手快速入门指南
  • XML内容解析成实体类
  • 【Python笔记 03 】运算符
  • 基于大疆行业无人机的特色解决方案-无线通信篇:基于蜂窝以及自组网MESH的无线通信C2链路
  • 一文详解Pytorch环境搭建:Mac电脑pip安装Pytorch开发环境
  • 空间数据工程——如何使用 Python 和 ArcPy 对 Vision Zero 多边形的值进行地理处理
  • Linux 安装pm2并全局可用
  • mysql数据库语言学习
  • 【简单学习】llamaindex环境搭建以及构建RAG
  • 深入理解依赖、Jar 包与 War 包:Java 开发基石探秘
  • 国防部就美军“压力测试”大演习答澎湃:中国从来不信邪,不怕打,不怕压
  • 东部战区新闻发言人就美“劳伦斯”号导弹驱逐舰过航台湾海峡发表谈话
  • 央行研究局局长答澎湃:持续优化跨境金融服务政策工具箱,有效支持企业走出去
  • 五角大楼正在“全面崩溃”?白宫被指已在物色新国防部长
  • 泽连斯基:乌英法美将在伦敦讨论停火事宜
  • 现货黄金价格站上3400美元,今年迄今累涨逾29%