# Get hours difference between two dates in Moment Js

I'm able to get the difference between two dates using MomentJs as follows:

``````moment(end.diff(startTime)).format("m[m] s[s]")
``````

However, I also want to display the hour when applicable (only when >= 60 minutes have passed).

However, when I try to retrieve the duration hours using the following:

``````var duration = moment.duration(end.diff(startTime));
var hours = duration.hours();
``````

it is returning the current hour and not the number of hours between the two dates.

How do I get the difference in hours between two Moments? You were close. You just need to use the `duration.asHours()` method (see the docs).

``````var duration = moment.duration(end.diff(startTime));
var hours = duration.asHours();
`````` Following code block shows how to calculate the difference in number of days between two dates using MomentJS.

``````var now = moment(new Date()); //todays date
var end = moment("2015-12-1"); // another date
var duration = moment.duration(now.diff(end));
var days = duration.asDays();
console.log(days)
`````` Or you can do simply:

``````var a = moment('2016-06-06T21:03:55');//now
var b = moment('2016-05-06T20:03:55');

console.log(a.diff(b, 'minutes')) // 44700
console.log(a.diff(b, 'hours')) // 745
console.log(a.diff(b, 'days')) // 31
console.log(a.diff(b, 'weeks')) // 4
``````

docs: here All you need to do is pass in `hours` as the second parameter to moments diff function.

``````var a = moment([21,30,00], "HH:mm:ss")
var b = moment([09,30,00], "HH:mm:ss")
a.diff(b, 'hours') // 12
``````

Example:

``````const dateFormat = "YYYY-MM-DD HH:mm:ss";
// Get your start and end date/times
const rightNow = moment().format(dateFormat);
const thisTimeYesterday = moment().subtract(1, 'days').format(dateFormat);
// pass in hours as the second parameter to the diff function
const differenceInHours = moment(rightNow).diff(thisTimeYesterday, 'hours');

console.log(`\${differenceInHours} hours have passed since this time yesterday`);``````
``````<script
src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js">
</script>`````` There is a great `moment` method called `fromNow()` that will return the time from a specific time in nice human readable form, like this:

``````moment('2019-04-30T07:30:53.000Z').fromNow() // an hour ago || a day ago || 10 days ago
``````

Or if you want that between two specific dates you can use:

``````var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.from(b); // "a day ago"
``````

Taken from the Docs: I know this is old, but here is a one liner solution:

``````const hourDiff = start.diff(end, "hours");
``````

Where start and end are moment objects.

Enjoy! `````` var start=moment(1541243900000);
var end=moment(1541243942882);
var duration = moment.duration(end.diff(startTime));
var hours = duration.asHours();
``````

As you can see, the start and end date needed to be moment objects for this method to work. ``````var __startTime = moment("2016-06-06T09:00").format();
var __endTime = moment("2016-06-06T21:00").format();

var __duration = moment.duration(moment(__endTime).diff(__startTime));
var __hours = __duration.asHours();
console.log(__hours);
`````` If you want total minutes between two dates in day wise than may below code will help full to you Start Date : 2018-05-04 02:08:05 , End Date : 2018-05-14 09:04:07...

``````function countDaysAndTimes(startDate,endDate){
return new Promise(function (resolve, reject) {
var dayObj = new Object;
var finalArray = new Array;

var datetime1 = moment(startDate);
var datetime2 = moment(endDate);
if(datetime1.format('D') != datetime2.format('D') || datetime1.format('M') != datetime2.format('M') ||  datetime1.format('YYYY') != datetime2.format('YYYY')){
var onlyDate1 = startDate.split(" ");
var onlyDate2 = endDate.split(" ");
var totalDays = moment(onlyDate2).diff(moment(onlyDate1), 'days')

// First Day Entry
dayObj.startDate = startDate;
dayObj.minutes = moment(dayObj.endDate).diff(moment(dayObj.startDate), 'minutes');
finalArray.push(dayObj);

// Between Days Entry
var i = 1;
if(totalDays > 1){
for(i=1; i<totalDays; i++){
var dayObj1 = new Object;
dayObj1.minutes = moment(dayObj1.endDate).diff(moment(dayObj1.startDate), 'minutes');
finalArray.push(dayObj1);
}
}

// Last Day Entry
var dayObj2 = new Object;
dayObj2.endDate = endDate ;
dayObj2.minutes = moment(dayObj2.endDate).diff(moment(dayObj2.startDate), 'minutes');
finalArray.push(dayObj2);

}
else{
dayObj.startDate = startDate;
dayObj.endDate = endDate;
dayObj.minutes = datetime2.diff(datetime1, 'minutes');
finalArray.push(dayObj);
}
console.log(JSON.stringify(finalArray));
// console.table(finalArray);
resolve(finalArray);
});
}
``````

