在 JavaScript 中获取给定日期范围内的所有日期的列表

Bla*_*ell 5 javascript jquery date

我试图弄清楚是否有任何可用的辅助函数或任何可能有助于获取给定日期范围内的日期列表的技术。

假设用户输入以下参数,这将是 2 年合同:
天: 15
开始日期: 2015 年 1 月15
日 结束日期: 2016 年 12 月 15 日

我希望返回该期间内每个月的日期,包括开始月和结束月:

1/15/2015
2/15/2015
3/15/2015
.....
1/15/2016
2/15/2016
3/15/2016
.....
12/15/2016
Run Code Online (Sandbox Code Playgroud)

ElC*_*Net 3

您需要使用setMonthgetMonth方法:

注意:正如 @RobG 在评论中所说,我使用这样的日期格式犯了一个错误:2015-12-01例如。- 并非所有浏览器都能解释所使用的日期格式。最好使用/字符代替。

const start = new Date('2015-01-15');
const end = new Date('2016-12-15');

while (start <= end) {
    console.log( new Date(start) );
    start.setMonth( start.getMonth() + 1 );
}
Run Code Online (Sandbox Code Playgroud)

更动态的解决方案:

function getDatesBtween(from, to, day) {

  const fromDate = new Date(from);
  const toDate = new Date(to);

  fromDate.setDate(day);
  toDate.setDate(day);

  const dates = [];

  while (fromDate <= toDate) {

    dates.push(new Date(fromDate));

    fromDate.setMonth(fromDate.getMonth() + 1);

  }

  return dates;

}

const dates = getDatesBtween('2015-01-15', '2016-12-15', 15);

console.log(dates);
Run Code Online (Sandbox Code Playgroud)

注意:正如 @HBP 在评论中提到的,上述解决方案没有考虑边缘情况,并且不适用于一个月的最后几天(29th和该月的几天)。例如=在某些情况下和其他情况下(闰年)。下一个解决方案解决了这个问题:30th31st2015/02/312015/03/032015/03/02

function DateManager() {

  // Create a date with specific day
  function setDate(date, day) {

    date = new Date(date);
    date.setDate(day);
    date.setHours(23);

    return date;

  }

  // Generate dates method
  this.getDatesBetween = function(date1, date2, day) {

    const range1 = new Date(date1);
    const range2 = new Date(date2);
    const dates = [];
    let temp = null;
    
    date1 = setDate(date1, day);
    date2 = setDate(date2, day);

    while (date1 <= date2) {

      if (date1.getDate() != day) {

        temp = setDate(date1, 0);

        if (temp >= range1 && temp <= range2) dates.push(temp);

        date1 = setDate(date1, day);

      } else {

        temp = new Date(date1);

        if (temp >= range1 && temp <= range2) dates.push(temp);

        date1.setMonth(date1.getMonth() + 1);

      }

    }

    return dates;

  };

}

const manager = new DateManager();
const dates = manager.getDatesBetween('2015-01-15', '2016-12-15', 31);

console.log(dates);
Run Code Online (Sandbox Code Playgroud)

结果将类似于:

2015/01/31
2015/02/28
2015/03/31
2015/04/30
2015/05/31
...
2016/02/29
...
2016/11/30
Run Code Online (Sandbox Code Playgroud)