strtotime函数传递错误的日期和时间格式的奇怪行为

Sla*_*ser 6 php strtotime

我试图了解日期函数的以下行为strtotime():

  • strtotime(1420066800)false按预期返回.
  • strtotime(1451602800)回来了26197048320!但预计false由于1451602800不是一个有效的日期和时间格式.(同样的事情new DateTime(1451602800))

我阅读了整个" 支持日期和时间格式"页面,但未找到此输入的任何匹配项.

顺便说一句,这些是时间戳2015-01-012016-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
Run Code Online (Sandbox Code Playgroud)

在Mac OS X 10.11.3上运行

axi*_*iac 6

让我们从正确的方式开始吧.如果要传递时间戳,则strtotime必须为其添加前缀'@'.它在" 复合格式"页面的"本地化表示法" - >"Unix时间戳"下进行了解释.

echo(date('r', strtotime('@1420066800'))."\n");
echo(date('r', strtotime('@1451602800'))."\n");
Run Code Online (Sandbox Code Playgroud)

输出是:

Thu, 01 Jan 2015 01:00:00 +0200
Fri, 01 Jan 2016 01:00:00 +0200
Run Code Online (Sandbox Code Playgroud)

现在,为什么strtotime()返回false1420066800261970483201451602800

它期望接收一个字符串,如果它收到一个数字,它不关心并首先将其转换为字符串.然后它遵循一些规则并尝试将日期组件标识到字符串中.由于既没有'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,或者当前时间if $now未提供.

由于您提供的"日期"不遵循任何有效的日期时间格式,因此strtotime()可以自由返回任何值.它被称为"垃圾进,垃圾出".