# 系统中的多时区

## mysql
当写入时间时, mysql会判断当前mysql时区,并对写入时间进行转换, 然后写入datetime或timestamp.
读取datatime和timestamp的时候, mysql会判断当前mysq时区,并对读取时间进行转换.

datetime中不存储时区,所以datetime的时区就是mysql时区. 
timesteamp中储存时区, 所以timestamp的时区不会随着mysql时区的调整和变化.
所以,当mysql时区调整后, 从数据库中读出的时间,datetime会与之前不一致,timestamp与之前一直.

## 解决方案
当一套系统要为多个时区提供服务时,有两种处理方式
* 时间全部使用timestamp存储.

* 所有系统内部的时区都设置为UTC时区, 即+00:00.
    *  数据库
    *  运行环境(windows,linux).在容器中,可以通过环境变量设置容器的时区.
    *  jvm时区默认与运行环境的时区保持一致.
    *  时间格式化工具的时区. java中Date是UTC时间, 没有时区的概念. 在格式化时,指定时区.
    *  序列化工具. 如jackson等

``` 
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss Z
spring.jackson.time-zone=GMT+0
```

所有的后端系统统一使用UTC时间, 与外部系统进行数据交互时,时间需携带时区.例如向前端返回时间数据, 应该携带时区.
