strtotime结果毫无意义,php bug?

Mar*_*der 22 php strtotime php-5.5

以下行:

echo date('d', strtotime('First Saturday August 2015'));
Run Code Online (Sandbox Code Playgroud)

打印08,似乎没有任何意义,因为第一次出现的一周不能在7日之后.

它是一个php bug还是一个php bug,甚至可能是一个php bug?我不知道...

php版本:5.5.19

axi*_*iac 44

更新#1:在我在PHP源代码中稍微调查一下后,在下面解释了像" of"这样的简单单词所产生的巨大差异.

更新#2:实际上一个关于PHP手册的文档页面,它解释接受的日期格式strftime().直到现在我才意识到这一点.感谢@Outspaced提供答案中的链接.

要快速轻松地阅读,请跳过更新#1部分.


最初的答案:

确实,

echo date('Y-m-d', strtotime('First Saturday August 2015'));
Run Code Online (Sandbox Code Playgroud)

打印:

2015-08-08
Run Code Online (Sandbox Code Playgroud)

echo date('Y-m-d', strtotime('First Saturday of August 2015'));
Run Code Online (Sandbox Code Playgroud)

打印正确的日期:

2015-08-01
Run Code Online (Sandbox Code Playgroud)

既然strtotime()试图"理解"英语,我想你和它说不同的方言:-)

更新#1:

在PHP 函数的源代码中strtotime()读了一些之后,我认为它解析First Saturday August 2015First Saturday后面跟着August 2015.

August 2015是一个绝对的表达和因为没有关于日期指示它产生2015-08-01(1 ST 2015年8月的),这是一个合理的猜测(在只有一种可能,我想).

First Saturday是一个相对的表达.它相对于字符串(August 2015)中提供的绝对标记或者作为第二个参数,strtotime()它以一定的量向后或向前"移动"绝对标记的时间戳.

将它们放在一起,从而strtotime()将解释First Saturday August 2015First Saturday计数August 1, 2015,确实如此August 8, 2015.

另一方面,First Saturday of August 2015使用不同的规则进行解析.一next,last,previous,this或任何序数firsttwelfth,随后一个工作日名称(全称或简称),并随后of(如果未在字符串中提供或当月)解析为提供一个月的工作日.

更新#2

之后,我发现,通过接受字符串的格式strtotime() 实际介绍的PHP文件中,解释变得更加简单.请查看文档页面中的第二个" 注意: "框.

First Saturday August 2015 在说明中的第4项解释:

"序数日"确实推进到另一天.

First Saturday of August 2015 在说明的第6项解释:

"ordinal dayname"的''不会提前到另一天.

该笔记以一整段解释结束,专门用于神奇的单词" of".

  • 这就是为什么php的strtotime既令人惊奇又可怕 (5认同)
  • @BrianWarshaw(关于*"为什么要承担从字符串中介翻译的费用?"*)因为写'$ date = strtotime('2015年8月的第一个星期六')更容易;`比`$ ts = mktime(0, 0,0,8,1,2015); $ date = $ ts + 86400*(6 - date('w',$ ts));`此外,它更容易阅读和理解:-)让我们回想起PHP开始是一个工具,其目的是使编码网页是一项简单的任务. (2认同)

Out*_*ced 12

你需要一个'of':

date('d/m/Y', strtotime('First Saturday of August 2015'))
Run Code Online (Sandbox Code Playgroud)

参见手册:http: //docs.php.net/manual/en/datetime.formats.relative.php