我试图用javascript获取特定月份和年份的周数。
function getWeekNumbers(month, year) {
var first, last, weeks = [];
if (month < 10)
month = "0" + month;
var date = "01." + month + "." + year;
first = moment(date, 'dd.MM.yyyy').startOf('month').week();
last = moment(date, 'dd.MM.yyyy').endOf('month').week();
for (i = first; i < last; i++) {
weeks.push(i);
}
return weeks;
}
var result = getWeekNumbers(3, 2021);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous"></script>
我需要这样的结果;[9,10,11,12,13]
但是代码无法正常工作。
它也会在第12个月引发问题。
您的解决方案非常接近,我根据自己的喜好进行了一些小的调整,但如果您愿意,可以更改回来。
首先,我建议使用isoWeek
而不是week
,isoWeek
符合ISO 8601的周编号(https://momentjs.com/docs/#/get-set/iso week/(。
您的另一个错误是没有将last
作为for循环的一部分,在这种情况下,您希望将其包括在内,这与通常只循环到列表末尾不同。因此<=
就是您在for
-循环中所需要的。
function getWeekNumbers(month,year) {
var first, last, weeks=[];
first = moment().month(month - 1).year(year).startOf('month').isoWeek();
last = moment().month(month - 1).year(year).endOf('month').isoWeek();
for(var i = first; i <= last; i++){
weeks.push(i);
}
return weeks;
}
这能满足您的需求吗?我使用了一些数组分块和日期函数来将任何给定月份的日期分解为各自的周:
const getWeeks = (month, year) => Array(new Date(year, month, 0).getDate()).fill(0).map((_,i) => new Date(year, month-1, i+1)).map((d,i,a) => !i && d.getDay() ? [Array(d.getDay()).fill(null), d.getDate()] : d.getDate() === a.length && d.getDay() < 6 ? [d.getDate(), Array(6-d.getDay()).fill(null)] : d.getDate()).flat(2).map((d,i,a) => a.length ? a.splice(0,7) : null).filter(w => w);
// February 2021
getWeeks(2, 2021); // -> returns array below ↓↓↓
[
[null, 1, 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11, 12, 13],
[ 14, 15, 16, 17, 18, 19, 20],
[ 21, 22, 23, 24, 25, 26, 27],
[ 28, null, null, null, null, null, null]
]
如果您不希望使用null
占位符,而希望在一周的天数较少时使用较短的数组,我们可以使用额外的过滤器来实现这一点。我们甚至可以为该值包含一个可选参数,当保留为空(或设置为未定义(时,将生成修剪后的数组:
const getWeeks = (month, year, nullVal) => Array(new Date(year, month, 0).getDate()).fill(0).map((_,i) => new Date(year, month-1, i+1)).map((d,i,a) => !i && d.getDay() ? [Array(d.getDay()).fill(nullVal), d.getDate()] : d.getDate() === a.length && d.getDay() < 6 ? [d.getDate(), Array(6-d.getDay()).fill(nullVal)] : d.getDate()).flat(2).map((d,i,a) => a.length ? a.splice(0,7) : null).filter(w => w).map(w => nullVal !== undefined ? w : w.filter(d => d));
// December 2021
getWeeks(12, 2021); // -> bullish value blank :: trimming weeks, returns array below ↓↓↓
[
[ 1, 2, 3, 4],
[ 5, 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17, 18],
[19, 20, 21, 22, 23, 24, 25],
[26, 27, 28, 29, 30, 31 ]
]
getWeeks(12, 2021, 0); // -> using 0 as nullish value, returns array below ↓↓↓
[
[ 0, 0, 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17, 18],
[19, 20, 21, 22, 23, 24, 25],
[26, 27, 28, 29, 30, 31, 0]
]
您还可以使用此函数通过周的索引值来获取一个月中的周数或特定周中的日期:
// Get number of weeks in month
getWeeks(12, 2021).length // -> 5
// Get dates in a week by index value
getWeeks(5, 2021)[2] // -> [9, 10, 11, 12, 13, 14, 15]