springboot 统一时区


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中,有对时区进行了设置 导致的。(大坑)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM