strtotime结果没有意义,php错误?

2022-08-30 18:54:46

以下行:

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

prints ,这似乎没有任何意义,因为一周中某一天的第一次出现不能在7th之后。08

它是一个php错误还是一个php错误,甚至可能是一个php错误?我不知道。。。

php 版本: 5.5.19


答案 1

更新#1:在我研究了PHP源代码中的一些内容之后,在下面解释了像of这样的简单单词所产生的巨大差异。

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

要快速轻松地阅读,请跳过更新#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:

在阅读了函数 strtotime() 的 PHP 源代码之后,我认为它解析为 .First Saturday August 2015First SaturdayAugust 2015

August 2015是一个绝对的表达式,因为没有关于它产生2015-08-01(2015年8月1的日期的指示,这是一个合理的猜测(我认为是唯一可能的)。

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

将它们放在一起,解释为2015年8月1日以来的第一个星期六计数,这确实是 。strtotime()First Saturday August 2015August 8, 2015

另一方面,使用不同的规则进行解析。、 、 、 或 从 的任何序号之一 to ,后跟工作日名称(完整或缩写)和后跟 of 被解析为所提供月份的工作日(如果字符串中未提供任何月份,则为当前月份)。First Saturday of August 2015nextlastpreviousthisfirsttwelfth

更新 #2

我发现接受的字符串的格式实际上在PHP文档中进行了解释之后,解释变得更加简单。请查看文档页面中的第二个“注意:”框。strtotime()

First Saturday August 2015在注释中的第 4 项中进行了解释:

“序号日名”确实会推进到另一天。

First Saturday of August 2015在注释的第 6 项中进行了解释:

“序号日名'的'”不会前进到另一天。

注释以一整块解释结束,专门用于神奇的单词“”。


答案 2

您需要一个“的”:

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

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


推荐