Javascript – krijg een reeks datums tussen 2 datums

Ik wil dat ‘bereik’ een reeks datumobjecten is, één voor elke dag tussen de twee datums.

De truc is dat het ook de maand- en jaargrenzen moet verwerken.


Antwoord 1, autoriteit 100%

Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
}
function getDates(startDate, stopDate) {
    var dateArray = new Array();
    var currentDate = startDate;
    while (currentDate <= stopDate) {
        dateArray.push(new Date (currentDate));
        currentDate = currentDate.addDays(1);
    }
    return dateArray;
}

Hier is een functionele demohttp://jsfiddle.net/jfhartsock/cM3ZU/


Antwoord 2, autoriteit 48%

Ik heb alle bovenstaande bekeken. Uiteindelijk ben ik mezelf gaan schrijven. Hiervoor heb je geen momentjs nodig. Een native for-lus is voldoendeen is het meest logisch omdat er een for-lus bestaat om waarden in een bereik te tellen.

Eén voering:

var getDaysArray = function(s,e) {for(var a=[],d=new Date(s);d<=e;d.setDate(d.getDate()+1)){ a.push(new Date(d));}return a;};

Lange versie

var getDaysArray = function(start, end) {
    for(var arr=[],dt=new Date(start); dt<=end; dt.setDate(dt.getDate()+1)){
        arr.push(new Date(dt));
    }
    return arr;
};

Vermeld tussenliggende datums:

var daylist = getDaysArray(new Date("2018-05-01"),new Date("2018-07-01"));
daylist.map((v)=>v.toISOString().slice(0,10)).join("")
/*
Output: 
    "2018-05-01
    2018-05-02
    2018-05-03
    ...
    2018-06-30
    2018-07-01"
*/

Dagen vanaf een datum in het verleden tot nu:

var daylist = getDaysArray(new Date("2018-05-01"),new Date());
daylist.map((v)=>v.toISOString().slice(0,10)).join("")

Antwoord 3, autoriteit 32%

Probeer dit, vergeet niet om moment js toe te voegen,

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;
}

Antwoord 4, autoriteit 13%

Ik gebruik moment.jsen Twix.jsze bieden een uitstekende ondersteuning voor datum- en tijdmanipulatie

var itr = moment.twix(new Date('2012-01-15'),new Date('2012-01-20')).iterate("days");
var range=[];
while(itr.hasNext()){
    range.push(itr.next().toDate())
}
console.log(range);

Ik heb dit draaiend op http://jsfiddle.net/Lkzg1bxb/


Antwoord 5, autoriteit 10%

var boxingDay = new Date("12/26/2010");
var nextWeek  = boxingDay*1 + 7*24*3600*1000;
function getDates( d1, d2 ){
  var oneDay = 24*3600*1000;
  for (var d=[],ms=d1*1,last=d2*1;ms<last;ms+=oneDay){
    d.push( new Date(ms) );
  }
  return d;
}
getDates( boxingDay, nextWeek ).join("\n");
// Sun Dec 26 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Mon Dec 27 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Tue Dec 28 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Wed Dec 29 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Thu Dec 30 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Fri Dec 31 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Sat Jan 01 2011 00:00:00 GMT-0700 (Mountain Standard Time)

Antwoord 6, autoriteit 7%

Ik had problemen met het gebruik van de bovenstaande antwoorden. De datumbereiken ontbraken enkele dagen vanwege tijdzoneverschuiving veroorzaakt door de lokale zomertijd (DST). Ik heb een versie geïmplementeerd met UTC-datums die dat probleem verhelpt:

function dateRange(startDate, endDate, steps = 1) {
  const dateArray = [];
  let currentDate = new Date(startDate);
  while (currentDate <= new Date(endDate)) {
    dateArray.push(new Date(currentDate));
    // Use UTC date to prevent problems with time zones and DST
    currentDate.setUTCDate(currentDate.getUTCDate() + steps);
  }
  return dateArray;
}
const dates = dateRange('2020-09-27', '2020-10-28');
console.log(dates);

Snippet uitvouwen


Antwoord 7, autoriteit 7%

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;
}

Antwoord 8, autoriteit 7%

Als je moment gebruikt, kun je hun “officiële plug-in” gebruiken voor bereiken moment-rangeen dan wordt dit triviaal.

voorbeeld van momentbereikknooppunt:

