我正在尝试用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年12月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个日期)中

    最佳答案

    并非所有内容都使用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。

    10-04 16:29