'first wed Jan 2020' 对比 'first wed of Jan 2020' 在 php-7

'first wed Jan 2020' vs 'first wed of Jan 2020' in php-7

今天在我写的一个应用中遇到了一个同事报告的奇怪的bug/feature in PhP-7。归结为以下内容。

考虑以下因素:

echo date('Y-m-d', strtotime('first thu of Jan 2020'));
echo '<br/>';
echo date('Y-m-d', strtotime('first thu Jan 2020'));
echo '<br/>';
echo date('Y-m-d', strtotime('first wed of Jan 2020'));
echo '<br/>';
echo date('Y-m-d', strtotime('first wed Jan 2020'));

当我 运行 它时,我看到以下内容:

2020-01-02
2020-01-02
2020-01-01
2020-01-08

奇怪的是,输出的第 3 行和第 4 行不同。为什么?在这种情况下是错误还是必须使用 of

根据documentation,您必须使用的格式是

ordinal space dayname space 'of'

所以 'of' 不是可选的。我不知道为什么它在某些情况下没有工作,但它看起来像是巧合。

此行为在 documentation(第二个音符组,第 4 行)中明确提到:

"ordinal dayname" does advance to another day. (Example "first wednesday july 23rd, 2008" means "2008-07-30").

又见第一注:

Relative statements are always processed after non-relative statements. This makes "+1 week july 2008" and "july 2008 +1 week" equivalent.

因此,如果您不写单词“of”,处理器就不会捕获语句 "first day of"。因此它将字符串拆分为两个语句:首先将日期设置为 2020 年 1 月 1 日(通过语句 Jan 2020,它被解释为非相对语句)然后它应用相对语句 first wed 如前所述以上。