按数周舍入日期
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
由于闰年不会改变一周的长度,因此它们应该无关紧要。
像这样将日期四舍五入到本周的开始很容易:
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
由于闰年不会改变一周的长度,因此它们应该无关紧要。