Verschil tussen 2 datums in JavaScript?

Hoe krijg ik het verschil tussen 2 datums in hele dagen (ik wil geen fracties van een dag)

var date1 = new Date('7/11/2010');
var date2 = new Date('12/12/2010');
var diffDays = date2.getDate() - date1.getDate(); 
alert(diffDays)

Ik heb het bovenstaande geprobeerd, maar dit werkte niet.


Antwoord 1, autoriteit 100%

Hier is een manier:

const date1 = new Date('7/13/2010');
const date2 = new Date('12/15/2010');
const diffTime = Math.abs(date2 - date1);
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); 
console.log(diffTime + " milliseconds");
console.log(diffDays + " days");

Antwoord 2, autoriteit 85%

Een meer correcte oplossing

aangezien datums natuurlijk tijdzone-informatie bevatten, die regio’s met verschillende daglichtbesparingsaanpassingen kan omvatten

Eerdere antwoorden op deze vraag houden geen rekening met gevallen waarin de twee datums in kwestie een wijziging van de zomertijd (DST) omvatten. De datum waarop de zomertijdwijziging plaatsvindt, heeft een duur in milliseconden en is != 1000*60*60*24, dus de gebruikelijke berekening zal mislukken.

U kunt dit omzeilen door eerst de twee datums naar UTC te normaliseren en vervolgens het verschil tussen die twee UTC-datums te berekenen.

Nu kan de oplossing worden geschreven als,

const _MS_PER_DAY = 1000 * 60 * 60 * 24;
// a and b are javascript Date objects
function dateDiffInDays(a, b) {
  // Discard the time and time-zone information.
  const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
  const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());
  return Math.floor((utc2 - utc1) / _MS_PER_DAY);
}
// test it
const a = new Date("2017-01-01"),
    b = new Date("2017-07-25"),
    difference = dateDiffInDays(a, b);

Dit werkt omdat UTC-tijd nooit DST observeert. Zie Houdt UTC rekening met zomertijd?

ps. Nadat u enkele opmerkingen over dit antwoord hebt besproken, is er waarschijnlijk meer dan één manier om het op te lossen als u eenmaal de problemen met javascript-datums die een zomertijdgrens overspannen heeft begrepen. Wat ik hierboven heb verstrekt, is een eenvoudige (en geteste) oplossing. Ik zou graag willen weten of er een eenvoudige op rekenkunde/wiskunde gebaseerde oplossing is in plaats van de twee nieuwe Date-objecten te moeten instantiëren. Dat kan mogelijk sneller zijn.


Antwoord 3, autoriteit 12%

Hier is een oplossing met moment.js:

var a = moment('7/11/2010','M/D/YYYY');
var b = moment('12/12/2010','M/D/YYYY');
var diffDays = b.diff(a, 'days');
alert(diffDays);

Ik heb je oorspronkelijke invoerwaarden gebruikt, maar je hebt het formaat niet opgegeven, dus ik nam aan dat de eerste waarde 11 juli was. Als het de bedoeling was dat het 7 november zou zijn, pas dan de notatie aan naar D/M/YYYY.


Antwoord 4, autoriteit 4%

var date1 = new Date("7/11/2010");
var date2 = new Date("8/11/2010");
var diffDays = parseInt((date2 - date1) / (1000 * 60 * 60 * 24), 10); 
alert(diffDays )

Antwoord 5

Ik heb veel manieren geprobeerd en ontdekte dat het gebruik van datepicker de beste was, maar de datumnotatie veroorzaakt problemen met JavaScript….

Dus hier is mijn antwoord en kan direct uit de doos worden gehaald.

<input type="text" id="startdate">
<input type="text" id="enddate">
<input type="text" id="days">
<script src="https://code.jquery.com/jquery-1.8.3.js"></script>
<script src="https://code.jquery.com/ui/1.10.0/jquery-ui.js"></script>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/redmond/jquery-ui.css" />
<script>
$(document).ready(function() {
$( "#startdate,#enddate" ).datepicker({
changeMonth: true,
changeYear: true,
firstDay: 1,
dateFormat: 'dd/mm/yy',
})
$( "#startdate" ).datepicker({ dateFormat: 'dd-mm-yy' });
$( "#enddate" ).datepicker({ dateFormat: 'dd-mm-yy' });
$('#enddate').change(function() {
var start = $('#startdate').datepicker('getDate');
var end   = $('#enddate').datepicker('getDate');
if (start<end) {
var days   = (end - start)/1000/60/60/24;
$('#days').val(days);
}
else {
alert ("You cant come back before you have been!");
$('#startdate').val("");
$('#enddate').val("");
$('#days').val("");
}
}); //end change function
}); //end ready
</script>

een Fiddle is hier te zien DEMO


Antwoord 6

Dit is de code om de ene datum van de andere af te trekken. In dit voorbeeld worden de datums geconverteerd naar objecten, aangezien de functie getTime() alleen werkt als het een Date-object is.

   var dat1 = document.getElementById('inputDate').value;
                var date1 = new Date(dat1)//converts string to date object
                alert(date1);
                var dat2 = document.getElementById('inputFinishDate').value;
                var date2 = new Date(dat2)
                alert(date2);
                var oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds
                var diffDays = Math.abs((date1.getTime() - date2.getTime()) / (oneDay));
                alert(diffDays);

Other episodes