显示不同年份的两个日期之间的月份

Display months between two dates with different years

我有一个月份数组:

const monthsArr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];  

我还有两个日期:2021-09-072022-03-17。要获取这些日期之间的月数,我使用函数:

function monthDiff(dateFrom, dateTo) {
    return dateTo.getMonth() - dateFrom.getMonth() + 12 * (dateTo.getFullYear() - dateFrom.getFullYear());
}

如何显示数组 monthsArr 中这两个日期之间的所有月份?在此先感谢您的帮助。

您可能会发现使用 date-fns (https://date-fns.org/), more specifically the sub function (https://date-fns.org/v2.28.0/docs/sub)

等实用程序库很有用

您可以使用 Array().fill() 生成所有涉及年份的所有 12 个月,将其展平,然后 slice 从中生成相关部分。为确保 slice 的第二个参数为负数(不是零!),甚至还要再增加 12 个月。第二个参数将是 -23 和 -12 之间的值:

const monthsArr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];  

function monthsBetween(dateFrom, dateTo) {
    return Array(dateTo.getFullYear() - dateFrom.getFullYear() + 2)
           .fill(monthsArr).flat()
           .slice(dateFrom.getMonth(), dateTo.getMonth() - 23);
}

let dateFrom = new Date("2021-09-07");
let dateTo = new Date("2022-03-17");

console.log(monthsBetween(dateFrom, dateTo));

一种简单的方法是每次将开始日期递增一个月,然后 return 数组中该索引处的值。唯一的问题是弄清楚“之间”是包括开始和结束月份还是只包括那些月份之间的月份。

以下包括结果中的开始和结束月份:

let months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

function getMonthsBetweenDates(startDate, endDate) {
  // Make start as 1st of startDate month 
  let s = new Date(startDate.getFullYear(), startDate.getMonth());
  let result = [];
  // Loop over months until get to end month
  while (s <= endDate) {
    result.push(months[s.getMonth()]);
    s.setMonth(s.getMonth() + 1);
  }
  return result;
}

// Get months between 2021-09-07 and 2022-03-17
console.log(getMonthsBetweenDates(new Date(2021,8,7), new Date(2022,2,17)));