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

时间:2016-02-25 16:17:19

标签: php strtotime

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

  • strtotime(1420066800)按预期返回false
  • strtotime(1451602800)返回26197048320!但预期false 1451602800不是有效的日期和时间格式。 (与new DateTime(1451602800)同样如此)

我阅读了整个Supported Date and Time Formats页面,但没有找到与此输入匹配的内容。

顺便说一下,这些是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

在Mac OS X 10.11.3上运行

2 个答案:

答案 0 :(得分:6)

让我们从正确的方式开始吧。如果您想将时间戳传递给strtotime,则必须在其前面添加'@'。它在Compound Formats页面的“本地化符号” - >下进行了解释。 “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()false返回1420066800而为26197048320返回1451602800

它希望收到一个字符串,如果它收到一个它不关心的数字,并首先将其转换为字符串。然后它遵循一些规则并尝试将日期组件标识到字符串中。由于'1420066800''1451602800'都不包含任何组件分隔符,因此可能会尝试猜测组件的顺序。

今天,2016-02-25strtotime('1451602800')生成一个时间戳,转换为可打印日期如下:'Fri, 25 Feb 2800 14:52:00 +0200'

这让我觉得它解释输入字符串如下:14:51:60是时间,2800是年份,其他组件(日,月)是从当前时间初始化的。

文档说:

  

该函数希望给出一个包含英文日期格式的字符串,并尝试将该格式解析为Unix时间戳(自January 1 1970 00:00:00 UTC以来的秒数),相对于{{1}中给出的时间戳},或者如果未提供$now,则为当前时间。

由于您提供的“日期”不遵循任何有效的日期时间格式,strtotime()可以自由返回任何值。它被称为"garbage in, garbage out"

答案 1 :(得分:4)

1451602800的时间戳为2800-02-25 14:52:00;并被解释为:

1451602800
------
  ^
14:51:60 (or 14:52) time

今年

1451602800
      ----
       ^
      2800

但仅适用于可处理该日期范围的64位系统