java - Java:Mysql时间戳夏令时错误
问题描述
我在 mysql 中有一个特定的表,其字段refresh_time
Type
为timestamp
.
在我的代码中,我将该refresh_time
字段更新为下个月的未来日期。为此,我使用以下逻辑计算下个月日期的毫秒数:
periodRefresh = currentTime + MyServiceUtils.calculateNoOfDaysInMonth(currentTime)*86400000L;
然后periodRefresh (milliseconds)
我转换为的值并将其java.sql.Timestamp
传递给数据库端以更新字段:
new Timestamp(periodRefresh);
但是发生的事情是 db 中的当前日期是2021-04-03 15:57:13
,当运行上述逻辑以将时间更新到下个月时,它同时更新了2021-05-03 13:57:13
比预期时间少 2 小时的时间。
我们的服务器遵循 UTC 时区,但我看到用户来自澳大利亚,那天(2021 年 4 月 4 日)在 AEST 有夏令时。但即便如此,它并没有像我转换2021-04-03 15:57:13 UTC
为 AEST 一样添加到上面,它出现2021-04-03 01:57:13
在凌晨 3 点的夏令时。
以上所有内容使我对以下问题感到有些困惑:
- 如果我遵循 UTC 时区,那么夏令
sql.Timestamp
时mysql
是否也会受到影响? - 当我遵循 UTC 时区时,AEST 夏令时如何影响我的澳大利亚用户?
- 即使 DST 正在影响,所以它应该增加/减少 1 小时的时间,但在我的情况下,2 小时的差异是如何发生的?
解决方案
在 MySQL 中,TIMESTAMP
数据类型总是以 UTC 格式存储在表中。当您将它们放入数据库时,它首先将它们从您的连接time_zone
设置转换为 UTC。当你检索它们时,它会以另一种方式翻译它们。这不适用于DATETIME
数据类型。
如果您有一个全局应用程序,则此TIMESTAMP
行为很方便。您可以询问每个用户的首选时区,并将其存储为用户偏好设置。
如果您采用原始(UTC 中的 UNIX 纪元以来的秒数)TIMESTAMP
值并将一个月的秒数添加到其中,则生成的时间戳值可能处于不同的夏令时状态。所以会有不同的翻译。
任何一个
在 MySQL 中进行时间戳处理,例如使用
UPDATE tbl SET periodRefresh = periodRefresh + INTERVAL 1 MONTH;
在您的应用程序中完成所有操作并使用
DATETIME
, notTIMESTAMP
, 数据类型(以避免数据库的时区转换,或在您的应用程序中完成所有操作并使用
SET time_zone='UTC'
;在每个连接上。
推荐阅读
- automation - 无法启动 webkit 或与 playwright 截屏
- python - Python:将日志记录模块与 configparser 或 argparser 一起使用
- javascript - 使用 Leaflet 扩展自定义图标的“可点击”区域
- c# - 不使用 SSL 或 TLS 时 MailKit 中的 SSL 或 TLS 连接错误
- excel - 对于大文件(大于 1GB),如何使用 VBA (Excel) 将带有 unix 行结尾的文件转换为 DOS 并快速完成?
- c - 当我链接目标文件时,为什么我的 pdb 文件缺少符号?
- java - 如何在 AppCompatTextView 的末尾添加一个 LinerLayout?
- ios - 将相机照片保存到文件位置 - Swift Xcode
- javascript - 将字符串拆分为字符对
- c++ - 重载函数调用 operator() 用于模板对象的索引和赋值