Reputation: 3871
I get incorrect results when trying to find numeric difference between two dates:
var startDate = moment( $('[name="date-start"]').val(), "DD.MM.YYYY"), // $('[name="date-start"]').val() === "13.04.2016"
endDate = moment( $('[name="date-end"]' ).val(), "DD.MM.YYYY"); // $('[name="date-end"]').val() === "28.04.2016"
var diff = startDate.diff(endDate);
console.log( moment(diff).format('E') );
Between 13.04.2016
and 28.04.2016
I shouldn't get that difference is 3 or 2 days...
I've tried to multiple combinations:
startDate.diff(endDate)
with endDate.diff(startDate)
format('E')
with something I've come up searching the SOResult: all the time I get that difference is 3 or 2 days.
What am I doing wrong?
Upvotes: 80
Views: 199730
Reputation: 579
Calculate the differance in Seconds
var date1 = moment("2022-10-30");
var date2 = moment("2022-12-30");
var diff = date1.diff(date2, 'seconds')
and then you can conver then in to hours and Minutes and seconds.
var mind = diff % (60 * 60);
const hours = Math.floor(diff / (60 * 60));
const minutes = Math.floor(mind / 60);
var seconds = Math.ceil(mind % 60);
Thanks
Upvotes: 0
Reputation: 15756
Use moment.js
to find the difference between two dates in days.
Install moment.js using the following command,
npm install moment
Calculate the difference between two dates in days.
var moment = require('moment');
var date1 = moment("2022-10-30");
var date2 = moment("2022-12-30");
var days = date1.diff(date2, 'days')
Upvotes: 6
Reputation: 1288
const FindDate = (date, allDate) => {
// moment().diff only works on moment(). Make sure both date and elements in allDate array are in moment format
let nearestDate = -1;
allDate.some(d => {
const currentDate = moment(d)
const difference = currentDate.diff(d); // Or d.diff(date) depending on what you're trying to find
if(difference >= 0){
nearestDate = d
}
});
console.log(nearestDate)
}
Upvotes: 0
Reputation: 1559
Here's how you can get the comprehensive full fledge difference of two dates.
function diffYMDHMS(date1, date2) {
let years = date1.diff(date2, 'year');
date2.add(years, 'years');
let months = date1.diff(date2, 'months');
date2.add(months, 'months');
let days = date1.diff(date2, 'days');
date2.add(days, 'days');
let hours = date1.diff(date2, 'hours');
date2.add(hours, 'hours');
let minutes = date1.diff(date2, 'minutes');
date2.add(minutes, 'minutes');
let seconds = date1.diff(date2, 'seconds');
console.log(years + ' years ' + months + ' months ' + days + ' days ' + hours + '
hours ' + minutes + ' minutes ' + seconds + ' seconds');
return { years, months, days, hours, minutes, seconds};
}
Upvotes: 10
Reputation: 5524
From the moment.js docs: format('E')
stands for day of week. thus your diff is being computed on which day of the week, which has to be between 1 and 7.
From the moment.js docs again, here is what they suggest:
var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') // 1
Here is a JSFiddle for your particular case:
$('#test').click(function() {
var startDate = moment("13.04.2016", "DD.MM.YYYY");
var endDate = moment("28.04.2016", "DD.MM.YYYY");
var result = 'Diff: ' + endDate.diff(startDate, 'days');
$('#result').html(result);
});
#test {
width: 100px;
height: 100px;
background: #ffb;
padding: 10px;
border: 2px solid #999;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.js"></script>
<div id='test'>Click Me!!!</div>
<div id='result'></div>
Upvotes: 149
Reputation: 5155
the diff
method returns the difference in milliseconds. Instantiating moment(diff)
isn't meaningful.
You can define a variable :
var dayInMilliseconds = 1000 * 60 * 60 * 24;
and then use it like so :
diff / dayInMilliseconds // --> 15
Edit
actually, this is built into the diff
method, dubes' answer is better
Upvotes: 0