const Moment = require('moment');
const MomentRange = require('moment-range');
const moment = MomentRange.extendMoment(Moment);
const start = new Date("11/30/2018"), end = new Date("09/30/2019")
const range = moment.range(moment(start), moment(end));
console.log(Array.from(range.by('day')))

voorbeeld browser voor momentbereik:

window['moment-range'].extendMoment(moment);
const start = new Date("11/30/2018"), end = new Date("09/30/2019")
const range = moment.range(moment(start), moment(end));
console.log(Array.from(range.by('day')))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-range/4.0.1/moment-range.js"></script>

Snippet uitvouwen


Antwoord 9, autoriteit 4%

Ik kwam net deze vraag tegen, de gemakkelijkste manier om dit te doen is door gebruik te maken van moment:

Je moet eerst moment en moment-range installeren:

const Moment = require('moment');
const MomentRange = require('moment-range');
const moment = MomentRange.extendMoment(Moment);
const start = moment()
const end = moment().add(2, 'months')
const range = moment.range(start, end)
const arrayOfDates = Array.from(range.by('days'))
console.log(arrayOfDates)

Antwoord 10, autoriteit 4%

Als je ES6 gebruikt, heb je Array.from, wat betekent dat je een echt elegante functie kunt schrijven die dynamische intervallen mogelijk maakt (uren, dagen, maanden).

function getDates(startDate, endDate, interval) {
const duration = endDate - startDate;
const steps = duration / interval;
return Array.from({length: steps+1}, (v,i) => new Date(startDate.valueOf() + (interval * i)));
}
const startDate = new Date(2017,12,30);
const endDate = new Date(2018,1,3);
const dayInterval = 1000 * 60 * 60 * 24; // 1 day
const halfDayInterval = 1000 * 60 * 60 * 12; // 1/2 day
console.log("Days", getDates(startDate, endDate, dayInterval));
console.log("Half Days", getDates(startDate, endDate, halfDayInterval));

Snippet uitvouwen


Antwoord 11, autoriteit 4%

Ik werkte onlangs met moment.js, het volgende werkte..

function getDateRange(startDate, endDate, dateFormat) {
        var dates = [],
            end = moment(endDate),
            diff = endDate.diff(startDate, 'days');
        if(!startDate.isValid() || !endDate.isValid() || diff <= 0) {
            return;
        }
        for(var i = 0; i < diff; i++) {
            dates.push(end.subtract(1,'d').format(dateFormat));
        }
        return dates;
    };
    console.log(getDateRange(startDate, endDate, dateFormat));

Het resultaat zou zijn:

["09/03/2015", "10/03/2015", "11/03/2015", "12/03/2015", "13/03/2015", "14/03/2015", "15/03/2015", "16/03/2015", "17/03/2015", "18/03/2015"]

Antwoord 12, autoriteit 3%

Ik gebruik de @Mohammed Safeer-oplossing al een tijdje en ik heb een paar verbeteringen aangebracht. Het gebruik van geformatteerde datums is een slechte gewoonte tijdens het werken in uw controllers. moment().format()mag alleen worden gebruikt voor weergavedoeleinden in weergaven. Onthoud ook dat moment().clone()zorgt voor scheiding van invoerparameters, wat betekent dat de invoerdatums niet worden gewijzigd. Ik raad je ten zeerste aan om moment.js te gebruiken wanneer je met datums werkt.

Gebruik:

  • Geef moment.js datums als waarden voor startDate, endDateparameters
  • intervalparameter is optioneel en staat standaard op ‘dagen’. Gebruik intervallen die worden ondersteund door de methode .add()(moment.js). Meer details hier
  • totalparameter is handig bij het specificeren van intervallen in minuten. Het staat standaard op 1.

Oproepen:

var startDate = moment(),
    endDate = moment().add(1, 'days');
getDatesRangeArray(startDate, endDate, 'minutes', 30);

Functie:

var getDatesRangeArray = function (startDate, endDate, interval, total) {
    var config = {
            interval: interval || 'days',
            total: total || 1
        },
        dateArray = [],
        currentDate = startDate.clone();
    while (currentDate < endDate) {
        dateArray.push(currentDate);
        currentDate = currentDate.clone().add(config.total, config.interval);
    }
    return dateArray;
};

Antwoord 13, autoriteit 3%

