一尘不染

如何使用时区信息在MySQL中存储日期时间

mysql

我有数千张在坦桑尼亚拍摄的照片,我想将每张照片的日期和时间存储在MySQL数据库中。但是,该服务器位于美国,当我尝试存储坦桑尼亚的日期时间(在美国的Spring夏时制时间)处于“无效”小时之内时,我遇到了问题。坦桑尼亚不执行夏令时,因此该时间实际上是有效时间。

其他复杂情况是,来自许多不同时区的协作者将需要访问存储在数据库中的日期时间值。我希望他们 总是
以坦桑尼亚的时间出现,而不是出现在各个合作者所在的当地时间。

我不愿意设置会话时间,因为我知道当某人有时忘记设置会话时间并弄错所有时间会出现问题。而且我无权更改有关服务器的任何内容。

我读过: 夏令时和时区最佳实践以及 MySQL日期时间字段和夏令时-
我该如何引用“额外”小时?
将日期时间存储为PHP /
MySQL中的UTC

但是它们似乎都没有解决我的特殊问题。我不是SQL专家;设置DATETIME时,是否可以指定时区?我还没看过 否则,对于如何解决此问题的任何建议将不胜感激。

编辑:这是我遇到的问题的一个示例。我发送命令:

INSERT INTO Images (CaptureEvent, SequenceNum, PathFilename, TimestampJPG) 
VALUES (122,1,"S2/B04/B04_R1/IMAG0148.JPG","2011-03-13 02:49:10")

我得到错误:

Error 1292: Incorrect datetime value: '2011-03-13 02:49:10' for column 'TimestampJPG'

该日期和时间存在于坦桑尼亚,但在数据库所在的美国不存在。


阅读 411

收藏
2020-05-17

共1个答案

一尘不染

你说:

我希望他们总是以坦桑尼亚的时间出现,而不是出现在各个合作者所在的当地时间。

如果是这种情况,那么你应该 使用UTC。您需要做的就是DATETIME在MySQL中使用类型而不是TIMESTAMP类型。

从MySQL文档

MySQL将TIMESTAMP值从当前时区转换为UTC以进行存储,然后从UTC转换为当前时区以进行检索。(对于其他类型,例如,不会发生这种情况DATETIME。)

如果您 已经在
使用一种DATETIME类型,则一定不要在本地时间开始设置它。您将需要减少对数据库的关注,而将更多的精力放在应用程序代码上(在此未显示)。该问题和解决方案将根据语言而变化很大,因此请确保使用您的应用程序代码的适当语言标记该问题。

2020-05-17