有人可以解释一下日期(“YW”,strtotime(“2016-01-02”));返回“201653”


Can someone explain how date("YW", strtotime("2016-01-02")); returns “201653”?

date("YW", strtotime("2016-01-02")); returns “201653”

年份还可以
一周是从2015年开始

PHP 符合 ISO-8601 的日期:

该标准的目的是提供一种明确且定义明确的日期和时间表示方法,以避免对日期和时间的数字表示形式产生误解,特别是当数据在具有不同约定的国家之间传输时。

这意味着一年的第一周定义为:

包含

一年中第一个星期四的一周

如果 1 月 1 日是星期一、星期二、星期三或星期四,则在第 01 周。如果 1 月 1 日是星期五、星期六或星期日,则在前一年的第 52 周或第 53 周(没有第 00 周(。

这意味着就 PHP 而言,2016 年 1 月 2 日不是 2016 年的第一周。

如果您使用o标志date()您将获得ISO-8601年,该年份将返回2015:

echo date("oW", strtotime("2016-01-02"));
// outputs: 201553

演示

您可能需要考虑的一种方法是检查月份是否为 1 月,周数为 53,则它是新日历年(不是 ISO-8601 年(的第一周。

if (date('n') == 1 && date('W') == 53) {
    // first calendar week of the year
}

演示

PHP 使用 ISO-8601 年数,周数从星期一开始。 如果一年的 1 月 1 日不是星期一,则该特定周被视为前一年的最后一周;周 53.

由于 2016 年 1 月 1 日是星期五,因此它是从 2015 年 12 月 28 日开始的一周的一部分。 如果您运行代码echo date('Y-W', strtotime('2015-12-31'));您将获得输出"2015-53",因此根据 ISO-8601,同一周的天数也将是第 53 周。

PHP 对周数使用 ISO-8601 规范。

一年中第一周的定义(ISO 8601(:

对第 01 周有相互等效的描述:

  • 包含一年第一个星期四的一周(正式的 ISO 定义(,

  • 1月4日这一周,

  • 第一周,其大部分时间(四天或更多(在开始年份,以及

  • 从 12 月 29 日至 1 月 4 日期间的星期一开始的一周。

如果 1 月 1 日是星期一、星期二、星期三或星期四,则在第 01 周。
如果 1 月 1 日是星期五、星期六或星期日,则在前一年的第 52 周或第 53 周(没有第 00 周(。12月28日总是在一年的最后一周。
https://en.wikipedia.org/wiki/ISO_8601#Week_dates

这里有一个例子:

echo date("YW", strtotime("2016-01-02")); //201653
echo date("YW", strtotime("2016-01-04")); //201601