strtotime结果毫无意义,php bug?

时间:2015-01-29 15:30:20

标签: php strtotime php-5.5

以下一行:

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

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

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

php版本:5.5.19

3 个答案:

答案 0 :(得分:44)

更新#1:下面解释了一个简单的词,如" of" ,在我调查了PHP源代码中很少。

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

要快速轻松阅读,请跳过更新#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它产生2015-08-01(2015年8月的1 st )这是一个合理的猜测(我认为只有一种可能。)

First Saturdayrelative expression。它相对于字符串(August 2015)中提供的绝对标记或strtotime()的第二个参数,以及"shifts"绝对标记的时间戳返回或向前一定量。< / p>

strtotime()放在一起,First Saturday August 2015First Saturday解释为 August 1, 2015August 8, 2015 开始计算,实际上是First Saturday of August 2015

另一方面,使用different rule解析next。其中一个lastpreviousthisfirst或从twelfthof的任意序号,后跟工作日名称(完整或( strtotime() 后面的 First Saturday August 2015 被解析为所提供月份的工作日(如果字符串中没有提供,则为当前月份。)

更新#2

在我发现PHP文档中First Saturday of August 2015 接受的字符串格式实际上explained后,解释变得更加简单。看看第二个&#34; 注意:&#34; documentation page中的框。

of在说明中的第4项解释:

  

&#34;序数日期&#34; 确实进展到另一天。

{{1}}在说明的第6项解释:

  

&#34;&#39;&#34; 的序数日期名称不会提前到另一天。

该注释以对魔法字专用的整个解释结束而结束&#34; {{1}} &#34;。

答案 1 :(得分:12)

你需要一个&#39;:

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

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

答案 2 :(得分:-2)

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