【保姆级】手把手带你解决时区问题

1,196 阅读3分钟

什么是时区

时区,是为了适应地球自转造成的时间差异而人为划分的区域。

由于地球自转,不同地区的太阳升起和落下的时间不同,因此各地的时间也有所不同。为了统一时间标准,人们将地球按照经度划分为24个时区,每个时区相差1小时。 以本初子午线(0°经线)为基准,向东和向西各划分12个时区。

例如,中国采用东八区的时间,当东八区是上午8点时,相邻的东七区是上午7点,而西五区则是前一天的晚上7点。

其实设置时区是为了世界各地的时间有了一个相对统一的标准,便于国际间的交流和协调(有了时区每个地方的人就可以根据自己所在的时区来知道现在大概是什么时间啦~比如说北京在东八区,当北京是中午12点的时候,纽约在西五区,那纽约就是前一天的晚上11点)

额,还不是很明白?我们举个栗子

想象一下地球就像一个大苹果,咱们把这个大苹果从中间竖着切开,然后把切开的面当成一个表盘,最中间的那条线就是0点的位置,从这儿开始,像切蛋糕一样,把地球表面分成24块。每一块代表一个时区,相邻的两个时区时间就相差1个小时。。。

(比如说,住在北京的人和住在纽约的人,因为他们在地球上的位置不一样,看到太阳升起和落下的时间也不一样)

好了回归正题。。。应该有不少同学在写代码的过程中都碰到过时区不一致所带来的问题,那么碰到类似问题该如何解决呢?

查看服务器时区

首先使用date -R查看服务器上的时区设置,如下图:

查看Mysql时区

接着,查看MySQL的时区设置,如下图:

项目

配置项目: application.yml

原因是

  • spring-boot中对于@RestController或者@Controller+@ResponseBody注解的接口方法的返回值默认是Json格式
  • 所以当对于date类型的数据,在返回浏览器端是会被spring-boot默认的Jackson框架转换,而Jackson框架默认的时区GMT(相对于中国是少了8小时)

处理方式

  • 在application.yml添加配置
spring:
  jackson:
    #日期格式化
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
  • 再次访问的数据:
{
    "code": 1,
    "msg": "SUCCESS",
    "result": {
        "extractRecords": null,
        "chargeRecords": [
            {
                "id": 4,
                "account": "1604516",
                "deposit_paid": 500,
                "deposit_paid_time": "2019-05-30 11:01:03"
            }
        ]
    }
}

jackson的全部配置

spring:
  jackson:
    #日期格式化
    date-format: yyyy-MM-dd HH:mm:ss
    serialization:
       #格式化输出 
      indent_output: true
      #忽略无法转换的对象
      fail_on_empty_beans: false
    #设置空如何序列化
    defaultPropertyInclusion: NON_EMPTY
    deserialization:
      #允许对象忽略json中不存在的属性
      fail_on_unknown_properties: false
    parser:
      #允许出现特殊字符和转义符
      allow_unquoted_control_chars: true
      #允许出现单引号
      allow_single_quotes: true