While working on a web application, I found myself with the need for a Javascript function that would format dates to a consistent state. Several different functions exist out on the internet to perform this task, but none were exactly what I was looking for. Most of them did a fairly decent job of taking a time like ‘6:45′ and plugging the am or pm onto the end. Some even allowed military time so ’20:30’ would convert to ‘8:30 pm’. What I really needed was one that could format a time entered in a normal fashion, but also format if I enter a time like ‘0645’ or ‘2315’. So, I wrote my own.
There is one support function required. It is a Javascript method that has the same function as VBScript Trim. The way the application is set up, a blank time is valid; so the script allows for a blank field. If a space is entered into the field, this function blanks it out. I found the function TrimString here.
function TrimString(sInString) { sInString = sInString.replace( /^s+/g, "" );// strip leading return sInString.replace( /s+$/g, "" );// strip trailing }
And, here is the main function. To use it, add ‘javascript:formattime(this)’ to the onBlur field for an input field.
function formattime(control)
{
var minhour = 6; //This and higher is considered ‘am’
var timevalue = new String(control.value);
var errvalue = new String(“”);
var minutes = new String(“”);
var hours = new String(“”);
var ampm = new String(“”);
if (timevalue == “”)
{
errvalue = “Blank”;
}
if (timevalue.indexOf(“:”)!=-1)
/* This is a ‘normal’ time. Split it out as necessary. */
{
var tempArray = timevalue.split(“:”);
hours = tempArray[0];
if (isNaN(hours))
/* First split is not a valid number, crash out */
{
errvalue = “Yes”;
}
else
{
/* Make sure the number is between 0 and 23 */
if ((hours > 23) || (hours < 0))
{
errvalue = "Yes";
}
else
{
if (hours > 12)
{
hours = hours – 12;
ampm = “pm”;
}
else if (hours == 12)
{
ampm = “pm”;
}
else if (hours == 0)
{
ampm = “am”;
hours = 12;
}
else
{
if (hours < minhour)
{
ampm = "pm";
}
else
{
ampm = "am";
}
hours = hours;
}
}
}
/* Gen the minutes */
minutes = tempArray[1];
if (minutes.indexOf("a") > -1)
{
ampm = “am”;
minutes = parseInt(minutes);
}
else if (minutes.indexOf(“p”) > -1)
{
ampm = “pm”;
minutes = parseInt(minutes);
}
else
{
minutes = parseInt(minutes);
}
/* Make sure the minutes are in a valid range (00-59) */
if (isNaN(minutes))
{
errvalue = “Yes”;
minutes = 0; //Just to make sure for later
}
else
{
if ((minutes <0) || (minutes > 59))
{
minutes = 0;
errvalue = “Yes”;
}
else
{
//Minutes is valid
if (minutes < 10)
{
minutes = "0" + String(minutes);
}
else
{
minutes = minutes;
}
}
}
}
else
/* Have to work a little harder */
{
if (isNaN(timevalue))
{
errvalue = "Yes";
}
else
{
if ((timevalue.length == 3) || (timevalue.length ==4))
{
//Get the minutes
minutes = timevalue.substr((timevalue.length -2), 2);
if ((minutes >= 0) && (minutes < 60))
{
//Ignore this
}
else
{
errvalue = "Yes";
}
//Get the hours
hours = timevalue.substr(0, (timevalue.length - 2));
if ((hours < 0) || (hours > 23))
{
errvalue = “Yes”;
}
if (hours < 10)
{
if (timevalue.substr(0,1)=="0")
{
if (hours == 0)
{
ampm = "am";
hours = 12;
}
else
{
ampm = "am";
}
}
else
{
if (hours < minhour)
{
ampm = "pm";
}
else
{
ampm = "am";
}
}
}
else
{
if ((hours == 10) || (hours == 11))
{
ampm = "am";
}
else if (hours == 12)
{
ampm = "pm";
}
else
{
ampm = "pm";
hours = hours - 12;
}
}
}
else
{
errvalue = "Yes";
}
}
}
if (errvalue!="")
/* There was an error */
{
if (TrimString(control.value)!="")
{
alert("You appear to have entered an invalid time. Please correct it.");
control.select();
control.focus();
}
}
else
{
control.value = (hours * 1) + ":" + minutes + " " + ampm;
}
}[/js]
Thanks, saved me some time :)
Richard.