setISODate 工作方式?

setISODate work that way?

我正在测试这些案例:

$date = new \DateTime();
echo($date->format('Y.m.d')) . PHP_EOL;

$date->setISODate(2018, 1, 1);
echo($date->format('Y.m.d')) . PHP_EOL;

$date->setISODate(2019, 1, 1);
echo($date->format('Y.m.d')) . PHP_EOL;

$date->setISODate(2020, 1, 1);
echo($date->format('Y.m.d')) . PHP_EOL;

输出:

2017.08.17
2018.01.01
2018.12.31
2019.12.30

我知道它会显示这个:

2017.08.17
2018.01.01
2019.01.01
2020.01.01

为什么会这样?

肯定是有什么不太明白的地方。

参数为yearweekdayofweek。 PHP 的一周从星期一开始,一年的第 1 周是一月份至少有 4 天的第一周。

2018 年从星期一开始,因此第 1 周从 1 月 1 日开始,也就是一周的第 1 天。

2019 年从星期二开始,因此第 1 周从 2018 年 12 月 31 日星期一开始,也就是一周的第 1 天。

2020 年从星期三开始,因此第 1 周从 2019 年 12 月 30 日星期一开始,所以这是一周的第 1 天。

setISODate() 存在另一个问题,在 2021 年的第一周(1.1.2021 - 3.1.2021)尤为明显。

ISO 说这是第 53 周,但是一旦你执行 setISODate(2021, 53) 你就会得到 2022 年