如何在两个日期之间创建周/月/季度的列表



根据日期范围,我正在尝试创建四个字符串列表,其中包含以特定方式格式化的周、月、季度和年份。

下面的代码工作正常(请注意计算周的特殊方法。这是有意的(。

我的问题是,一旦 dateEnd 定义为下一年(例如 03-28-2019(,实施就会失败。然后,生成的列表变得不完整/不正确。

有没有更好的方法来实现目标?

这是一个小提琴...https://jsbin.com/wipehahigo/1/edit?html,js,console

dateStart = "01-01-2018";
dateEnd = "03-28-2018";
//get list of week strings   
lowerRange = Math.ceil(moment(dateStart, "MM-DD-YYYY").dayOfYear()/7);
upperRange = Math.ceil(moment(dateEnd, "MM-DD-YYYY").dayOfYear()/7);
year = moment(dateStart, "MM-DD-YYYY").year();
weekList = []
for (var i = lowerRange; i <= upperRange; i++) {
weekList.push('W' + i + '_' + year);
}

//get list of month strings    
lowerRange = moment(dateStart, "MM-DD-YYYY").month()+1;
upperRange = moment(dateEnd, "MM-DD-YYYY").month()+1;
year = moment(dateStart, "MM-DD-YYYY").year();
monthList = []
for (var i = lowerRange; i <= upperRange; i++) {
monthList.push('M' + i + '_' + year);
}


//get list of quarter strings
lowerRange = moment(dateStart, "MM-DD-YYYY").quarter();
upperRange = moment(dateEnd, "MM-DD-YYYY").quarter();
year = moment(dateStart, "MM-DD-YYYY").year();
quarterList = []
for (var i = lowerRange; i <= upperRange; i++) {
quarterList.push('Q' + i + '_' + year);
}


//get list of year strings
lowerRange = moment(dateStart, "MM-DD-YYYY").year();
upperRange = moment(dateEnd, "MM-DD-YYYY").year();
yearList = []
for (var i = lowerRange; i <= upperRange; i++) {
yearList.push('Y' + i + '_' + year);
}

console.log(weekList);
console.log(monthList);
console.log(quarterList);
console.log(yearList);

更新和解决方案

我现在这样做...https://jsbin.com/mepifevico/1/edit?html,js,console

window['moment-range'].extendMoment(moment);
weekList = [];
monthList = [];
quarterList = [];
yearList = [];
dateStart = "01-01-2018";
dateEnd = "03-28-2019";
dateStart = moment(dateStart, 'MM-DD-YYYY');
dateEnd   = moment(dateEnd, 'MM-DD-YYYY');
dateRange = moment.range(dateStart, dateEnd);
for (let d of dateRange.by('week')) {
weekNumber = Math.ceil(d.dayOfYear()/7);
year = d.year();
weekList.push('W' + weekNumber + '_' + year);
}

for (let d of dateRange.by('month')) {
monthNumber = d.month() + 1;
year = d.year();
monthList.push('M' + monthNumber + '_' + year);
}

for (let d of dateRange.by('quarter')) {
quarterNumber = d.quarter();
year = d.year();
quarterList.push('Q' + quarterNumber + '_' + year);
}
for (let d of dateRange.by('year')) {
yearNumber = d.year();
year = d.year();
yearList.push('Y' + yearNumber + '_' + year);
}

console.log(weekList)
console.log(monthList)
console.log(quarterList)
console.log(yearList)

为了使您的计算跨多年工作,您应该基于两个日期之间的持续时间,而不是基于结束日期。为此,您可以使 for 循环从开始日期到开始日期 + 持续时间。

我做了一个计算周的例子: https://jsbin.com/xejocusana/edit?html,js,console

dateStart = "01-01-2018";
dateEnd = "03-31-2019";
start = moment(dateStart, "MM-DD-YYYY")
end = moment(dateEnd, "MM-DD-YYYY")
lowerRange = Math.floor(moment(dateStart, "MM-DD-YYYY").dayOfYear()/7);
// calculate the number of weeks between the two dates
numberOfWeeks = end.diff(start, 'weeks');
year = moment(dateStart, "MM-DD-YYYY").year();
weekListA = []
for (var i = lowerRange; i <= lowerRange + numberOfWeeks; i++) {
weekListA.push('W' + (i%52 +1) + '_' + (year+ Math.floor(i/52)));
}
console.log(weekListA);

我补充说:

循环
  • 极限所需的numberOfWeeks计算;
  • 循环中的模+ (i%52 +1),以获得周数(您必须写 +1 才能使其从 0 开始。由于这个约束,当你计算 lowerRange 时,你必须使用 Math.floor(( 而不是 Math.ceil(( ;
  • 循环中的+ Math.floor(i/52),以增加年份数;

我让您检查是否涵盖所有情况(超过 2 年的日期、包含或排除的日期等(

它仅适用于 weeklist,但您应该能够为其余部分弄清楚:

lowerRange = moment(dateStart, "MM-DD-YYYY").week();
upperRange = moment(dateEnd, "MM-DD-YYYY").week();
year = moment(dateStart, "MM-DD-YYYY").year();
year2 = moment(dateEnd, "MM-DD-YYYY").year();
//add extra weeks to upperRange if the date range > 12 months
upperRange += (year2-year)*52-lowerRange;
weekList = []
for (var i = lowerRange; i <= upperRange; i++) {
//some fix to show the year
weekList.push('W' + (i-lowerRange) + '_' + (year+Math.floor((i-lowerRange)/12)));
}

最新更新