舍入日期为数周

时间:2018-05-16 15:23:44

标签: javascript date epoch

很容易将日期舍入到本周的开头,如下所示:



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




如何修改它以便在星期日而不是星期四正常开始?有没有更好的方法呢? 最重要的是:闰年会导致问题吗?

1 个答案:

答案 0 :(得分:0)

您需要决定是否要在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

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