【问题标题】:Can someone explain how date("YW", strtotime("2016-01-02")); returns “201653”?有人可以解释一下 date("YW", strtotime("2016-01-02"));返回“201653”?
【发布时间】:2016-02-05 14:01:29
【问题描述】:
date("YW", strtotime("2016-01-02")); returns “201653”

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

【问题讨论】:

  • 查看 ISO 年份。 1 月 1 日意味着新的一年。 echo date("oW", strtotime("2016-01-02"));
  • 1 月 1 日,并不完全是新的一年。 :)
  • 根据 ISO 定义,第 1 周是一年中第一个星期四所在的那一周;

标签: php date week-number


【解决方案1】:

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

Demo

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

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

Demo

【讨论】:

    【解决方案2】:

    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 周。

    【讨论】:

      【解决方案3】:

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

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

      第 1 周的描述相互对等:

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

      • 1 月 4 日所在的那一周,

      • 大部分(四天或更多)天在起始年份的第一周,以及

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

      如果 1 月 1 日是星期一、星期二、星期三或星期四,则为第 1 周。
      如果 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
      

      【讨论】:

        猜你喜欢
        • 2016-07-23
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 2016-12-12
        • 1970-01-01
        • 2011-03-02
        相关资源
        最近更新 更多