Output

`````` [
{
"startDate":"2018-05-04 02:08:05",
"endDate":"2018-05-05 00:00:00",
"minutes":1311
},
{
"startDate":"2018-05-05 00:00:00",
"endDate":"2018-05-06 00:00:00",
"minutes":1440
},
{
"startDate":"2018-05-06 00:00:00",
"endDate":"2018-05-07 00:00:00",
"minutes":1440
},
{
"startDate":"2018-05-07 00:00:00",
"endDate":"2018-05-08 00:00:00",
"minutes":1440
},
{
"startDate":"2018-05-08 00:00:00",
"endDate":"2018-05-09 00:00:00",
"minutes":1440
},
{
"startDate":"2018-05-09 00:00:00",
"endDate":"2018-05-10 00:00:00",
"minutes":1440
},
{
"startDate":"2018-05-10 00:00:00",
"endDate":"2018-05-11 00:00:00",
"minutes":1440
},
{
"startDate":"2018-05-11 00:00:00",
"endDate":"2018-05-12 00:00:00",
"minutes":1440
},
{
"startDate":"2018-05-12 00:00:00",
"endDate":"2018-05-13 00:00:00",
"minutes":1440
},
{
"startDate":"2018-05-13 00:00:00",
"endDate":"2018-05-14 00:00:00",
"minutes":1440
},
{
"startDate":"2018-05-14 00:00:00",
"endDate":"2018-05-14 09:04:07",
"minutes":544
}
]
`````` In my case, I wanted hours and minutes:

``````var duration = moment.duration(end.diff(startTime));
var hours = duration.hours(); //hours instead of asHours
var minutes = duration.minutes(); //minutes instead of asMinutes
`````` I know this is already answered but in case you want something recursive and more generic and not relying on moment `fromNow` you could use this function I created. Of course you can change its logic to adjust it to your needs to also support years and seconds.

``````var createdAt = moment('2019-05-13T14:23:00.607Z');
var expiresAt = moment('2019-05-14T14:23:00.563Z');

// You can also add years in the beginning of the array or seconds in its end
const UNITS = ["months", "weeks", "days", "hours", "minutes"]
function getValidFor (createdAt, expiresAt, unit = 'months') {
const validForUnit = expiresAt.diff(createdAt, unit);
if (validForUnit > 1 || unit === "minutes") {
return [validForUnit, unit];
}
return getValidFor(createdAt, expiresAt, UNITS[UNITS.indexOf(unit) + 1]);
}
`````` ``````            var timecompare = {
tstr: "",
get: function (current_time, startTime, endTime) {
this.tstr = "";
var s = current_time.split(":"), t1 = tm1.split(":"), t2 = tm2.split(":"), t1s = Number(t1), t1d = Number(t1), t2s = Number(t2), t2d = Number(t2);

if (t1s < t2s) {
this.t(t1s, t2s);
}

if (t1s > t2s) {
this.t(t1s, 23);
this.t(0, t2s);
}

var saat_dk = Number(s);

if (s == tm1.substring(0, 2) && saat_dk >= t1d)
return true;
if (s == tm2.substring(0, 2) && saat_dk <= t2d)
return true;
if (this.tstr.indexOf(s) != 1 && this.tstr.indexOf(s) != -1 && !(this.tstr.indexOf(s) == this.tstr.length - 2))
return true;

return false;

},
t: function (ii, brk) {
for (var i = 0; i <= 23; i++) {
if (i < ii)
continue;
var s = (i < 10) ? "0" + i : i + "";
this.tstr += "," + s;
if (brk == i)
break;
}
}};
``````