解释为什么2012年12月31日是第53周而不是第1周(ISO-8601)

时间:2013-12-21 16:56:23

标签: javascript date week-number

我正在尝试在JavaScript中编写一个函数,该函数返回给定日期的周数,并且我正在针对我在网络上找到的两个函数测试我的代码,即

http://techblog.procurios.nl/k/n618/news/view/33796/14863/calculate-iso-8601-week-and-year-in-javascript.html
http://www.epoch-calendar.com/support/getting_iso_week.html

我从1970年1月1日起测试了30,000天,我与第二个来源有一些差异。第一种差异是某些情况下该来源返回零周的情况,这显然是错误的。然后对于其他一些情况,它返回第53周,我的函数返回第1周。这些是日期

  • 1984年12月31日
  • 2012年12月31日
  • 2040,Dec 31

他们看起来都像这样

Dec         Jan
29  30  31  01  02  03  04  05  06  07  08  09  10
Sa  Su  Mo  Tu  We  Th  Fr  Sa  Su  Mo  Tu  We  Th
        ^^                          ^^

根据ISO-8601

  • 星期一开始
  • 一年中的第一周是当年第一个星期四的一周

1月3日是2013年的第一个星期四,因此1月3日是第1周(2013年)的一天。第1周(2013年)的开始是周四之前的星期一,即2012年12月31日。

因此2012年12月31日必须是第1周。

...然而

  • 当我在Wolfram Alpha中键入“2012年12月31日的哪一周”时,它返回第53周
  • 当我在excel中键入'= WEEKNUM(“2012-12-31”)'时,它也返回第53周

我错过了什么吗?令我感到困扰的是它只发生在如此少的日期(70年或更长时间内的3个日期)

1 个答案:

答案 0 :(得分:3)

并非所有产品都使用ISO 8601; “周数”有许多不同的定义。您的解释是正确的 - 2012年12月31日确实是ISO 2013年第1周的开始。

在Linux上使用GNU的date(1)命令进行演示:

$ date +%GW%V -d '2012-12-31'
2013W01

如果要在Excel中使用ISO定义,you have to specify return type 21

=WEEKNUM("2012-12-31",21)

产生1。