如何正确地将时区设置为 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 来自数据库),满足我的条件并且统一用于java
和data.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,以便以这种格式正确保存和检索所有时间戳?的主要内容,如果未能解决你的问题,请参考以下文章
NSDate: 我只输入utc时间成分,并正确设置日历,但NSDate不知为何会被重新计算到我的时区。
即使系统设置不正确,如何在JavaScript中找到正确的时区?