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?
This question is related to
javascript
date
momentjs
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
Docs: https://momentjs.com/docs/#/displaying/difference/
Example:
const dateFormat = "YYYY-MM-DD HH:mm:ss";_x000D_
// Get your start and end date/times_x000D_
const rightNow = moment().format(dateFormat);_x000D_
const thisTimeYesterday = moment().subtract(1, 'days').format(dateFormat);_x000D_
// pass in hours as the second parameter to the diff function_x000D_
const differenceInHours = moment(rightNow).diff(thisTimeYesterday, 'hours');_x000D_
_x000D_
console.log(`${differenceInHours} hours have passed since this time yesterday`);
_x000D_
<script _x000D_
src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js">_x000D_
</script>
_x000D_
As per the new Deprecation warning of Moment JS
You need to pass Format of Start and end date Format along with values for example :
let trackStartTime = "2020-12-29 09:59:19.07 +05:30";
let trackEndTime = "2020-12-29 11:04:19.07 +05:30" || moment().format("YYYY-MM-DD HH:mm:ss.SS Z");
let overallActivity = moment.duration(moment(trackEndTime, 'YYYY-MM-DD HH:mm:ss.SS Z').diff(moment(trackStartTime, 'YYYY-MM-DD HH:mm:ss.SS Z'))).asHours();
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:
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[0]), t1d = Number(t1[1]), t2s = Number(t2[0]), t2d = Number(t2[1]);
if (t1s < t2s) {
this.t(t1s, t2s);
}
if (t1s > t2s) {
this.t(t1s, 23);
this.t(0, t2s);
}
var saat_dk = Number(s[1]);
if (s[0] == tm1.substring(0, 2) && saat_dk >= t1d)
return true;
if (s[0] == tm2.substring(0, 2) && saat_dk <= t2d)
return true;
if (this.tstr.indexOf(s[0]) != 1 && this.tstr.indexOf(s[0]) != -1 && !(this.tstr.indexOf(s[0]) == 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;
}
}};
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);
// you could adjust the if to your needs
if (validForUnit > 1 || unit === "minutes") {
return [validForUnit, unit];
}
return getValidFor(createdAt, expiresAt, UNITS[UNITS.indexOf(unit) + 1]);
}
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.
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 __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);
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
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)
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
For more info refer to the official docs.
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[0]).diff(moment(onlyDate1[0]), 'days')
// First Day Entry
dayObj.startDate = startDate;
dayObj.endDate = moment(onlyDate1[0]).add(1, 'day').format('YYYY-MM-DD')+" 00:00:00";
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.startDate = moment(onlyDate1[0]).add(i, 'day').format('YYYY-MM-DD')+" 00:00:00";
dayObj1.endDate = moment(onlyDate1[0]).add(i+1, 'day').format('YYYY-MM-DD')+" 00:00:00";
dayObj1.minutes = moment(dayObj1.endDate).diff(moment(dayObj1.startDate), 'minutes');
finalArray.push(dayObj1);
}
}
// Last Day Entry
var dayObj2 = new Object;
dayObj2.startDate = moment(onlyDate1[0]).add(i, 'day').format('YYYY-MM-DD')+" 00:00:00";
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
}
]
Source: Stackoverflow.com