1、背景
在实际项目中,服务器都是部署在美国,为了 时间的统一,需要都使用 UTC时间
2、怎么做
默认测试环境 安装的 mysql 都设置成了 UTC 时区。 但 在 代码层面, 有很多 更新的 地方用了 .setGmtModified(new Date()); 进行更新操作, 查看数据库 发现 主动设置 时间的值 都是 当前的时间, 数据库生成的时间都是 UTC 时间。
经过大量查询,有博客说是 用 Handler 处理的,, 或者到 Map.xml中 使用 UTC 时间函数的, 但感觉还是很麻烦
在想有没有一种配置,直接让 代码中的时间 到数据库自动就 映射呢,理论上来说肯定存在的。
最后发现这片文章,SpringBoot 统一时区的方案, 主要 配置如下?:
1、数据库 设置成 URC
2、数据库连接池中添加 参数:useLegacyDatetimeCode=false&serverTimezone=UTC
测试后,发现 主动设置的时间 到数据库都设置成了 UTC时间。
3、存在2个问题
-
在没有保证服务器 时间的设置时, 只 设置 数据库连接池配置的时候,查询出来的 时间变成了 本地时间
-
在没进行数据库连接池参数 设置的时候, 查询出来的结果是 数据库显示的时间(UTC),插入的是 本时区的当前时间
-
最后 把 服务器也进行设置,置成 UTC 时区。 测试, 存入 数据库的是 UTC, 读取出来的也是 UTC时间
4 总结
这样的配置是最简便的,也不需要修改原有的代码。
4.1 设置 服务器的时区
@PostConstruct
void started() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
4.2 mybatis 数据库连接池 添加 useLegacyDatetimeCode=false&serverTimezone=UTC
4.3 数据库设置成 UTC
5、意外
如果出现 设置 默认时区, 程序运行中不 生效问题,查看是否在 引用的三方包jar中,有对时区进行了设置 导致的。(大坑)