以下一行:
echo date('d', strtotime('First Saturday August 2015'));
打印08
,这似乎没有任何意义,因为一周中第一次出现的事情不能在7日之后。
是php bug还是php bug,甚至可能是php bug?我不知道......
php版本:5.5.19
答案 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()
试图理解"英语,我猜你和它说不同的方言: - )
在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 Saturday
是relative expression。它相对于字符串(August 2015
)中提供的绝对标记或strtotime()
的第二个参数,以及"shifts"绝对标记的时间戳返回或向前一定量。< / p>
将strtotime()
放在一起,First Saturday August 2015
将First Saturday
解释为 August 1, 2015
自August 8, 2015
开始计算,实际上是First Saturday of August 2015
。
另一方面,使用different rule解析next
。其中一个last
,previous
,this
,first
或从twelfth
到of
的任意序号,后跟工作日名称(完整或( strtotime()
后面的 First Saturday August 2015
被解析为所提供月份的工作日(如果字符串中没有提供,则为当前月份。)
在我发现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。