我试图理解日期函数strtotime()
的以下行为
strtotime(1420066800)
按预期返回false
。strtotime(1451602800)
返回26197048320
!但是false
作为1451602800
并不是有效的日期和时间格式。( new DateTime(1451602800)
也是如此)我阅读了整个支持的日期和时间格式页面,但没有找到与此输入相匹配的内容。
顺便说一下,这些是2015-01-01
和2016-01-01
的时间戳。
任何见解都将不胜感激。
更新:
不同版本的测试结果:
PHP 5.1.6 => false
PHP 5.2.17 => 26197048320
PHP 5.3.29 => 26197048320
PHP 5.4.34 => 26197048320
PHP 5.5.18 => 26197048320
PHP 5.6.2 => 26197048320
PHP 5.6.17 => 26197048320
PHP 7.0.2 => 26197048320
运行在Mac 10.11.3上
发布于 2016-02-25 08:38:40
让我们从正确的方法开始吧。如果要将时间戳传递给strtotime
,则必须在时间戳前加上'@'
。它在复合格式页面的“本地化符号”( -> ) "Unix时间戳“下进行解释。
echo(date('r', strtotime('@1420066800'))."\n");
echo(date('r', strtotime('@1451602800'))."\n");
产出如下:
Thu, 01 Jan 2015 01:00:00 +0200
Fri, 01 Jan 2016 01:00:00 +0200
现在,为什么strtotime()
为1420066800
返回false
,为1451602800
返回26197048320
它期望接收一个字符串,如果它收到一个数字,它不关心它,并首先将它转换为string。然后,它遵循一些规则,并尝试标识字符串中的日期组件。因为'1420066800'
和'1451602800'
都不包含任何组件分隔符,所以可能会尝试猜测组件的顺序。
今天,2016-02-25
,strtotime('1451602800')
产生了一个时间戳,转换成可打印的日期,如下所示:'Fri, 25 Feb 2800 14:52:00 +0200'
它让我认为它将输入字符串解释为:14:51:60
是时间,2800
是年份,其他组件(日、月)是从当前时间初始化的。
文件上说:
函数希望得到一个包含英文日期格式的字符串,并尝试将该格式解析为Unix时间戳(自
January 1 1970 00:00:00 UTC
以来的秒数),相对于$now
中给出的时间戳,或者如果不提供$now
,则解析当前时间。
由于您提供的“日期”不遵循任何有效的日期时间格式,所以strtotime()
可以自由地返回任何值。它被称为“倒垃圾,倒垃圾”。
发布于 2016-02-25 08:39:34
1451602800
给出了2800-02-25 14:52:00
的时间戳,并被解释为:
1451602800
------
^
14:51:60 (or 14:52) time
一年中的今天
1451602800
----
^
2800
但只有在64位系统上才能处理该日期范围。
https://stackoverflow.com/questions/35632682
复制相似问题