javascript从周数计算日期

use*_*009 27 javascript math

我如何计算javascript知道周数和年份的日期?对于2013年5月16日获得的第20周和2013年,我正在尝试:

Date.prototype.dayofYear = function() {        
    var d = new Date(this.getFullYear(), 0, 0);        
    return Math.floor((enter code here this - d) / 8.64e + 7); 
}
Run Code Online (Sandbox Code Playgroud)

Ell*_*lle 68

function getDateOfWeek(w, y) {
    var d = (1 + (w - 1) * 7); // 1st of January + 7 days for each week

    return new Date(y, 0, d);
}
Run Code Online (Sandbox Code Playgroud)

这使用简单的周定义,意味着2013年的第20周是5月14日.

计算给定ISO8601周的开始日期(始终为星期一)

function getDateOfISOWeek(w, y) {
    var simple = new Date(y, 0, 1 + (w - 1) * 7);
    var dow = simple.getDay();
    var ISOweekStart = simple;
    if (dow <= 4)
        ISOweekStart.setDate(simple.getDate() - simple.getDay() + 1);
    else
        ISOweekStart.setDate(simple.getDate() + 8 - simple.getDay());
    return ISOweekStart;
}
Run Code Online (Sandbox Code Playgroud)

结果:2013年第20周为5月13日,可以确认这里.

  • 我在处理考虑夏令时的部分时间时得到的日期不正确,为了防止这种情况,我改变了简单变量的创建以使用Date.UTC()构造函数.`var simple = new Date(Date.UTC(y,0,1 +(w - 1)*7));` (3认同)
  • 这不适用于例如2009年的第一周.这应该从2008年12月29日开始,你的方法将在1月5日返回 (2认同)

小智 7

ISO周

function weekDateToDate (year, week, day) {
  const firstDayOfYear = new Date(year, 0, 1)
  const days = 2 + day + (week - 1) * 7 - firstDayOfYear.getDay()
  return new Date(year, 0, days)
}
Run Code Online (Sandbox Code Playgroud)

  • **这是错的**:`weekDateToDate(2016,52,7)`收益率2016-12-26`而不是2017-01-01` (2认同)
  • 不遵循 ISO 8601 周。不确定您所说的 ISO 周数。 (2认同)

小智 7

2019版本(如果有人想计算一周的开始日期)

Elle 的答案几乎是正确的,但有一个例外:如果你想获得一周的开始日期 - 它不会帮助你,因为 Elle 的算法不介意一周开始的那一天,根本。

原因如下:

艾丽的解决方案

function getDateOfWeek(w, y) {
  var d = (1 + (w - 1) * 7); // 1st of January + 7 days for each week

  return new Date(y, 0, d);
}
Run Code Online (Sandbox Code Playgroud)

在这里,您基本上只是计算从年初(1 月 1 日)算起的天数。这意味着一年从哪一天开始并不重要:星期一、星期日或星期五 - 不会有任何区别。

要设置一周的开始日期(例如星期一),您只需:

function getDateOfWeek(w, y) {
  let date = new Date(y, 0, (1 + (w - 1) * 7)); // Elle's method
  date.setDate(date.getDate() + (1 - date.getDay())); // 0 - Sunday, 1 - Monday etc
  return date
}
Run Code Online (Sandbox Code Playgroud)


小智 5

很抱歉,如果这有点冗长,但此解决方案也将在计算周数后返回星期日.它结合了我从几个不同的地方看到的答案:

function getSundayFromWeekNum(weekNum, year) {
    var sunday = new Date(year, 0, (1 + (weekNum - 1) * 7));
    while (sunday.getDay() !== 0) {
        sunday.setDate(sunday.getDate() - 1);
    }
    return sunday;
}
Run Code Online (Sandbox Code Playgroud)