Ik gebruik een eenvoudige while-lus om de tussendatums te berekenen

var start = new Date("01/05/2017");
var end = new Date("06/30/2017");
var newend = end.setDate(end.getDate()+1);
end = new Date(newend);
while(start < end){
   console.log(new Date(start).getTime() / 1000); // unix timestamp format
   console.log(start); // ISO Date format          
   var newDate = start.setDate(start.getDate() + 1);
   start = new Date(newDate);
}

Snippet uitvouwen


Antwoord 14, autoriteit 2%

var listDate = [];
var startDate ='2017-02-01';
var endDate = '2017-02-10';
var dateMove = new Date(startDate);
var strDate = startDate;
while (strDate < endDate){
  var strDate = dateMove.toISOString().slice(0,10);
  listDate.push(strDate);
  dateMove.setDate(dateMove.getDate()+1);
};
console.log(listDate);
//["2017-02-01", "2017-02-02", "2017-02-03", "2017-02-04", "2017-02-05", "2017-02-06", "2017-02-07", "2017-02-08", "2017-02-09", "2017-02-10"]

Antwoord 15

Ik gebruik deze functie

function getDatesRange(startDate, stopDate) {
    const ONE_DAY = 24*3600*1000;
    var days= [];
    var currentDate = new Date(startDate);
    while (currentDate <= stopDate) {
        days.push(new Date (currentDate));
        currentDate = currentDate - 1 + 1 + ONE_DAY;
    }
    return days;
}

Antwoord 16

Je kunt het gemakkelijk doen met momentJS

Voeg een moment toe aan uw afhankelijkheden

npm i moment

Importeer dat dan in je bestand

var moment = require("moment");

Gebruik vervolgens de volgende code om de lijst met alle datums tussen twee datums te krijgen

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);

Antwoord 17

d3jsbiedt veel handige functies en bevat d3.timevoor gemakkelijke datummanipulaties

https://github.com/d3/d3-time

Voor uw specifieke verzoek:

Utc

var range = d3.utcDay.range(new Date(), d3.utcDay.offset(new Date(), 7));

of lokale tijd

var range = d3.timeDay.range(new Date(), d3.timeDay.offset(new Date(), 7));

bereik is een reeks datumobjecten die voor elke dag op de eerst mogelijke waarde vallen

u kunt timeDay wijzigen in timeHour, timeMonth enz. voor dezelfde resultaten met verschillende tussenpozen


Antwoord 18

Hier is een one-liner die geen bibliotheken nodig heeft voor het geval je geen andere functie wilt creëren. Vervang gewoon startDate (op twee plaatsen) en endDate (dit zijn js-datumobjecten) door uw variabelen of datumwaarden. Natuurlijk kun je het in een functie verpakken als je dat liever hebt

Array(Math.floor((endDate - startDate) / 86400000) + 1).fill().map((_, idx) => (new Date(startDate.getTime() + idx * 86400000)))

Antwoord 19

Zo doe ik het graag

// hours * minutes * seconds * milliseconds
const DAY_IN_MS = 24 * 60 * 60 * 1000
/**
 * Get range of dates 
 * @param {Date} startDate 
 * @param {Number} numOfDays 
 * @returns {array}
 */
const dateRange = (startDate, numOfDays) => {
    const startDateMs = startDate.getTime()
    // get array of days and map it to Date object
    return [...Array(numOfDays).keys()].map(i => new Date(startDateMs + i * DAY_IN_MS))
}

Antwoord 20

Opmerking:ik ben me ervan bewust dat dit iets anders is dan de gevraagde oplossing, maar ik denk dat velen het nuttig zullen vinden.

Als je elke “x”-interval (dagen, maanden, jaren, enz…) tussen twee datums wilt vinden, moment .jsen de moment-rangeextensiepakketten maken deze functionaliteit mogelijk.

Bijvoorbeeld om elke 30e dag tussen twee datums te vinden:

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'))
});

Antwoord 21

@softvar’s oplossing, maar dan inclusief optie voor werkdatums

