栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot前台后台日期转换相差8小时,以及数据库时区问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot前台后台日期转换相差8小时,以及数据库时区问题

一、前台后台日期转换相差8小时

1、前台  后台:

UTC:世界协调时间,也就是零时区的时间
CST:中国标准时间,中国是东八区,故比UTC大8小时

前台时间传到后台,通过jackson设置为UTC时区(详情见【注】),而Date类型为CST时区,故转换为Date类型后即UTC到CST的转换,所以加8小时。

【注】

如果你用过java8新的时间类下的Instant,查看toString方法会发现它使用DateTimeFormatter.ISO_INSTANT标准时间格式输出,如下:

Instant now = Instant.now();
// 2019-08-18T02:57:55.234Z

这个输出格式与我们上面的配置一致,所以就日期格式配置而言这本身并没有问题,下面我们再查看JacksonAutoConfiguration源码中configureDateFormat方法

private void configureDateFormat(Jackson2ObjectMapperBuilder builder) {
    String dateFormat = this.jacksonProperties.getDateFormat();
    if(dateFormat != null) {
        try {
            Class ex = ClassUtils.forName(dateFormat, (ClassLoader)null);
            builder.dateFormat((DateFormat)BeanUtils.instantiateClass(ex));
        } catch (ClassNotFoundException var6) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
            TimeZone timeZone = this.jacksonProperties.getTimeZone();
            if(timeZone == null) {
                timeZone = (new ObjectMapper()).getSerializationConfig().getTimeZone();
            }

            simpleDateFormat.setTimeZone(timeZone);
            builder.dateFormat(simpleDateFormat);
        }
    }
}

当我们没有配置时区时,它会执行timeZone = (new ObjectMapper()).getSerializationConfig().getTimeZone();,进一步查看timeZone属性,发现这其实是默认时区DEFAULT_TIMEZONE = TimeZone.getTimeZone("UTC")

看来问题的根源就在这儿,也就是说它其实用的是UTC时间。

2、后台  前台:CST到UTC的转换,所以减去8小时。

3、解决办法:(如果不介意的话问题不大,因为前台传到后台的时间虽然多8个小时,但是后台传到前台的时间又减去了8小时,所以到前台的时间和用户输入的时间是一致的),若需要解决,则可以在yml中加上一下代码即可解决:GMT+8表示北京时间

spring:
    jackson:
        time-zone: GMT+8

二、数据库时区(有时候会出错)

        对象保存到数据库后,有时候时间会差8小时,可通过设置serverTimezone=Asia/Shanghai

或serverTimezone=GMT%2B8来解决。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/684269.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号