【问题标题】:setISODate work that way?setISODate 是这样工作的吗?
【发布时间】:2018-01-26 11:51:08
【问题描述】:

我正在测试这些案例:

$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

为什么会这样?

肯定有我不太明白的地方。

【问题讨论】:

标签: php php-7 isodate


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您完整的解释。我没有这样考虑一周的开始。
【解决方案2】:

setISODate() 还有另一个问题,尤其是在 2021 年的第一周(1.1.2021 - 3.1.2021)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多