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

2025-05-14 08:15:32 123
魁首哥

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设置时间格式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

分享
海报
123
上一篇:手把手教你排查解决Java编译报错:找不到符号 下一篇:Java实现ThreadLocalMap 扩容机制

忘记密码?

图形验证码