在 JavaScript 中从周数计算日期

IT技术 javascript math
2021-02-07 10:44:40

如何在知道周数和年份的 JavaScript 中计算日期?对于第 20 周和 2013 年,我想获得 2013-05-16。我正在尝试这样:

Date.prototype.dayofYear = function () {
  var d = new Date(this.getFullYear(), 0, 0)
  return Math.floor((/* enter code here */ this - d) / 8.64e + 7)
}
6个回答
function getDateOfWeek(w, y) {
    var d = (1 + (w - 1) * 7); // 1st of January + 7 days for each week

    return new Date(y, 0, d);
}

这使用简单的周定义,这意味着 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;
}

结果:2013年的第20周是5月13日,可以在这里确认

@Damodharan 2009 年第 15 周将于 4 月 6 日星期一开始。
2021-03-15 10:44:40
这不适用于例如 2009 年的第一周。应该从 29.12.2008 开始,您的方法将在 1 月 5 日返回
2021-03-16 10:44:40
是的,ISO 周从该周的第一个星期四开始。因此,如果道指为 4,则意味着一周的开始。<= 将解决这个问题。
2021-03-26 10:44:40
在处理考虑到夏令时的一年中的某些部分时,我得到了不正确的日期,为了防止这种情况发生,我更改了简单变量的创建以使用 Date.UTC() 构造函数。 var simple = new Date(Date.UTC(y, 0, 1 + (w - 1) * 7));
2021-03-31 10:44:40
我相信dow < 4应该是,dow <= 4但我还没有彻底测试过它。
2021-04-12 10:44:40

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

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;
}

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)
}
这是错误的weekDateToDate(2016, 52, 7)产生2016-12-26而不是2017-01-01
2021-03-19 10:44:40
不遵循 ISO 8601 周。不确定您在谈论什么 ISO 周。
2021-03-24 10:44:40

根据周数获取日期范围

Date.prototype.getWeek = function () {
    var target  = new Date(this.valueOf());
    var dayNr   = (this.getDay() + 6) % 7;
    target.setDate(target.getDate() - dayNr + 3);
    var firstThursday = target.valueOf();
    target.setMonth(0, 1);
    if (target.getDay() != 4) {
        target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
    }
    return 1 + Math.ceil((firstThursday - target) / 604800000);
}

function getDateRangeOfWeek(weekNo){
    var d1 = new Date();
    numOfdaysPastSinceLastMonday = eval(d1.getDay()- 1);
    d1.setDate(d1.getDate() - numOfdaysPastSinceLastMonday);
    var weekNoToday = d1.getWeek();
    var weeksInTheFuture = eval( weekNo - weekNoToday );
    d1.setDate(d1.getDate() + eval( 7 * weeksInTheFuture ));
    var rangeIsFrom = eval(d1.getMonth()+1) +"/" + d1.getDate() + "/" + d1.getFullYear();
    d1.setDate(d1.getDate() + 6);
    var rangeIsTo = eval(d1.getMonth()+1) +"/" + d1.getDate() + "/" + d1.getFullYear() ;
    return rangeIsFrom + " to "+rangeIsTo;
};

getDateRangeOfWeek(10)
"3/6/2017 to 3/12/2017"

getDateRangeOfWeek(30)
"7/24/2017 to 7/30/2017"
我认为这更容易通过接受的答案传递到这个6周末来完成:function addDays(date = new Date(), days) { var end = new Date(date); end.setDate(end.getDate() + days); return end; }
2021-03-19 10:44:40
你怎么知道需要的年份而不让用户通过年份?@Aathi
2021-03-27 10:44:40

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

Elle 的答案非常正确,但有一个例外:如果您想获得一周的开始日期 - 它不会帮助您,因为 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);
}

在这里,您基本上只是计算从年初(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
}