按数周舍入日期

Rounding date by multiple weeks

像这样将日期四舍五入到本周的开始很容易:

function roundWeek() {
    var current = new Date();
    var startOfWeek = current.getDate() - current.getDay();
    console.log(new Date(current.setDate(startOfWeek)));
}
roundWeek();

这在以一周为单位四舍五入时效果很好,但在以多周为单位四舍五入时会变得有点复杂。

例如,假设我想以三周为周期轮值。我知道这需要一个纪元(例如 new Date(0))才能正确计算三周期间的开始日期,但这也会导致问题:

1970 年 1 月 1 日(即 new Date(0))发生在星期四,因此假设我按以下方式使用它,它总是会计算一周的开始时间为星期四:

function roundWeek(weeks) {
    var current = new Date();
    const WEEK_IN_MS = 60*60*24*7*1000; //sec * min * hr * day * ms
    var index = Math.floor( (current.getTime() / (WEEK_IN_MS*weeks)) );

    var startOfPeriod = new Date( index * WEEK_IN_MS*weeks );
    console.log( startOfPeriod );
}
roundWeek(3);

如何修改才能使其在星期日而不是星期四正确开始?有更好的方法吗? 最重要的是:闰年会导致问题吗?

您需要决定是否希望三周时间从 1970 年 1 月 1 日 (12/28/69) 之前或之后的星期日开始。例如,1970 年 1 月 14 日将舍入到哪个星期日?然后,您可以计算星期四与上一个星期日或下一个星期日之间的差异,并将其添加或减去(取决于您所做的决定)到您的舍入解决方案。

这是您函数的一个变体,它也将日期作为测试输入。

function roundWeek(weeks, d) {
  var current = new Date(d);
  var first_sunday = 60 * 60 * 24 * 4 * 1000 // seconds between Sunday and Thursday
  const WEEK_IN_MS = 60 * 60 * 24 * 7 * 1000; // week in ms
  var index = Math.floor((current.getTime() / (WEEK_IN_MS * weeks)));
  console.log(`${weeks}-week periods from ${d.getMonth()+1}/${d.getDate()}/${d.getFullYear()} ${index}`)

  var startOfPeriod = new Date(index * WEEK_IN_MS * weeks - first_sunday);
  console.log("1st day of period:", startOfPeriod);
}
// round to three weeks starting Sunday before Jan 1 1970

roundWeek(3, new Date('January 2, 1970')); // Dec 28, 1968
roundWeek(3, new Date('January 14, 1970')); // Dec 28, 1968
roundWeek(3, new Date('January 22, 1970')); // next three weeks
roundWeek(3, new Date('May 16, 2018')); // since today. Sundaay May 6

由于闰年不会改变一周的长度,因此它们应该无关紧要。