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 fromDate
met 1 verhoogt totdat deze de toDate
bereikt?
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 Date
object.
Dus geen van je methode-aanroepen creëert nieuwe Date
of moment
objectinstanties. 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 now
in plaats van naar startDate
maakte het verschil.
Als u niet op zoek bent naar een uitgebreide zoekopdracht, verander dan .isSameOrBefore
in .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 library
en for loop
kun 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>