Link to home
Start Free TrialLog in
Avatar of ianmeu1
ianmeu1

asked on

Calculate difference between two dates (in hours)

I searched EE and found similar posts but none of the solutions are 100% right. I Need a script that will take two dates (xx/xx/xxxx) and time (xx:xx am/pm) and return the difference in time between the two in total hours.  Output formatted as x.x hours. Below is code that is pretty close with a couple exceptions:

1. AM/PM doesn't appear to work
2. I need to remove the submit button and have it automatically update the difference field
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Time Delta</title>
 
<script type='text/javascript'>
  <!-- Original:  Ronnie T. Moore                             -->
  <!-- Web Site:  The JavaScript Source                       -->
 
  <!-- This script and many more are available free online at -->
  <!-- The JavaScript Source!! http://javascript.internet.com -->
 
  <!-- Begin
  function isValidDate( dateStr ) {
    // Date validation function courtesty of
    // Sandeep V. Tamhankar (stamhankar@hotmail.com) -->
 
    // Checks for the following valid date formats:
    // MM/DD/YY   MM/DD/YYYY   MM-DD-YY   MM-DD-YYYY
 
    var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/; // requires 4 digit year
 
    var matchArray = dateStr.match( datePat ); // is the format ok?
    if ( matchArray == null ) {
      alert( dateStr + " Date is not in a valid format." )
      return false;
    }
    month = matchArray[ 1 ]; // parse date into variables
    day   = matchArray[ 3 ];
    year  = matchArray[ 4 ];
    if ( month < 1 || month > 12 ) { // check month range
      alert( "Month must be between 1 and 12." );
      return false;
    }
    if ( day < 1 || day > 31 ) {
      alert("Day must be between 1 and 31.");
      return false;
    }
    if ( ( month == 4 || month == 6 || month == 9 || month == 11 ) && day == 31 ) {
      alert("Month "+month+" doesn't have 31 days!")
      return false;
    }
    if (month == 2) { // check for february 29th
      var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
      if (day>29 || (day==29 && !isleap)) {
        alert("February " + year + " doesn't have " + day + " days!");
        return false;
      }
    }
    return true;
  }
 
  function isValidTime( timeStr ) {
    // Time validation function courtesty of
    // Sandeep V. Tamhankar (stamhankar@hotmail.com) -->
 
    // Checks if time is in HH:MM:SS AM/PM format.
    // The seconds and AM/PM are optional.
 
    function d2( val ) {
      return ( val < 10 ) ? '0' + val : val;
    }
 
    var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;
 
    var matchArray = timeStr.match( timePat );
    if ( matchArray == null ) {
      alert( "Time is not in a valid format." );
      return false;
    }
    hour   = matchArray[ 1 ];
    minute = matchArray[ 2 ];
    if ( matchArray[ 4 ] ) {
      second = matchArray[ 4 ]
    } else {
      second = 0
    }
 
    if ( matchArray[ 5 ] ) {
      ampm = matchArray[ 5 ];
    } else {
      ampm = null
    }
//  alert( 'time: "' + hour + '" "' + minute + '" "' + second + '" "' + ampm + '"' )
 
    if ( hour < 0  || hour > 23 ) {
      alert( "Hour must be between 1 and 12. (or 0 and 23 for military time)" );
      return false;
    }
 
    if ( hour <= 12 && ( ampm == null ) ) {
      if ( confirm( "Please indicate which time format you are using.  OK = Standard Time, CANCEL = Military Time" ) ) {
        alert( "You must specify AM or PM." );
        return false;
      }
    }
 
    if  ( hour > 12 && ( ampm != null ) ) {
      alert( "You can't specify AM or PM for military time." );
      return false;
    }
 
    if ( minute < 0 || minute > 59 ) {
      alert( "Minute must be between 0 and 59." );
      return false;
    }
    timeVal = d2( hour ) + ':' + d2( minute )
//  alert( 'timeVal: ' + timeVal )
 
    if ( second && ( second < 0 || second > 59 ) ) {
      alert( "Second must be between 0 and 59." );
      return false;
    } else
      timeVal += ':' + d2( second )
//  alert( 'timeVal: ' + timeVal )
 
    if ( ampm && ( hour < 13 ) ) {
      timeVal += ' AM'
    } else if ( ampm ) {
      timeVal += ' PM'
    }
//  alert( 'timeVal: ' + timeVal )
 
    return true;
  }
 
  function dateDiff( dateform ) {
    date1 = new Date();
    date2 = new Date();
    diff  = new Date();
 
    if ( isValidDate( dateform.firstdate.value ) && isValidTime( dateform.firsttime.value ) ) { // Validates first date
//    date1temp = new Date( dateform.firstdate.value + " " + dateform.firsttime.value );
      date1temp = new Date( dateform.firstdate.value + " " + timeVal );
      date1.setTime( date1temp.getTime() );
    } else
      return false; // otherwise exits
 
    if ( isValidDate( dateform.seconddate.value ) && isValidTime( dateform.secondtime.value ) ) { // Validates second date
//    date2temp = new Date( dateform.seconddate.value + " " + dateform.secondtime.value );
      date2temp = new Date( dateform.seconddate.value + " " + timeVal );
      date2.setTime( date2temp.getTime() );
    } else
      return false; // otherwise exits
 
    // sets difference date to difference of first date and second date
 
    diff.setTime( Math.abs( date1.getTime() - date2.getTime() ) );
//  alert( 'date1: ' + date1 + '\ndate2: ' + date2 + '\ndiff: ' + diff )
 
    timediff = diff.getTime();
 
//  weeks = Math.floor( timediff / ( 1000 * 60 * 60 * 24 * 7 ) );
//  timediff -= weeks * ( 1000 * 60 * 60 * 24 * 7 );
//
//  days = Math.floor( timediff / ( 1000 * 60 * 60 * 24 ) );
//  timediff -= days * ( 1000 * 60 * 60 * 24 );
 
    hours = Math.floor( timediff / ( 1000 * 60 * 60 ) );
//  timediff -= hours * ( 1000 * 60 * 60 );
 
//  mins = Math.floor( timediff / ( 1000 * 60 ) );
//  timediff -= mins * ( 1000 * 60 );
//
//  secs = Math.floor( timediff / 1000 );
//  timediff -= secs * 1000;
 
//  dateform.difference.value = weeks + " weeks, " + days + " days, " + hours + " hours, " + mins + " minutes, and " + secs + " seconds";
//  alert( hours )
    dateform.difference.value =  hours.toFixed( 2 )
 
    return false; // form should never submit, returns false
  }
