javascript - elapsed minutes between two times

Abe picture Abe · May 20, 2013 · Viewed 7.2k times · Source

I have an application that requires the elapsed minutes between two times. Eg: 9:00 to 10:00 is sixty minutes. This is the solution that I worked out, but it seems excessively verbose. Can I do better?

EDIT: I receive strings in the format of YYYYMMDD and HHMM or HMM from a remote system.

// define a start time and end time as string
var start_time ="830";
var end_time ="1930";

// make sure we have complete 4 digit time
start_time   = ('0' + start_time).slice(-4);
end_time     = ('0' + end_time).slice(-4);

// extract start minutes and seconds
start_hour = start_time.substring(0,2); 
start_minute = start_time.substring(2,4); 

// extract end minutes and seconds
end_hour = end_time.substring(0,2); 
end_minute = end_time.substring(2,4); 

//get current date - it seems that we need a date a valid date to create a Date object
var now = new Date();
var year = now.getUTCFullYear();
var month = now.getUTCMonth();
var day = now.getDate();

// create Date object
var start_date_time_object = new Date(year,month,day,start_hour,start_minute);  
var end_date_time_object = new Date(year,month,day,end_hour,end_minute);    

// get number of minutes between start and end times
var start_minutes = (start_date_time_object.getHours() * 60) +  start_date_time_object.getMinutes();
var end_minutes = (end_date_time_object.getHours() * 60) +  end_date_time_object.getMinutes();

// calculate net time elapsed
var duration = end_minutes - start_minutes;

// display
console.log(start_minutes);
console.log(end_minutes);
console.log(duration);

Answer

flavian picture flavian · May 20, 2013

DEMO

Just remove what you don't want to see from the return. Now you can simply pass date objects in, you don't have to bother with conversions.

var cc = new Date("9/13/2012 12:00 AM");
var c = new Date();

function timeDifference(d, dd) {
    var minute = 60 * 1000,
        hour = minute * 60,
        day = hour * 24,
        month = day * 30,
        ms = Math.abs(d - dd);

    var months = parseInt(ms / month, 10);

        ms -= months * month;

    var days = parseInt(ms / day, 10);

        ms -= days * day;

    var hours = parseInt(ms / hour, 10);

        ms -= hours * hour;
    var minutes = parseInt(ms / minute, 10);

    return [
        months + " months",
        days + " days",
        hours + " hours",
        minutes + " minutes"
    ].join(", ");
};

document.body.innerHTML += timeDifference(cc, c) + "<br />";