有没有一种简单的方法可以按月和年获取周数数组?

时间:2021-04-01 15:30:52

标签: javascript date momentjs week-number

我尝试使用 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个月也会出现问题。

2 个答案:

答案 0 :(得分:1)

您的解决方案非常接近,我根据自己的喜好进行了一些小调整,但如果您愿意,可以将其改回来。

首先,我建议使用 isoWeek 而不是 weekisoWeek 符合 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;
}

答案 1 :(得分:0)

这能满足您的需求吗?我使用了一些数组分块和日期函数将任何给定月份的日期分成各自的周:

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]
相关问题