strtotime 结果没有意义,php 错误?

strtotime result makes no sense, php bug?

下面一行:

echo date('d', strtotime('First Saturday August 2015'));

打印出 08,这似乎没有任何意义,因为一周中某一天的第一次出现不能在 7 号之后。

它是 php 错误还是 php 错误甚至是 php 错误?我不知道...

php版本:5.5.19

您需要 'of':

date('d/m/Y', strtotime('First Saturday of August 2015'))

查看手册: http://docs.php.net/manual/en/datetime.formats.relative.php

更新 #1: 下面解释了像 "of" 这样的简单词所带来的巨大差异,在我之后在 PHP 源代码中进行了一些调查。

更新 #2: 实际上 PHP 手册上的文档页面,解释了 the formats strftime() 接受的日期。直到现在我才意识到这一点。感谢@Outspaced 在他们的回答中提供 link。

为了快速轻松地阅读,请跳过 更新 #1


初始答案:

的确如此,

echo date('Y-m-d', strtotime('First Saturday August 2015'));

打印:

2015-08-08

但是

echo date('Y-m-d', strtotime('First Saturday of August 2015'));

打印正确的日期:

2015-08-01

既然strtotime()试图“听懂”英语,我猜你和它说的是不同的方言:-)

更新 #1:

在阅读 PHP source code of function strtotime() 之后,我认为它将 First Saturday August 2015 解析为 First Saturday,然后是 August 2015

August 2015 是一个绝对表达式,因为有 no indication about the day it produces 2015-08-01(2015 年 8 月的第 1st)这是一个合理的猜测(唯一的我认为有可能)。

First Saturday 是一个 relative expression. It is relative to an absolute mark provided in the string (August 2015) or as a second parameter of strtotime() and it "shifts" 绝对标记后退或前进一定数量的时间戳。

将它们放在一起,strtotime()First Saturday August 2015 解释为 First SaturdayAugust 1, 2015 开始计数,也就是说,确实 August 8, 2015.

另一方面,First Saturday of August 2015 使用 different rule 进行解析。 nextlastpreviousthis 之一或从 firsttwelfth 的任何序数,后跟工作日名称(完整或缩写)后跟 of 被解析为所提供月份的工作日(如果字符串中提供了 none,则解析为当前月份)。

更新 #2

经过我发现strtotime()接受的字符串格式是其实是explained in the PHP documentation, the explanation became more simple. Take a look at the second "Note:" box in the documentation page.

First Saturday August 2015 在注释的第 4 项中有解释:

"ordinal dayname" does advance to another day.

First Saturday of August 2015 在注释的第 6 项中有解释:

"ordinal dayname 'of'" does not advance to another day.

该注释以一整块专门用于 神奇 单词“of”的解释结束。

如上所述,PHP 不太理解您选择的方言。如果您计划接受来自用户的各种输入(这不是一个坏主意)来表达日期,我建议您自己对该用户输入进行一些规范化,以便您可以向 strtotime 提交可预测的格式。