zoukankan      html  css  js  c++  java
  • 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"
        }
    ]

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

  • 相关阅读:
    实践2.2 内核模块编译
    Linux及安全课程——相关链接总结
    20135202闫佳歆--week 9 期中总结
    20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结
    20135202闫佳歆--week 8 课本第4章学习笔记
    20135202闫佳歆--week 7 深入理解计算机系统第七章--读书笔记
    20135202闫佳歆--week 8 进程的切换和系统的一般执行过程--学习笔记
    20135202闫佳歆--week 7 Linux内核如何装载和启动一个可执行程序--实验及总结
    laravel open_basedir restriction in effect
    workerman wss net::ERR_SSL_PROTOCOL_ERROR
  • 原文地址:https://www.cnblogs.com/bytecodebuffer/p/11918953.html
Copyright © 2011-2022 走看看