有没有一种简单的方法可以按月和年获取周数数组?
Is there a easy way to get week number array by month and year?
我尝试使用 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]
我尝试使用 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]