code-8
code-8

Reputation: 58662

Time differences in hours and minutes via Moment.js

enter image description here

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?

Edit

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

enter image description here

Upvotes: 1

Views: 582

Answers (1)

Zerowiel
Zerowiel

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

Related Questions