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
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>
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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?
ASKER
I also noticed the minutes calculation doesn't work.
-Thanks for your help
-Thanks for your help
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.
Open in new window