/**
 * 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;
}

Antwoord 22

  1. Genereer een reeks jaren:

    const DAYS = () => {
     const days = []
     const dateStart = moment()
     const dateEnd = moment().add(30, ‘days')
     while (dateEnd.diff(dateStart, ‘days') >= 0) {
      days.push(dateStart.format(‘D'))
      dateStart.add(1, ‘days')
     }
     return days
    }
    console.log(DAYS())
    
  2. Genereer een array voor de maand:

           const MONTHS = () => {
             const months = []
             const dateStart = moment()
             const dateEnd = moment().add(12, ‘month')
             while (dateEnd.diff(dateStart, ‘months') >= 0) {
              months.push(dateStart.format(‘M'))
              dateStart.add(1, ‘month')
             }
             return months
            }
            console.log(MONTHS())
    
  3. Genereer een array voor dagen:

           const DAYS = () => {
             const days = []
             const dateStart = moment()
             const dateEnd = moment().add(30, ‘days')
             while (dateEnd.diff(dateStart, ‘days') >= 0) {
              days.push(dateStart.format(‘D'))
              dateStart.add(1, ‘days')
             }
             return days
            }
            console.log(DAYS())
    

Antwoord 23

Array(7).fill().map((_,i) => dayjs().subtract(i, "day").format("YYYY-MM-DD"));

Antwoord 24

Dat is nog een paar regels oplossing die date-fns bibliotheek gebruikt:

const { format, differenceInDays, addDays } = dateFns;
const getRangeDates = (startDate, endDate) => {
  const days = differenceInDays(endDate, startDate);
  console.log([...Array(days + 1).keys()].map((i) => format(addDays(startDate, i), 'YYYY-MM-DD')));
};
getRangeDates('2021-06-01', '2021-06-05');
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.30.1/date_fns.js"></script>

Snippet uitvouwen


Antwoord 25

Dit kan iemand helpen,

Je kunt de rij-uitvoer hiervan krijgen en het row_date-object opmaken zoals je wilt.

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


Antwoord 26

Hier is een standaardmethode die Momentdatums of strings of een mengsel als invoer accepteert en een array van datums als Momentdatums genereert. Als u Momentdatums niet als uitvoer wilt, wijzigt u wat de methode map()retourneert.

const moment = require('moment');
// ...
/**
 * @param {string|import('moment').Moment} start
 * @param {string|import('moment').Moment} end
 * @returns {import('moment').Moment[]}
 */
const getDateRange = (start, end) => {
  const s = moment.isMoment(start) ? start : moment(start);
  const e = moment.isMoment(end) ? end : moment(end);
  return [...Array(1 + e.diff(s, 'days')).keys()].map(n => moment(s).add(n, 'days'));
};

Antwoord 27

Functie:

 var dates = [],
      currentDate = startDate,
      addDays = function(days) {
        var date = new Date(this.valueOf());
        date.setDate(date.getDate() + days);
        return date;
      };
  while (currentDate <= endDate) {
    dates.push(currentDate);
    currentDate = addDays.call(currentDate, 1);
  }
  return dates;
};

Gebruik:

var dates = getDatesRange(new Date(2019,01,01), new Date(2019,01,25));                                                                                                           
dates.forEach(function(date) {
  console.log(date);
});

Ik hoop dat het je helpt


Antwoord 28

Lodash & moment:

const startDate = moment();
_.range(0, 7).map((d) => startDate.clone().add(d, 'day').toDate())

Antwoord 29

getDates = (from, to) => {
    const cFrom = new Date(from);
    const cTo = new Date(to);
    let daysArr = [new Date(cFrom)];
    let tempDate = cFrom;
    while (tempDate < cTo) {
        tempDate.setUTCDate(tempDate.getUTCDate() + 1);
        daysArr.push(new Date(tempDate));
    }
    return daysArr;
}

Antwoord 30

Niet de kortst mogelijke maar eenvoudig, onveranderlijk en zonder afhankelijkheden

function datesArray(start, end) {
    let result = [], current = new Date(start);
    while (current <= end)
        result.push(current) && (current = new Date(current)) && current.setDate(current.getDate() + 1);
    return result;
}

Gebruik

function datesArray(start, end) {
    let result = [], current = new Date(start);
    while (current <= end)
        result.push(current) && (current = new Date(current)) && current.setDate(current.getDate() + 1);
    return result;
 }
//  Usage
const test = datesArray(
  new Date('2020-02-26'), 
  new Date('2020-03-05')
 );
for (let i = 0; i < test.length; i ++ ) {
    console.log(
      test[i].toISOString().slice(0,10)
    );
}

Other episodes