Reputation: 58662
I would like to calculate the time differences between 2 times using moment.js
I've been using JS to archive it.
function timeDiffCalc(dateFuture, dateNow) {
let diffInMilliSeconds = Math.abs(dateFuture - dateNow) / 1000;
// console.log(dateFuture,dateNow);
const days = Math.floor(diffInMilliSeconds / 86400);
diffInMilliSeconds -= days * 86400;
// console.log('calculated days', days);
const hours = Math.floor(diffInMilliSeconds / 3600) % 24;
diffInMilliSeconds -= hours * 3600;
// console.log('calculated hours', hours);
const minutes = Math.floor(diffInMilliSeconds / 60) % 60;
diffInMilliSeconds -= minutes * 60;
// console.log('minutes', minutes);
let difference = '';
if (days > 0) {
difference += (days === 1) ? `${days} day, ` : `${days} days, `;
}
difference += (hours === 0 || hours === 1) ? `${hours} hour, ` : `${hours} hours, `;
difference += (minutes === 0 || hours === 1) ? `${minutes} minutes` : `${minutes} minutes`;
return difference;
}
Curent Codes
var CurrentDate = new Date();
var nextFeedString = '2021-03-22 18:27:08';
nextFeedString = nextFeedString.replace(' ', 'T');
var timeLeft = timeDiffCalc(new Date(nextFeedString), new Date());
It works as the image above, but I'm seeking a better/shorter way of doing it via moment.js.
New Codes
var startTime = moment(new Date(), "HH:mm:ss a");
var endTime = moment(nextFeedString, "HH:mm:ss a");
var duration = moment.duration(endTime.diff(startTime));
var hours = parseInt(duration.asHours());
var minutes = parseInt(duration.asMinutes())%60;
var timeLeft = hours + ' hour and '+ minutes+' minutes.'; <<< it seems worse than what I got
Is there a better function of moment.js that I should use?
function timeLeftFromNow(endTime) {
var nowTime = moment(new Date(), "HH:mm:ss a");
var endTime = moment(endTime, "HH:mm:ss a");
var duration = moment.duration(endTime.diff(nowTime));
var hours = parseInt(duration.asHours());
var minutes = parseInt(duration.asMinutes())%60;
var timeLeft = `${hours} hour${hours > 1 && "s"} and ${minutes} minute${minutes > 1 && "s"}`;
return timeLeft;
}
var nextFeedString = '{{ $nextFeed }}';
nextFeedString = nextFeedString.replace(' ', 'T');
var timeLeft = timeLeftFromNow(nextFeedString);
I got
Upvotes: 1
Views: 582
Reputation: 170
Your moment code is the way to do it,
you could replace your last line by :
const timeLeft = `${hours} hour${hours > 1 ? "s" : ""} and ${minutes} minute${minutes > 1 ? "s" : ""}.`
And replace all your vars by const to be more ES6 friendly !
Upvotes: 2