更新 #1: 在我对 PHP 源代码进行了一些调查之后,在下面解释了像 "of" 这样的简单词所产生的巨大差异。
更新 #2: 实际上有一个关于 PHP 手册的文档页面,其中解释了 the formatsstrftime() 接受的日期。直到现在我才意识到这一点。感谢@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 月的第一个st),这是一个合理的猜测(我认为唯一可能的) )。
First Saturday 是一个relative expression。它相对于字符串中提供的绝对标记 (August 2015) 或作为strtotime() 的第二个参数,它"shifts" 绝对标记的时间戳向后或向前一些量。
将它们放在一起,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 被解析为所提供月份的工作日(如果字符串中没有提供,则为当前月份)。
更新 #2
在PHP文档中发现strtotime()接受的字符串格式是其实是explained后,解释就简单多了。查看documentation page 中的第二个“注意:”框。
First Saturday August 2015 在注释中的第 4 项中进行了解释:
"ordinal dayname" 确实提前到另一天。
First Saturday of August 2015 在注释的第 6 项中进行了解释:
"ordinal dayname 'of'" 不会提前到另一天。
注释以一个完整的解释块结束,专门用于magical单词“of”。