Javascript – ottieni una serie di date tra 2 date

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

Mi piacerebbe che “range” fosse una matrice di oggetti data, uno per ogni giorno tra le due date.

Il trucco è che dovrebbe gestire anche i confini mese e anno.

Grazie.

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

Ecco una demo funzionale http://jsfiddle.net/jfhartsock/cM3ZU/

Prova questo, ricorda di includere il momento 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; } 

Uso moment.js e Twix.js forniscono un ottimo supporto per la gestione della data e dell’ora

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

Ho questo in esecuzione su http://jsfiddle.net/Lkzg1bxb/

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

Ho usato la soluzione @Mohammed Safeer per un po ‘e ho apportato alcuni miglioramenti. L’utilizzo di date formattate è una ctriggers pratica mentre si lavora nei controller. moment().format() deve essere usato solo per scopi di visualizzazione nelle viste. Ricorda anche che moment().clone() garantisce la separazione dai parametri di input, il che significa che le date di input non vengono alterate. Ti consiglio vivamente di utilizzare moment.js quando lavori con le date.

Uso:

  • Fornisci le date di momento.js come valori per i parametri startDate , endDate
  • parametro interval è facoltativo e il valore predefinito è “giorni”. Usa intervalli supportati dal metodo .add() (momento.js). Maggiori dettagli qui
  • total parametro total è utile quando si specificano gli intervalli in minuti. Il valore predefinito è 1.

Invocare:

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

Funzione:

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

Recentemente ho lavorato con moment.js, in seguito ha fatto il trucco ..

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

Il risultato sarebbe:

 ["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"] 

Ho appena trovato questa domanda, il modo più semplice per farlo è usare il momento:

È necessario installare prima il momento e l’intervallo di tempo:

 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) 

d3js fornisce molte utili funzioni e include d3.time per semplici manipolazioni di date

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

Per la tua richiesta specifica:

UTC

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

o ora locale

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

intervallo sarà una serie di oggetti data che cadono sul primo valore ansible per ogni giorno

è ansible modificare l’intervallo di tempo in ora, ora, mese, ecc. per gli stessi risultati a intervalli diversi

Ecco una copertina che non richiede alcuna libreria nel caso in cui non si desideri creare un’altra funzione. Basta sostituire startDate (in due punti) e endDate (che sono oggetti js date) con le variabili o i valori di data. Ovviamente potresti avvolgerlo in una funzione, se preferisci

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

Ho guardato tutti quelli sopra. Finito per scrivere me stesso. Non hai bisogno di momentjs per questo . Un loop nativo for è sufficiente e ha più senso perché esiste un ciclo for per contare i valori in un intervallo.

One Liner:

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

Versione lunga

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

Elenca le date in mezzo:

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

Giorni da una data passata fino ad ora:

 var daylist = getDaysArray(new Date("2018-05-01"),new Date()); daylist.map((v)=>v.toISOString().slice(0,10)).join("") 
 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"] 

Sto usando un semplice ciclo while per calcolare la differenza tra le date

 var start = new Date("01/05/2017"); var end = new Date("06/30/2017"); var newend = end.setDate(end.getDate()+1); var 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); } 

Usando ES6 hai Array.from significa che puoi scrivere una funzione davvero elegante, che consente intervalli dinamici (ore, giorni, mesi).

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

Questo può aiutare qualcuno,

È ansible ottenere l’output di riga da questo e formattare l’object row_date come si desidera.

 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