为什么 PHP 和 MySQL unix 时间戳在 1983-10-29 上发散?

2022-08-30 15:20:23

我一直在我的应用程序中使用PHP和MySQL的函数,将日期转换为时间戳。PHP和MySQL在我的本地机器上运行,这些函数通常返回相同的结果,正如我所期望的那样:strtotimeUNIX_TIMESTAMP

$ php
<?php echo strtotime("2011-06-02"); ?>
1307001600

mysql> SELECT UNIX_TIMESTAMP("2011-06-02") ts;
+------------+
| ts         |
+------------+
| 1307001600 |
+------------+

但是,偶然地,我碰巧注意到,当我输入日期时,结果不再相等:1983-01-01

$ php
<?php echo strtotime("1983-01-01"); ?>
410263200

mysql> SELECT UNIX_TIMESTAMP("1983-01-01") ts;
+-----------+
| ts        |
+-----------+
| 410256000 |
+-----------+

如您所见,PHP返回410263200,而MySQL返回410256000 - 相差7200秒。

这让我很好奇,我想知道时间戳在什么日期不再等效,所以我写了一个小程序,从今天的日期开始(以Y-m-d格式),使用PHP和MySQL并比较结果。然后,它从每个值中减去 1 天并循环,直到它们不再相等。strtotimeUNIX_TIMESTAMP

结果:

1983-10-29

1983 年 10 月 29 日,由于某种原因,返回相差 7200 秒的值。strtotimeUNIX_TIMESTAMP

有什么想法吗?

感谢您的阅读。


答案 1

你说你在阿拉斯加时间。从 http://www.statoids.com/tus.html

1983-10-30 02:00:阿拉斯加除阿留申群岛和圣劳伦斯岛外的所有地区都改用AT。在变化之前,西经138°以东(朱诺)的阿拉斯加一直在PT上;在138°W和141°W之间(雅库塔特)一直在育空时间,这是UTC-9与DST;西经162°以西(诺姆)一直在白令时间,这是带有DST的UTC-11。阿拉斯加-夏威夷地区的名称改为夏威夷-阿留申地区。

所以,我猜这是因为你的时区在1983年10月30日改变了两个小时(7200秒= 2小时)。

我猜MySQL的UNIX_TIMESTAMP使用的时区与PHP中的阿拉斯加设置不同,这可能是服务器默认值,或者取决于您的连接设置,因此当您到达该日期时,这些时会有所不同。

您可以通过询问MySQL在该连接上的时区设置来收集更多信息;有关输出以及如何解释输出的更多信息,请参阅此答案SELECT @@global.time_zone, @@session.time_zone;


答案 2

推荐