DateTime行为不一致

时间:2017-02-03 13:30:11

标签: php datetime

我想获得明年的第一个星期一,根据我使用的术语,我会得到不同的输出:

$last1 = new \DateTime('first monday of January 2018');
/* outputs: 2018-01-01 (correct) */

$last2 = new \DateTime('first monday of January next year');
/* Outputs 2018-01-02 (wrong) */

因此,每年我都能有效new \DateTime('first monday of January '.date('Y') + 1);,但这看起来很“脏”。第二个出了什么问题吗?不是说今年第一个星期一是第二个,所以我猜它被解析错了吗?

1 个答案:

答案 0 :(得分:1)

来自PHP文档:

  

相对语句总是在非相对语句之后处理

在第一个表达式上有相对和非相对语句,首先处理“2018”,然后在2018年修改后计算亲属语句“1月的第一天”。

另一方面,第二个表达式仅基于相对语句。 “1月的第一个星期一”将给出今年1月的第一个星期一,然后明年将适用。

您可以使用modify

将相对语句拆分为两个
$last2 = new \DateTime('next year');
$last2->modify('first monday of January');

您的代码也可以使用,您可以选择自己喜欢的代码