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
为什么会这样?
肯定是有什么不太明白的地方。
参数为year
、week
、dayofweek
。 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 年
我正在测试这些案例:
$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
为什么会这样?
肯定是有什么不太明白的地方。
参数为year
、week
、dayofweek
。 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 年