我试图了解日期函数的以下行为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
Run Code Online (Sandbox Code Playgroud)
在Mac OS X 10.11.3上运行
让我们从正确的方式开始吧.如果要传递时间戳,则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()返回false了1420066800和26197048320为1451602800?
它期望接收一个字符串,如果它收到一个数字,它不关心并首先将其转换为字符串.然后它遵循一些规则并尝试将日期组件标识到字符串中.由于既没有'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()可以自由返回任何值.它被称为"垃圾进,垃圾出".
| 归档时间: |
|
| 查看次数: |
512 次 |
| 最近记录: |