如何使用时区信息在MySQL中存储date时间
我有数千张在坦桑尼亚拍摄的照片,我想将每张照片拍摄的date和时间存储在MySQL数据库中。 但是,服务器位于美国,当我试图在春季夏令时(美国)储存坦桑尼亚的date时间在“无效”时间内时遇到问题。 坦桑尼亚不做DST,所以时间是真正有效的时间。
更多的复杂情况是有许多不同时区的协作者需要访问存储在数据库中的date时间值。 我希望他们总是像坦桑尼亚时代出来,而不是在各个合作者所在的当地时代。
我不愿意设置会话时间,因为我知道当有人忘记设置会话时间并把时间全部弄错时,会出现问题。 我没有权力改变有关服务器的任何事情。
我已阅读: 夏令时和时区最佳做法和MySQLdate时间字段和夏令时 – 我如何参考“额外”小时? 并在PHP / MySQL中将date时间存储为UTC
但他们似乎都没有解决我的特殊问题。 我不是一个SQL专家; 有没有办法在设置DATETIME时指定时区? 我没有见过一个。 否则,如何解决这个问题的任何build议是非常感激的。
编辑:这是我遇到的问题的一个例子。 我发送命令:
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'
这个date和时间存在于坦桑尼亚,但不在数据库所在的美国。
你说:
我希望他们总是像坦桑尼亚时代出来,而不是在各个合作者所在的当地时代。
如果是这种情况,那么你不应该使用UTC。 所有你需要做的是在MySQL中使用DATETIME
types而不是TIMESTAMP
types。
从MySQL文档 :
MySQL将
TIMESTAMP
值从当前时区转换为UTC存储,并从UTC返回到当前时区以供检索。 (这不会发生其他types,如DATETIME
。
如果您已经在使用DATETIME
types,那么您必须在本地时间之前设置它。 你需要关注的不仅仅是数据库,更重要的是你的应用程序代码 – 你没有在这里展示。 这个问题和解决scheme将根据语言而有很大的不同,所以一定要用适当的应用程序代码语言来标记问题。
你所描述的所有症状表明,你永远不会告诉MySQL使用什么时区,所以它默认是系统的区域。 想一想:如果它全部是'2011-03-13 02:49:10'
,怎么能猜到这是当地的坦桑尼亚约会呢?
据我所知,MySQL不提供任何语法来指定date中的时区信息。 你必须改变它每个连接的基础 ; 就像是:
SET time_zone = 'EAT';
如果这不起作用(要使用命名区域,您需要configuration服务器 ,而且通常情况并非如此),那么您可以简单地使用UTC偏移量:
SET time_zone = '+03:00';