Get the time difference between two datetimes Get the time difference between two datetimes javascript javascript

Get the time difference between two datetimes


This approach will work ONLY when the total duration is less than 24 hours:

var now  = "04/09/2013 15:00:00";var then = "04/09/2013 14:20:30";moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss")// outputs: "00:39:30"

If you have 24 hours or more, the hours will reset to zero with the above approach, so it is not ideal.

If you want to get a valid response for durations of 24 hours or greater, then you'll have to do something like this instead:

var now  = "04/09/2013 15:00:00";var then = "02/09/2013 14:20:30";var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));var d = moment.duration(ms);var s = Math.floor(d.asHours()) + moment.utc(ms).format(":mm:ss");// outputs: "48:39:30"

Note that I'm using the utc time as a shortcut. You could pull out d.minutes() and d.seconds() separately, but you would also have to zeropad them.

This is necessary because the ability to format a duration objection is not currently in moment.js. It has been requested here. However, there is a third-party plugin called moment-duration-format that is specifically for this purpose:

var now  = "04/09/2013 15:00:00";var then = "02/09/2013 14:20:30";var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));var d = moment.duration(ms);var s = d.format("hh:mm:ss");// outputs: "48:39:30"


Your problem is in passing the result of moment.duration() back into moment() before formatting it; this results in moment() interpreting it as a time relative to the Unix epoch.

It doesn't give you exactly the format you're looking for, but

moment.duration(now.diff(then)).humanize()

would give you a useful format like "40 minutes". If you're really keen on that specific formatting, you'll have to build a new string yourself. A cheap way would be

[diff.asHours(), diff.minutes(), diff.seconds()].join(':')

where var diff = moment.duration(now.diff(then)). This doesn't give you the zero-padding on single digit values. For that, you might want to consider something like underscore.string - although it seems like a long way to go just for a few extra zeroes. :)


var a = moment([2007, 0, 29]);var b = moment([2007, 0, 28]);a.diff(b, 'days') //[days, years, months, seconds, ...]//Result 1 

Worked for me

See more inhttp://momentjs.com/docs/#/displaying/difference/