Javascript - get array of dates between 2 dates

后端 未结 25 1141
傲寒
傲寒 2020-11-22 15:16
var range = getDates(new Date(), new Date().addDays(7));

I\'d like \"range\" to be an array of date objects, one for each day between the two dates

相关标签:
25条回答
  • 2020-11-22 15:40

    You can do it easily using momentJS

    Add moment to your dependencies

    npm i moment
    

    Then import that in your file

    var moment = require("moment");
    

    Then use the following code to get the list of all dates between two dates

    let dates = [];
    let currDate = moment.utc(new Date("06/30/2019")).startOf("day");
    let lastDate = moment.utc(new Date("07/30/2019")).startOf("day");
    
    do {
     dates.push(currDate.clone().toDate());
    } while (currDate.add(1, "days").diff(lastDate) < 0);
    dates.push(currDate.clone().toDate());
    
    console.log(dates);
    
    0 讨论(0)
  • 2020-11-22 15:40

    Note: I'm aware this is slightly different than the requested solution, but I think many will find it useful.

    If you want to find each "x" intervals (days, months, years, etc...) between two dates, moment.js and the moment-range extension packages enable this functionality.

    For example, to find each 30th day between two dates:

    window['moment-range'].extendMoment(moment);
    
    var dateString = "2018-05-12 17:32:34.874-08";
    var start  = new Date(dateString);
    var end    = new Date();
    var range1 = moment.range(start, end);
    var arrayOfIntervalDates = Array.from(range1.by('day', { step: 30 }));
    
    arrayOfIntervalDates.map(function(intervalDate){
      console.log(intervalDate.format('YY-M-DD'))
    });
    
    0 讨论(0)
  • 2020-11-22 15:42

    Try this, remember to include moment js,

    function getDates(startDate, stopDate) {
        var dateArray = [];
        var currentDate = moment(startDate);
        var stopDate = moment(stopDate);
        while (currentDate <= stopDate) {
            dateArray.push( moment(currentDate).format('YYYY-MM-DD') )
            currentDate = moment(currentDate).add(1, 'days');
        }
        return dateArray;
    }
    
    0 讨论(0)
  • 2020-11-22 15:43
    function (startDate, endDate, addFn, interval) {
    
     addFn = addFn || Date.prototype.addDays;
     interval = interval || 1;
    
     var retVal = [];
     var current = new Date(startDate);
    
     while (current <= endDate) {
      retVal.push(new Date(current));
      current = addFn.call(current, interval);
     }
    
     return retVal;
    
    }
    
    0 讨论(0)
  • 2020-11-22 15:45

    This may help someone,

    You can get the row output from this and format the row_date object as you want.

    var from_date = '2016-01-01';
    var to_date = '2016-02-20';
    
    var dates = getDates(from_date, to_date);
    
    console.log(dates);
    
    function getDates(from_date, to_date) {
      var current_date = new Date(from_date);
      var end_date     = new Date(to_date);
    
      var getTimeDiff = Math.abs(current_date.getTime() - end_date.getTime());
      var date_range = Math.ceil(getTimeDiff / (1000 * 3600 * 24)) + 1 ;
    
      var weekday = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"];
      var months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"];
      var dates = new Array();
    
      for (var i = 0; i <= date_range; i++) {
         var getDate, getMonth = '';
    
         if(current_date.getDate() < 10) { getDate = ('0'+ current_date.getDate());}
         else{getDate = current_date.getDate();}
    
        if(current_date.getMonth() < 9) { getMonth = ('0'+ (current_date.getMonth()+1));}
        else{getMonth = current_date.getMonth();}
    
        var row_date = {day: getDate, month: getMonth, year: current_date.getFullYear()};
        var fmt_date = {weekDay: weekday[current_date.getDay()], date: getDate, month: months[current_date.getMonth()]};
        var is_weekend = false;
        if (current_date.getDay() == 0 || current_date.getDay() == 6) {
            is_weekend = true;
        }
        dates.push({row_date: row_date, fmt_date: fmt_date, is_weekend: is_weekend});
        current_date.setDate(current_date.getDate() + 1);
     }
     return dates;
    }
    

    https://gist.github.com/pranid/3c78f36253cbbc6a41a859c5d718f362.js

    0 讨论(0)
  • 2020-11-22 15:45

    @softvar's solution, but then including working dates option

    /**
     * Returns array of working days between two dates.
     *
     * @param {string} startDate
     *   The start date in yyyy-mm-dd format.
     * @param {string} endDate
     *   The end date in yyyy-mm-dd format.
     * @param {boolean} onlyWorkingDays
     *   If true only working days are returned. Default: false
     *
     * @return {array}
     *   Array of dates in yyyy-mm-dd string format.
     */
    function getDates(startDate, stopDate, onlyWorkingDays) {
      let doWd = typeof onlyWorkingDays ==='undefined' ? false : onlyWorkingDays;
    
      let dateArray = [];  
      let dayNr;
      let runDateObj = moment(startDate);  
      let stopDateObj = moment(stopDate);
    
      while (runDateObj <= stopDateObj) {
        dayNr = runDateObj.day();
        if (!doWd || (dayNr>0 && dayNr<6)) {
         dateArray.push(moment(runDateObj).format('YYYY-MM-DD'));  
        }
    
        runDateObj = moment(runDateObj).add(1, 'days');
      }
      return dateArray;
    }
    
    0 讨论(0)
提交回复
热议问题