我的数据库服务器(运行 MySql 5.5)设置为 UTC,日期使用 UNSIGNED INT 作为 Unix 时间戳存储在数据库中。该数据库主要用于存储在特定时间(exec_time)运行的任务。
我通过使用登录用户的时区(在本例中为 BST)在 PHP 中创建时间戳来插入任务。例如,我有一个任务设置为在格林威治标准时间明天早上 4 点 1351396800 运行。
我使用以下查询从数据库中提取任务:
SELECT * FROM tasks WHERE exec_time <= UNIX_TIMESTAMP();
当时钟在明天凌晨 2 点倒拨一小时时,此设置是否正常?
更新:PHP 可以很好地转换日期。将 PHP 时区设置为 Europe/Dublin(当前为 BST)时,为午夜 12 点和凌晨 4 点添加的两个事件存储如下:
mysql> select exec_time, FROM_UNIXTIME(exec_time) from tasks order by id desc limit 2;
+-------------+----------------------------+
| exec_time | FROM_UNIXTIME(exec_time) |
+-------------+----------------------------+
| 1351378800 | 2012-10-27 23:00:00 |
| 1351396800 | 2012-10-28 04:00:00 |
最佳答案
tl;dr 只要您的 exec_time
列具有 TIMESTAMP 数据类型,您就应该没问题。
没有明确的 UNIX_TIMESTAMP 列数据类型。有一个 TIMESTAMP 列数据类型。当从日期/时间字符串和 UTC 转换时,此数据类型的列的值会自动从您的客户端连接的时区转换为 UTC(a/k/a Z 或 Zulu 时间,f/k/a 格林威治标准时间)转换为日期/时间字符串后到您的客户端连接的时区。
因此,如果您将 exec_time
列存储为 TIMESTAMP
,您应该能够使用您建议的子句:
WHERE exec_time <= UNIX_TIMESTAMP()
这将起作用,因为您的 exec_time
值和 UNIX_TIMESTAMP()
函数调用的结果都在服务器端以 UTC 时间处理。您的 exec_time
值将以 UTC 格式存储。
如果您将 exec_time
存储为 UNSIGNED INT
或类似的数字数据类型,您将无法利用自动转换为 UTC 的优势存储前。
您可以通过如下设置客户端连接时区来扰乱显示转换行为:
SET time_zone='SYSTEM' /* for your system's local time */
或
SET time_zone='+0:00' /* for UTC */
或
SET time_zone'America/New_York' /* or 'Europe/Vienna' or whatever */
发出这些 SET 操作之一后,执行
SELECT exec_time, FROM_UNIXTIME(exec_time)
了解您的值是如何在服务器端存储和翻译的。
如果你想看看八天后会发生什么,试试这个:
SELECT 3600*24*8+exec_time, FROM_UNIXTIME(3600*24*8+exec_time)
http://dev.mysql.com/doc/refman/5.5/en//time-zone-support.html
关于php - MySql UNIX_TIMESTAMP() 存储为 UTC,夏令时临近,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13103762/