最近在用 SpringBoot
开发这个博客, 这两天终于快把前台页面写完了, 在做评论模块的时候发现时间有时区的问题, 经过一系列反复调整和实验, 终于知道是怎么回事了. 专门在这记录一下方便以后查询.
运行环境
博客系统使用 MySQL
作为数据库, 后台使用 SpringBoot
作为框架, Kotlin
作为开发语言, 然后都是运行在宿主机为 CentOS 7
的 Docker
环境之中.
知识要点
Java
和MySQL
容器中的时区要一致:
在使用官方的镜像作为容器环境时, 首先要保证容器的时区要一致.- 连接
Url
的时区也要和容器的时区保持一致:
在编写配置时一定要协商数据库的时区参数:
其中的jdbc:mysql://localhost:3306/db?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useUnicode=true
serverTimezone
一定要匹配上数据库运行环境对应的时区, 不然就会出现时间对不上的问题.
总结
默认情况下, 容器的时区都是 UTC
, 但是由于在使用工具查看数据库时为了准确反应数据库存储的时间, 都会给 MySQL
设置本土时区, 也就是 Asia/Shanghai
, 所以结合上面的结论, 也要同时将 Java
容器的时区和数据库连接地址的时区统一成 Asia/Shanghai
.