如何正确地将时区设置为 UTC,以便以这种格式正确保存和检索所有时间戳?

Posted

技术标签:

【中文标题】如何正确地将时区设置为 UTC,以便以这种格式正确保存和检索所有时间戳?【英文标题】:How to properly set timezone to UTC, so all timestamps are correctly saved and retrieved in this format? 【发布时间】:2019-11-08 05:18:06 【问题描述】:

在我的 spring boot (2.1.4) 项目中,我有 mysql 数据库(5.7.21 - 服务器版本)和以下应用程序属性:

spring.datasource.url=jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC

hibernate.jdbc.time-zone=UTC

现在,当我使用 java(通过使用 @PostConstruct 或某些控制器/服务逻辑)保存带有 @CreationTimestamp 的实体记录时,日期被正确转换为 UTC 时区并保存在数据库中,并且还在 @987654326 中检索@ 格式(如我所愿)。但是,当我通过 data.sql 文件添加(其他)记录时。相应的时间戳字段也有 UTC 时区,但这次时间没有正确转换为 UTC(这只是我当前的时间,时区设置为 UTC)。

如何正确设置这两种情况以始终将本地时间转换为 UTC、保存并始终从数据库中检索为 UTC?

更改 mysql 全球时区是否应该解决问题?

例子:

我在时区:GMT+2 11:11:53 保存的记录的时间设置如下:

1.) Java 创建记录:09:11:53

2.) data.sql 创建记录:11:11:53

两者都在 UTC 时区(我可以看到它,当在客户端获取时),但只有第一个是正确的。

【问题讨论】:

【参考方案1】:

将全球时区设置为 UTC 解决了问题(所有时间戳现在都设置为 UTC,在我的 本地时间 中显示在数据库中,但被检索为 UTC 来自数据库),满足我的条件并且统一用于javadata.sql 原始记录。

要在 Windows 上执行此操作,我必须从这里下载时区 sql 文件: https://dev.mysql.com/downloads/timezones.html

,然后运行:

mysql -D mysql -uroot -pmypassword < timezone_posix.sql
SET @@global.time_zone = UTC;

这篇文章也对我帮助很大:

How to set correct MySQL JDBC timezone in Spring Boot configuration

【讨论】:

以上是关于如何正确地将时区设置为 UTC,以便以这种格式正确保存和检索所有时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

如何以正确的格式获取 UTC 偏移量(时区)?

如何将linux 的本地时间设置为utc时间

NSDate: 我只输入utc时间成分,并正确设置日历,但NSDate不知为何会被重新计算到我的时区。

即使系统设置不正确,如何在JavaScript中找到正确的时区?

javascript 不能正确地将 angular ui datepicker 日期转换为 UTC

带有时区的 PostgreSQL date()