使用Moment.js获取一周中的所有日子



给定ISO周数,如何使用Moment.js获取一周中的所有天数?如果是月初,而不是星期一,则上个月的最后几天也应返回。

示例:moment.daysOfISOWeek(28, 'DD') // returns [06 07 08 09 10 11 12]

您可以通过多种方式来处理此问题,一种是获取一年中的第一周,添加所需的周数,然后循环获取所需周的所有天数。

另一种方法是以ISO年-周格式构建一个字符串,并使用moment将其解析为一个日期,例如2020年第28周的moment('2020W28'),然后如上所述在一周内循环。

下面演示了这两种方法。

/* Return array of dates for nth ISO week of year
** @param {number|string} isoWeekNum - ISO week number, default is 1
** @param {number|string} year - ISO week year, default is current year
** @returns {Array} of 7 dates for specified week
*/
function getISOWeekDates(isoWeekNum = 1, year = new Date().getFullYear()) {
let d = moment().isoWeek(1).startOf('isoWeek').add(isoWeekNum - 1, 'weeks');
for (var dates=[], i=0; i < 7; i++) {
dates.push(d.format('ddd DD MMM YYYY'));
d.add(1, 'day');
}
return dates;
}
// Documentation as above
function getISOWeekDates2(isoWeekNum = 1, year = new Date().getFullYear()) {
let d = moment(String(year).padStart(4, '0') + 'W' +
String(isoWeekNum).padStart(2,'0'));
for (var dates=[], i=0; i < 7; i++) {
dates.push(d.format('ddd DD MMM YYYY'));
d.add(1, 'day');
}
return dates;
}
// Calculate start of week
console.log(getISOWeekDates())
// Use ISO 8601 yearWweek format e.g. 2020W28
console.log(getISOWeekDates2())
console.log(getISOWeekDates2(28))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js"></script>

供应年份在年底和年初很重要,例如2019年12月30日是2020年的第一周。默认值是2019日历年还是2020 ISO周?

最新更新