# 系统中的多时区 ## 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时间, 与外部系统进行数据交互时,时间需携带时区.例如向前端返回时间数据, 应该携带时区.