系统中的多时区.md 1.3 KB

系统中的多时区

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