2016-02-25 28 views
6

我想了解最新功能strtotime()的以下行为:奇怪的行为与功能的strtotime传递一个错误的日期和时间格式

  • strtotime(1420066800)回报false,符合市场预期。
  • strtotime(1451602800)返回26197048320!但预计false1451602800不是有效的日期和时间格式。 (与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

都返回64位系统'FALSE'我 – Guiroux

+0

与测试PHP v7.0.2 –

+0

如果您使用PHP 7,为什么不使用OOP?你有'DateTime'类来达到这个目的,你不需要使用更多的程序功能 –

回答

6

让我们开始做正确的方式。如果您想将时间戳传递给strtotime,则必须以'@'为前缀。在“Localized notations” - >“Unix Timestamp”下的Compound Formats页面上进行了说明。

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()回报false1420066800261970483201451602800

它期望收到一个字符串,如果它收到一个数字,它不会在意并首先将其转换为字符串。然后遵循一些规则并尝试将日期组件标识到字符串中。因为'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的秒数)的字符串,相对于$now中给出的时间戳,或者当前时间(如果$now未提供)。

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

+1

我很惊讶。伟大的知识。我学到了一些新东西。 –

+0

感谢您的解释。我没有试图解析这个值作为一个时间戳,但预计会收到一个错误,以便以不同的方式处理它。 –

+0

你如何解释版本差异?在PHP 5.1.6上,它按预期返回'false'。 –

4

1451602800给出2800-02-25 14:52:00的时间戳;并且被解释为:今天

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

在今年

1451602800 
     ---- 
    ^
     2800 

但仅限于可以处理该日期范围

+0

我很惊讶。伟大的知识。我学到了一些新东西。 –

+0

如果你是对的,那么它应该已经能够将'strtotime(1420066800)'转换为'6800-02-25 14:20:06'的相同方式,但是它没有。你如何解释它?恕我直言,这是一个错误,而不是一个功能。 –

+1

6800年可能会超出年的范围....是的,它几乎肯定是一个错误,而不是一个功能 –