为什么PHP和MySQL unix时间戳在1983-10-29分歧?

ech*_*cho 29 php mysql datetime date

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

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

mysql> SELECT UNIX_TIMESTAMP("2011-06-02") ts;
+------------+
| ts         |
+------------+
| 1307001600 |
+------------+
Run Code Online (Sandbox Code Playgroud)

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

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

mysql> SELECT UNIX_TIMESTAMP("1983-01-01") ts;
+-----------+
| ts        |
+-----------+
| 410256000 |
+-----------+
Run Code Online (Sandbox Code Playgroud)

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

这让我很好奇,我想知道时间戳不再等同于什么日期,所以我写了一个以今天的日期(Ymd格式)开头的小程序,使用PHP strtotime和MySQL UNIX_TIMESTAMP并比较结果.然后它从每个值中减去1天并循环直到它们不再相等.

结果:

1983年10月29日

1983年10月29日,出于某种原因,strtotimeUNIX_TIMESTAMP返回值,通过7200秒不同.

有任何想法吗?

谢谢阅读.

Mat*_*son 22

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

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

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

我猜MySQL的UNIX_TIMESTAMP正在使用与PHP中的Alaskan设置不同的时区,这可能是服务器默认设置,或者取决于您的连接设置,因此当您点击该日期时,这些时区会有所不同.

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