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()试图"理解"英语,我想你和它说不同的方言:-)
在PHP 函数的源代码中strtotime()读了一些之后,我认为它解析First Saturday August 2015为First Saturday后面跟着August 2015.
August 2015是一个绝对的表达和因为没有关于日期指示它产生2015-08-01(1 ST 2015年8月的),这是一个合理的猜测(在只有一种可能,我想).
First Saturday是一个相对的表达.它相对于字符串(August 2015)中提供的绝对标记或者作为第二个参数,strtotime()它以一定的量向后或向前"移动"绝对标记的时间戳.
将它们放在一起,从而strtotime()将解释First Saturday August 2015为First Saturday计数August 1, 2015,确实如此August 8, 2015.
另一方面,First Saturday of August 2015使用不同的规则进行解析.一next,last,previous,this或任何序数first来twelfth,随后一个工作日名称(全称或简称),并随后of(如果未在字符串中提供或当月)解析为提供一个月的工作日.
之后,我发现,通过接受字符串的格式strtotime() 被实际介绍的PHP文件中,解释变得更加简单.请查看文档页面中的第二个" 注意: "框.
First Saturday August 2015 在说明中的第4项解释:
"序数日"确实推进到另一天.
First Saturday of August 2015 在说明的第6项解释:
"ordinal dayname"的''不会提前到另一天.
该笔记以一整段解释结束,专门用于神奇的单词" of".
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