Springboot中设置时间格式问题小结

 更新时间:2025年04月24日 09:31:37   作者:SYKMI  
本文主要介绍了Springboot中设置时间格式问题小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1-设置全局时间格式

1.Date类型的时间

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

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

2.JDK8时间

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

// 方案1
@Configuration
public class JacksonConfig {

    @Bean
    public 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 {

    @Bean
    public 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 {

    @Bean
    public 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时间类都生效

到此这篇关于Springboot中设置时间格式问题小结的文章就介绍到这了,更多相关Springboot设置时间格式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot @Autowired注入为空的情况解读

    SpringBoot @Autowired注入为空的情况解读

    这篇文章主要介绍了SpringBoot @Autowired注入为空的情况解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 浅谈JVM之使用JFR解决内存泄露

    浅谈JVM之使用JFR解决内存泄露

    内存泄露的主要原因就是java中的对象生命周期有长有短。如果长生命周期的对象引用了短生命周期的对象,就有可能造成事实上的内存泄露。本文将介绍JVM之使用JFR解决内存泄露。
    2021-06-06
  • Java Socket通信之聊天室功能

    Java Socket通信之聊天室功能

    这篇文章主要为大家详细介绍了Java Socket通信之聊天室功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 图文示例详解Lucene数据模型查询原理

    图文示例详解Lucene数据模型查询原理

    这篇文章主要为大家通过图文示例详解Lucene数据模型查询原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • SpringBoot如何通过devtools实现热部署

    SpringBoot如何通过devtools实现热部署

    这篇文章主要介绍了SpringBoot如何通过devtools实现热部署,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • SpringBoot Security整合JWT授权RestAPI的实现

    SpringBoot Security整合JWT授权RestAPI的实现

    这篇文章主要介绍了SpringBoot Security整合JWT授权RestAPI的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Java中Spring的Security使用详解

    Java中Spring的Security使用详解

    这篇文章主要介绍了Java中Spring的Security使用详解,在web应用开发中,安全无疑是十分重要的,选择Spring Security来保护web应用是一个非常好的选择,需要的朋友可以参考下
    2023-07-07
  • SpringBoot3和ShardingSphere5框架实现数据分库分表

    SpringBoot3和ShardingSphere5框架实现数据分库分表

    这篇文章主要介绍了SpringBoot3和ShardingSphere5框架实现数据分库分表的相关资料,需要的朋友可以参考下
    2023-08-08
  • 解决Long类型后端到前端精度丢失问题

    解决Long类型后端到前端精度丢失问题

    文章讨论了后端Long类型数据通过JSON传递到前端时可能出现的精度丢失问题,原因在于JavaScript的Number类型精度限制,提出了两种解决方案:将Long类型序列化为String类型,或者配置全局的ObjectMapper使用ToStringSerializer,通过自定义JacksonConfig类
    2025-01-01
  • PowerJob的WorkerHealthReporter工作流程源码解读

    PowerJob的WorkerHealthReporter工作流程源码解读

    这篇文章主要为大家介绍了PowerJob的WorkerHealthReporter工作流程源码解读,
    2023-12-12

最新评论