2010-12-10 7 views

Antwort

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

} 
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) 
+0

Um sicher zu sein, im Gegensatz zu dem oben genannten, sollten Sie in der Regel eine Zeit, in der Mitte des Tages wählen leichte Abweichungen aufgrund Tageslicht-Einsparung zu vermeiden. – Phrogz

125
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 ist ein funktioneller demohttp://jsfiddle.net/jfhartsock/cM3ZU/

+1

Danke John. Ich benutze meist deins, aber Sie haben einen ByRef-Bug, in dem currentDate nicht auf das Array geschoben werden kann oder Sie werden mit einem Array von n Elementen enden, alle als letztes Datum. Ändern in currentDate = new Date (currentDate) funktioniert. – Scott

+0

Ich bin froh, dass ich helfen konnte.Sie sollten die richtige Antwort akzeptieren. –

+1

Bearbeitete die Antwort, um Scotts Korrektur zu reflektieren. – faroligo

21

Ich benutze moment.js und Twix.js sie eine sehr große Unterstützung für Datum liefern und Zeit manpulation

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

Ich habe diesen Lauf auf http://jsfiddle.net/Lkzg1bxb/

+1

Es funktioniert, aber es ist nicht sehr performant –

+0

Ich habe alle damit verbundenen Dateien herunterladen, aber es zeigt immer noch den Fehler TypeError: moment.twix ist keine Funktion –

+0

Sie müssen möglicherweise die Bibliotheken enthalten. In nodejs geht es wie, var moment = require ('moment'); erfordern ('twix'); –

4

Ich arbeitete vor kurzem mit moment.js nach der Trick tat ..

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

Ergebnis wäre:

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

die Sie interessieren, denken Sie daran Moment js zu schließen,

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

Wie bekomme ich nur Arbeitstage? – gsk

+0

Nur eine kleine Verbesserung: Kurzschreibweise für die Erstellung von Arrays wird empfohlen 'var dateArray = [] ; 'Details [hier] (http://stackoverflow.com/questions/931872/what-s-the-difference-between-array-and-while-declaring-a-javascript-ar) –

+0

Es ist die neue Art von Definieren von Arrays, und ich nehme an, es ist kürzer/sauberer –

6

Ich habe die @Mohammed Safeer-Lösung schon eine Weile benutzt und einige Verbesserungen vorgenommen. Die Verwendung formatierter Daten ist eine schlechte Übung, wenn Sie in Ihren Controllern arbeiten. moment().format() sollte nur für Anzeigezwecke in Ansichten verwendet werden. Denken Sie auch daran, dass moment().clone() eine Trennung von Eingabeparametern gewährleistet, was bedeutet, dass die Eingabedaten nicht geändert werden. Ich empfehle Ihnen dringend, moment.js zu verwenden, wenn Sie mit Daten arbeiten.

Verbrauch:

  • Geben moment.js Daten als Werte für startDate, endDate Parameter
  • interval Parameter 'Tage' optional und standardmäßig ist. Verwenden Sie Intervalle, die von .add() Methode (Moment.js) unterstützt werden. More details here
  • total Parameter ist nützlich, wenn Intervalle in Minuten angegeben werden. Es ist standardmäßig 1.

Invoke:

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

getDatesRangeArray(startDate, endDate, 'minutes', 30); 

Funktion:

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

Dieser jemand helfen kann,

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

1
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"] 
+0

Bitte fügen Sie weitere Beschreibung und/oder Informationen über Ihre Antwort und wie es das gestellte Problem löst, damit andere es ohne Klärung leicht verstehen können – koceeng

+0

Ich finde, dass das 2016-03-31 aus irgendeinem Grund überspringt! – woodhead92

2

d3js bietet viele praktische Funktionen und beinhaltet d3.time für einfache Datum Manipulationen

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

Für Ihre spezifische Anfrage:

Utc

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

oder Ortszeit

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

Bereich wird eine Reihe von Datumsobjekten, die

für jeden Tag, an dem ersten möglichen Wert fallen

Sie timeDay zu timeHour, timeMonth usw. für die gleichen Ergebnisse auf verschiedenen Intervallen

1

Hier ändern ein einziger Liner, der keine Bibliotheken benötigt, falls Sie keine andere Funktion erstellen möchten. Ersetzen Sie einfach startDate (an zwei Stellen) und endDate (die js-Datumsobjekte sind) durch Ihre Variablen oder Datumswerte. Natürlich könnte man es in einer Funktion wickeln, wenn Sie

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

Ich verwende einfach bevorzugen while-Schleife die zwischen Terminen

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

1

Gerade kam in dieser Frage zu berechnen, Der einfachste Weg, dies zu tun, ist die Verwendung von Moment:

Sie müssen Moment und Moment-Bereich zuerst installieren:

0

Mit ES6 haben Sie Array.from, was bedeutet, dass Sie eine wirklich elegante Funktion schreiben können, die dynamische Intervalle (Stunden, Tage, Monate) ermöglicht.

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