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

Getting a list of all dates within a given date range in JavaScript

本文关键字:日期 范围内 列表 JavaScript 获取      更新时间:2023-09-26

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

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

我希望返回该

期间内每个月(包括开始和结束月份(的日期:

1/15/2015
2/15/2015
3/15/2015
.....
1/15/2016
2/15/2016
3/15/2016
.....
12/15/2016

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

您需要使用setMonthgetMonth方法:

var start = new Date("2015/01/15");
var end = new Date("2016/12/15");
while (start <= end) {
    console.log( new Date(start) );
    start.setMonth( start.getMonth() + 1 );
}

斯菲德尔

更动态的解决方案:

function getDatesBtween(from, to, day){
    var from  = new Date(from),
        to    = new Date(to),
        dates = [];
    from.setDate(day);
    to.setDate(day); 
    while(from <= to){
        dates.push(new Date(from));
        from.setMonth( from.getMonth() + 1 );
    }
    return dates;
}
var dates = getDatesBtween("2015/01/15", "2016/12/15", 15);
console.log(dates);

斯菲德尔

编辑 2 正如@HBP在评论中提到的,上述解决方案没有考虑边缘情况,并且不适用于一个月的最后几天(每月的第 29、30 和 31 天(。例如,2015/02/31 = 在某些情况下2015/03/03,在其他情况下(闰年(2015/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){
    var range1 = new Date(date1),
        range2 = new Date(date2),
        date1 = setDate(date1, day),
        date2 = setDate(date2, day),
        dates = [],
        temp = null;
    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;
  };
}
var manager = new DateManager();
var dates = manager.getDatesBetween("2015/01/15", "2016/12/15", 31);
console.log(dates);

结果将是这样的:

2015/01/31
2015/02/28
2015/03/31
2015/04/30
2015/05/31
...
2016/02/29
...
2016/11/30

斯菲德尔

$("#from").datepicker();
$("#to").datepicker();
$('#getBetween').on('click', function () {
    var start = $("#from").datepicker("getDate"),
        end = $("#to").datepicker("getDate"),
        currentDate = new Date(start),
        between = []
    ;
    while (currentDate <= end) {
        between.push(new Date(currentDate));
        currentDate.setMonth(currentDate.getMonth() + 1);
    }
    
    $('#results').html(between.join('<br> '));
});
<link href="http://code.jquery.com/ui/1.10.4/themes/ui-lightness/jquery-ui.css" rel="stylesheet">
      <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
      <script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
<input id="from" />
<input id="to" />
<button id="getBetween">Get Between Dates</button>
<div id="results"></div>

我认为getDate(( + 1应该能够解决边界条件。

var startDate = new Date("2020-02-01"); //YYYY-MM-DD
var endDate = new Date("2020-03-07"); //YYYY-MM-DD
var getDateArray = function(start, end) {
    var arr = new Array();
    var dt = new Date(start);
    while (dt <= end) {
        arr.push(new Date(dt));
        dt.setDate(dt.getDate() + 1);
    }
    return arr;
}
var dateArr = getDateArray(startDate, endDate);
// Output
document.write("Start Date: " + startDate + "<br>");
document.write("End Date: " + endDate + "<br>");
document.write("Date Array<br>")
for (var i = 0; i < dateArr.length; i++) {
    document.write(dateArr[i] + "<br>");
}