2015-04-06 13 views

risposta

24

Questo dovrebbe farlo:

var dateStart = moment('2013-8-31'); 
var dateEnd = moment('2015-3-30'); 
var timeValues = []; 

while (dateEnd > dateStart || dateStart.format('M') === dateEnd.format('M')) { 
    timeValues.push(dateStart.format('YYYY-MM')); 
    dateStart.add(1,'month'); 
} 
+2

se si sceglie un intervallo di date qualcosa come - 2016-08-16 a 2017-02-15, questa logica da sola non sarà utile . Dato che il 'Feb-2017' non verrà aggiunto. Semplicemente perché nella data di inizio dell'ultima iterazione sarà 2017-02-16, che è maggiore di 2017-02-15 –

+1

La correzione di Alexander Swann (sotto) è la migliore risposta e corregge questo problema del mese finale mancante. – LStarky

+0

correzione aggiunta alla mia risposta ... in realtà volevo eliminarla in modo che rimanga quella fissa, ma la mia risposta deve essere rimossa "accettata" – vinjenzo

1

si potrebbe provare con questo esempio

var one = moment("2015-3-30"); 
    var two = moment("2014-8-31"); 
    var dateDiffs = []; 
    var count = Math.round(moment.duration(one.diff(two)).asMonths()); 

    month = two.month() + 1; 
    year = two.year(); 

    for (var i=1; i<=count; i++) { 
     if (month > 12) { 
     month = 1; 
     year++; 
     } 
     dateDiffs.push(year+"-"+month); 
     console.log(month); 
     month++; 
    } 

    console.log(dateDiffs); 
+0

grazie per la risposta, ma il codice ha alcuni problemi se datediffs è più di 2 anni, è possibile controllare questo violino: https://jsfiddle.net/jcoyace0/ –

+0

grazie per l'aiuto, funziona benissimo in chrome, ma ho trovato una data non valida in firefox, sto cercando una soluzione per questo bug –

3

si utilizzano più formati in uscita: YYYY-MM e AAAA-M, così ho scelto la prima. Puoi modificare come meglio credi.

var startDateString = "2012-5-30"; 
 
var endDateString = "2015-8-31"; 
 
var startDate = moment(startDateString, "YYYY-M-DD"); 
 
var endDate = moment(endDateString, "YYYY-M-DD").endOf("month"); 
 

 
var allMonthsInPeriod = []; 
 

 
while (startDate.isBefore(endDate)) { 
 
    allMonthsInPeriod.push(startDate.format("YYYY-MM")); 
 
    startDate = startDate.add(1, "month"); 
 
}; 
 

 
console.log(allMonthsInPeriod); 
 

 
document.getElementById("result").innerHTML = allMonthsInPeriod.join("<br />");
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.4/moment.min.js"></script> 
 
<div id="result"></div>

8

Penso che la risposta originale non è del tutto corretto, in quanto non si otterrebbe '2015-3' nella propria matrice. Ciò è dovuto al fatto che la data di inizio alla fine finirebbe come '2015-3-31' e fallirebbe il condizionale in atto. Potresti estenderlo come di seguito.

var dateStart = moment('2013-8-31'); 
var dateEnd = moment('2015-3-30'); 
var timeValues = []; 

while (dateEnd > dateStart || dateStart.format('M') === dateEnd.format('M')) { 
    timeValues.push(dateStart.format('YYYY-MM')); 
    dateStart.add(1,'month'); 
} 
+1

Questa è una soluzione perfetta per "che dire dell'ultimo mese? " problema con la risposta primaria accettata. Grazie per averlo aggiunto! Questo dovrebbe ricevere i più upvotes. – LStarky

Problemi correlati