• spring boot 配置时区差别


    前提

    数据库时区:GMT+8

    show variables like '%time_zone%';

    本机电脑时区:

    情景一、不指定时区

    传递的参数映射到Data不指定时区,连接数据库不指定时区,保存时间以及获取时间如下:

    • 保存时间

    传递的参数:

    {
        "date":"2019-11-23T18:30:00"
    }

     注备:GMT 格林威治时间 ,UTC 标准时间,ISO 标准时间,CST 北京时间 ,GMT = UTC ,例如 GMT+8 = UTC+8

    时间相差了 8消失,想要保存的是23日6点半,实际保存的是24日2点半。系统日志打印的也是相差了8小时。

    测试01:修改计算机时区

     再次测试保存时间

     

     系统与数据库并不受影响,所以系统时间不会影响。如果不指定时区,程序默认使用 CST 中国时区显示在控制台。而接收的时间默认是 GMT+0 

    由于认为输入的时区是0 区,而保存的是+8 区,所以快了8小时

    获取时间:

        {
            "id": 29,
            "date": "2019-11-23T18:30:00.000+0000"
        }

    获取时间是正确的,没有指定时区,获取的时区是数据库GMT8 区是时间,转换为对象会没有指定时区是GMT 0区,减去8小时显示

    情景二、指定数据库连接时区

    url: jdbc:mysql://localhost:3306/test?serverTimeZone=GMT+10

    测试证明,连接时区对存储日期不受影响

    获取时间:

    测试证明,连接时区对获取时间没有影响

    此处留作疑问

    情景三、指定json 映射时区

    spring:
        jackson:
            time-zone=GMT+5

    存储测试:

    {
        "date":"2019-11-23T18:30:00"
    }

    系统显示:

     

     系统日志显示北京时间23日9点半,比存入时间快了3小时。数据库也是快了3小时。那么当指定时区时,系统不再使用 0 区,而是将输入的时间表有时区。

    获取测试:

    结果

    [
        {
            "id": 34,
            "date": "2019-11-23T23:30:00.000+0500"
        },
        {
            "id": 35,
            "date": "2019-11-23T23:30:00.000+0500"
        },
        {
            "id": 36,
            "date": "2019-11-23T18:30:00.000+0500"
        }
    ]

    只有最后一个时间是正确的,之前的时间都是错误的。

    错误分析:从数据库获取的时间是+8 区是时间,现在指定了json 时区,前2者是按0区存储的,现在显示的转换为+5区,导致错误偏移了5小时。

    情景四、设置全局时区,且设置了json 时区

    TimeZone.setDefault(TimeZone.getTimeZone("GMT+5"));

    在启动类上加入时区代码,保存测试

    {
        "date":"2019-11-23T18:30:00"
    }

     

     获取测试:

    [
        {
            "id": 34,
            "date": "2019-11-23T23:30:00.000+0500"
        },
        {
            "id": 35,
            "date": "2019-11-23T23:30:00.000+0500"
        },
        {
            "id": 36,
            "date": "2019-11-23T18:30:00.000+0500"
        },
        {
            "id": 37,
            "date": "2019-11-23T18:30:00.000+0500"
        }
    ]

    测试证明,全局时区只是显示的控制控制台打印的时间,不会影响其他

  • 相关阅读:
    [RK3288][Android6.0] U-boot 启动流程小结【转】
    学习笔记二十三——字符函数库cctype【转】
    【Git学习笔记】用git pull取回远程仓库某个分支的更新,再与本地的指定分支自动merge【转】
    Git 少用 Pull 多用 Fetch 和 Merge 【已翻译100%】【转】
    git 拉取和获取 pull 和 fetch 区别【转】
    setprecision、fixed、showpoint的用法总结(经典!!超经典!!)【转】
    Android休眠唤醒机制简介(二)
    获取元素个数的函数
    返回两个时间范围内的一个随机时间
    全角半角转换函数
  • 原文地址:https://www.cnblogs.com/baizhuang/p/11918953.html
Copyright © 2020-2023  润新知