Hoe datums opsommen tussen twee datums in Moment

Ik heb twee momentdatums:

var fromDate = moment(new Date('1/1/2014'));
var toDate   = moment(new Date('6/1/2014'));

Biedt moment een manier om alle datums tussen deze twee datums op te sommen?

Zo niet, is er dan een betere oplossing dan een lus te maken die de fromDatemet 1 verhoogt totdat deze de toDatebereikt?

Bewerken: datumopsommingsmethode en probleem toevoegen

Ik heb een methode bedacht om de dagen tussen twee datums op te sommen, maar ik loop tegen een probleem aan.

 var enumerateDaysBetweenDates = function(startDate, endDate) {
    var dates = [];
    startDate = startDate.add(1, 'days');
    while(startDate.format('M/D/YYYY') !== endDate.format('M/D/YYYY')) {
      console.log(startDate.toDate());
      dates.push(startDate.toDate());
      startDate = startDate.add(1, 'days');
    }
    return dates;
  };

Bekijk de uitvoer wanneer ik enumerateDaysBetweenDates( moment(new Date('1/1/2014')), moment(new Date('1/5/2014'));

Thu Jan 02 2014 00:00:00 GMT-0800 (PST)
Fri Jan 03 2014 00:00:00 GMT-0800 (PST)
Sat Jan 04 2014 00:00:00 GMT-0800 (PST)
[ Sun Jan 05 2014 00:00:00 GMT-0800 (PST),
  Sun Jan 05 2014 00:00:00 GMT-0800 (PST),
  Sun Jan 05 2014 00:00:00 GMT-0800 (PST) ]

Het is console.loggen van de juiste datums, maar alleen de einddatum wordt aan de array toegevoegd. Hoe/waarom is dit? Dit ruikt naar een probleem met variabele referentie, maar ik zie het niet.


Antwoord 1, autoriteit 100%

.add()is een mutatormethode , dus de toewijzing in deze regel is niet nodig:

startDate = startDate.add(1, 'days');

Je kunt dit gewoon doen en hetzelfde effect hebben:

startDate.add(1, 'days');

Hoewel de naam zou impliceren dat er een nieuw Date-object wordt gemaakt, is de toDate()methode retourneert eigenlijk gewoon het bestaande interne Dateobject.

Dus geen van je methode-aanroepen creëert nieuwe Dateof momentobjectinstanties. Los dat op door .clone()te gebruiken om een nieuwe instantie ophalen:

startDate = startDate.clone().add(1, 'days');

Of beter nog, wikkel de waarden in een aanroep naar moment()als Mtzsuggereert in een opmerking, en het zal de instantie klonen, als de waarde een momentobject is, of het zal de invoer ontleden om een ​​nieuwe momentinstantie te maken.

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

Ik denk dat een methode voor het opsommen van een datum geen van de ingevoerde argumenten mag veranderen. Ik zou een aparte variabele maken voor het opsommen. Ik zou de datums ook rechtstreeks vergelijken, in plaats van strings te vergelijken:

var enumerateDaysBetweenDates = function(startDate, endDate) {
    var dates = [];
    var currDate = moment(startDate).startOf('day');
    var lastDate = moment(endDate).startOf('day');
    while(currDate.add(1, 'days').diff(lastDate) < 0) {
        console.log(currDate.toDate());
        dates.push(currDate.clone().toDate());
    }
    return dates;
};

Antwoord 2, autoriteit 49%

Ik heb het voor je:

var enumerateDaysBetweenDates = function(startDate, endDate) {
    var now = startDate.clone(), dates = [];
    while (now.isSameOrBefore(endDate)) {
        dates.push(now.format('M/D/YYYY'));
        now.add(1, 'days');
    }
    return dates;
};

Verwijzen naar nowin plaats van naar startDatemaakte het verschil.

Als u niet op zoek bent naar een uitgebreide zoekopdracht, verander dan .isSameOrBeforein .isBefore

Fiddle:http://jsfiddle.net/KyleMuir/sRE76/ 118/


Antwoord 3, autoriteit 10%

gebruik moment en werk met while-lus, code wordt in lus uitgevoerd totdat startDate gelijk is aan endDate en druk op startDate en verhoog het vervolgens met 1 dag zodat de volgende datum kan worden verkregen

function enumerateDaysBetweenDates (startDate, endDate){
  let date = []
  while(moment(startDate) <= moment(endDate)){
    date.push(startDate);
    startDate = moment(startDate).add(1, 'days').format("YYYY-MM-DD");
  }
  return date;
}

je kunt het testen door de functie op deze manier aan te roepen

let dateArr = enumerateDaysBetweenDates('2019-01-01', '2019-01-10');

Antwoord 4, autoriteit 5%

Momentjs biedt dit niet zelf, maar er is een plug-in die dit wel biedt: moment-range.

Bekijk vooral de Iteratiedocumenten.


Antwoord 5, autoriteit 5%

Met behulp van moment libraryen for loopkun je tussen twee datums opsommen.

let startDate = moment('2020-06-21');
let endDate = moment('2020-07-15');
let date = [];
for (var m = moment(startDate); m.isBefore(endDate); m.add(1, 'days')) {
    date.push(m.format('YYYY-MM-DD'));
}
console.log(date)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

Other episodes