//  End -->
</script>
 
</head>
<body>
 
<center>
<form onSubmit="return dateDiff(this);">
<table>
<tr><td>
<pre>
First Date:   Date: <input type=text name=firstdate value="" size=10 maxlength=10>  (MM/DD/YYYY format)
              Time: <input type=text name=firsttime value="" size=10 maxlength=10>  (HH:MM:SS format)
 
Second Date:  Date: <input type=text name=seconddate value="" size=10 maxlength=10>  (MM/DD/YYYY format)
              Time: <input type=text name=secondtime value="" size=10 maxlength=10>  (HH:MM:SS format)
 
<center><input type=submit value="Calculate Difference!">
 
Date Difference:<br>
<input type=text name=difference value="" size=60>
</center>
</pre>
</td></tr>
</table>
</form>
</center>
 
</body>
</html>

Open in new window

Avatar of David H.H.Lee
David H.H.Lee
Flag of Malaysia image

Hi ianmeu1,
I've amended the code as given based on the questions:

1. AM/PM doesn't appear to work
- refer code, change array index for second

2. I need to remove the submit button and have it automatically update the difference field
- You can put some timer to auto calculate the different.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Time Delta</title>
 
<script type='text/javascript'>
  <!-- Original:  Ronnie T. Moore                             -->
  <!-- Web Site:  The JavaScript Source                       -->
 
  <!-- This script and many more are available free online at -->
  <!-- The JavaScript Source!! http://javascript.internet.com -->
 
  <!-- Begin
  function isValidDate( dateStr ) {
    // Date validation function courtesty of
    // Sandeep V. Tamhankar (stamhankar@hotmail.com) -->
 
    // Checks for the following valid date formats:
    // MM/DD/YY   MM/DD/YYYY   MM-DD-YY   MM-DD-YYYY
 
    var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/; // requires 4 digit year
 
    var matchArray = dateStr.match( datePat ); // is the format ok?
    if ( matchArray == null ) {
      alert( dateStr + " Date is not in a valid format." )
      return false;
    }
    month = matchArray[ 1 ]; // parse date into variables
    day   = matchArray[ 3 ];
    year  = matchArray[ 4 ];
    if ( month < 1 || month > 12 ) { // check month range
      alert( "Month must be between 1 and 12." );
      return false;
    }
    if ( day < 1 || day > 31 ) {
      alert("Day must be between 1 and 31.");
      return false;
    }
    if ( ( month == 4 || month == 6 || month == 9 || month == 11 ) && day == 31 ) {
      alert("Month "+month+" doesn't have 31 days!")
      return false;
    }
    if (month == 2) { // check for february 29th
      var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
      if (day>29 || (day==29 && !isleap)) {
        alert("February " + year + " doesn't have " + day + " days!");
        return false;
      }
    }
    return true;
  }
 
  function isValidTime( timeStr ) {
    // Time validation function courtesty of
    // Sandeep V. Tamhankar (stamhankar@hotmail.com) -->
 
    // Checks if time is in HH:MM:SS AM/PM format.
    // The seconds and AM/PM are optional.
 
    function d2( val ) {
      return ( val < 10 ) ? '0' + val : val;
    }
 
    var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;
 
    var matchArray = timeStr.match( timePat );
    if ( matchArray == null ) {
      alert( "Time is not in a valid format." );
      return false;
    }
    hour   = matchArray[ 1 ];
    minute = matchArray[ 2 ];
    
if ( matchArray[ 3 ] ) {
      second = matchArray[ 3 ]
    } else {
      second = 0
    }
 
    if ( matchArray[ 4 ] ) {
      ampm = matchArray[ 4 ];
    } else {
      ampm = null
    }
 
//  alert( 'time: "' + hour + '" "' + minute + '" "' + second + '" "' + ampm + '"' )
 
    if ( hour < 0  || hour > 23 ) {
      alert( "Hour must be between 1 and 12. (or 0 and 23 for military time)" );
      return false;
    }
 
    if ( hour <= 12 && ( ampm == null ) ) {
      if ( confirm( "Please indicate which time format you are using.  OK = Standard Time, CANCEL = Military Time" ) ) {
        alert( "You must specify AM or PM." );
        return false;
      }
    }
 
    if  ( hour > 12 && ( ampm != null ) ) {
      alert( "You can't specify AM or PM for military time." );
      return false;
    }
 
    if ( minute < 0 || minute > 59 ) {
      alert( "Minute must be between 0 and 59." );
      return false;
    }
 
    timeVal = d2( hour ) + ':' + d2( minute )
 
//  alert( 'timeVal: ' + timeVal )
 
    if ( second && ( second < 0 || second > 59 ) ) {
      alert( "Second must be between 0 and 59." );
      return false;
    } else
      timeVal += ':' + d2( second )
//  alert( 'timeVal: ' + timeVal )
 
    if ( ampm && ( hour < 13 ) ) {
      timeVal += ' AM'
    } else if ( ampm ) {
      timeVal += ' PM'
    }
//  alert( 'timeVal: ' + timeVal )
 
    return true;
  }
 
  function dateDiff() {
    date1 = new Date();
    date2 = new Date();
    diff  = new Date();
 
    if(document.getElementById('firstdate').value==''||document.getElementById('firsttime').value==''||document.getElementById('firsttime').value==''||document.getElementById('secondtime').value==''){
      return false;     
}
 
    if ( isValidDate( document.getElementById('firstdate').value ) && isValidTime( document.getElementById('firsttime').value ) ) { // Validates first date
     date1temp = new Date(  document.getElementById('firstdate').value + " " + timeVal );
      date1.setTime( date1temp.getTime() );
    } else
      return false; // otherwise exits
 
    if ( isValidDate( document.getElementById('seconddate').value ) && isValidTime( document.getElementById('secondtime').value ) ) { // Validates second date
      date2temp = new Date( document.getElementById('seconddate').value + " " + timeVal );
      date2.setTime( date2temp.getTime() );
    } else
      return false; // otherwise exits
 
    // sets difference date to difference of first date and second date
 
    diff.setTime( Math.abs( date1.getTime() - date2.getTime() ) );
 
    timediff = diff.getTime();
 
    hours = Math.floor( timediff / ( 1000 * 60 * 60 ) );
//  timediff -= hours * ( 1000 * 60 * 60 );
 
  mins = Math.floor( timediff / ( 1000 * 60 ) );
//  timediff -= mins * ( 1000 * 60 );
//
   secs = Math.floor( timediff / 1000 );
//  timediff -= secs * 1000;
 
//   document.getElementById('difference').value = weeks + " weeks, " + days + " days, " + hours + " hours, " + mins + " minutes, and " + secs + " seconds";
   
     //alert('Hours ' + hours);
     //alert('mins ' + mins);
     //alert('secs ' + secs);
 
     document.getElementById('difference').value =  hours.toFixed( 2 ) 
     
    return false; // form should never submit, returns false
  }
//  End -->
</script>
 
</head>
<body onload="setInterval('dateDiff()',3000);">
 
<center>
<form>
<table>
<tr><td>
<pre>
First Date:   Date: <input type=text name=firstdate value="" size=10 maxlength=10>  (MM/DD/YYYY format)
              Time: <input type=text name=firsttime value="" size=11 maxlength=11>  (HH:MM:SS AM/PM format)
 
Second Date:  Date: <input type=text name=seconddate value="" size=10 maxlength=10>  (MM/DD/YYYY format)
              Time: <input type=text name=secondtime value="" size=11 maxlength=11>  (HH:MM:SS AM/PM format)
 
<center><input type=submit value="Calculate Difference!">
 
Date Difference:<br>
<input type=text name=difference value="" size=60>
</center>
</pre>
</td></tr>
</table>
</form>
</center>
 
</body>
</html>

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of David H.H.Lee
David H.H.Lee
Flag of Malaysia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of ianmeu1
ianmeu1

ASKER

Nice! That works great in IE but I just noticed it's not working in FireFox? Do you think this is related to the timer to auto calculate the difference?
Avatar of ianmeu1

ASKER

I also noticed the minutes calculation doesn't work.

-Thanks for your help