307 votes

Javascript - obtenir un tableau de dates entre 2 dates

var range = getDates(new Date(), new Date().addDays(7));

J'aimerais que "range" soit un tableau d'objets date, un pour chaque jour entre les deux dates.

L'astuce consiste à gérer également les limites du mois et de l'année.

248voto

John Hartsock Points 36565
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;
}

Voici un exemple fonctionnel démo http://jsfiddle.net/jfhartsock/cM3ZU/

156voto

enesn Points 475

J'ai regardé tous ceux mentionnés ci-dessus. J'ai fini par écrire moi-même. Vous n'avez pas besoin de momentjs pour cela . Une boucle for native suffit et est plus logique parce qu'une boucle for existe pour compter les valeurs dans un intervalle.

One Liner :

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

Version longue

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

Indiquez les dates intermédiaires :

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"
*/

Jours écoulés depuis une date antérieure jusqu'à aujourd'hui :

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

79voto

Mohammed Safeer Points 1533

Essayez ceci, n'oubliez pas d'inclure le 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;
}

32voto

stekhn Points 593

J'ai eu du mal à utiliser les réponses ci-dessus. Il manquait des jours dans les plages de dates en raison du décalage de fuseau horaire causé par l'heure d'été locale. J'ai mis en place une version utilisant les dates UTC qui résout ce problème :

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

Note : L'application d'un certain fuseau horaire ou de l'heure d'été dépend entièrement de l'endroit où vous vous trouvez. lieu . Il n'est généralement pas judicieux de surcharger cette fonction. L'utilisation de Dates UTC atténue la plupart des problèmes liés au temps.

Bonus : Vous pouvez définir l'intervalle de temps pour lequel vous souhaitez créer des horodatages à l'aide de l'option steps paramètre. Si vous souhaitez que les horodatages hebdomadaires soient définis steps a 7 .

30voto

Ahmed Aswani Points 1169

J'utilise moment.js y Twix.js ils offrent un très bon support pour la manipulation de la date et de l'heure

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

Je l'ai fait fonctionner sur http://jsfiddle.net/Lkzg1bxb/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X