Parsing Http Time Strings With ParseDateTime() In ColdFusion
This is a super minor post; but, last week, when I was working on Sticky CDN, I remembered that the parseDateTime() function, in ColdFusion, could parse the date/time strings commonly used in HTTP headers. parseDateTime() won't take the timezone information into account; but, it will parse the date and time portions properly.
To see this in action, I've got a demo that takes my local development time (EST), generates the Http Time String, then parses it (as UTC), and converts it back to local time:
<cfscript>
/**
* I output the date with both date and time portions formatted.
*
* @output false
*/
public string function outputTime( required date input ) {
return(
dateFormat( input, "Mmm d, yyyy" ) &
" at " &
timeFormat( input, "h:mm:ss TT" )
);
}
// ------------------------------------------------------ //
// ------------------------------------------------------ //
// Get the current time on my local development machine (EST).
easternTime = now();
// Get the given time, converted to UTC, in a format according to (documentation):
// ---
// "HTTP standard described in RFC 1123 and its underlying RFC, 822. This format is
// commonly used in Internet protocols, including HTTP."
httpTime = getHttpTimeString( easternTime );
// Now, try to parse it back into a date (UTC).
parsedTime = parseDateTime( httpTime );
// And, convert the UTC date back to my local development time.
localTime = dateConvert( "utc2local", parsedTime );
// Output results.
writeOutput( "Http Time: #httpTime#<br />" );
writeOutput( "- - - -<br />" );
writeOutput( "Original Time: #outputTime( easternTime )#<br />" );
writeOutput( "Parsed Time: #outputTime( parsedTime )#<br />" );
writeOutput( "Local Time: #outputTime( localTime )#<br />" );
</cfscript>
When I run the above code, I get the following output:
Http Time: Mon, 04 Aug 2014 11:00:35 GMT
- - - -
Original Time: Aug 4, 2014 at 7:00:35 AM
Parsed Time: Aug 4, 2014 at 11:00:35 AM
Local Time: Aug 4, 2014 at 7:00:35 AM
Again, the parseDateTime() function won't take the timezone into account; so, if I were to replace "GMT" with "EST" before parsing it, nothing would change. But, since the standard seems to be that HTTP headers are all in UTC/GMT time, then you simply need to convert the parsed time to your local time (if so desired).
Want to use code from this post? Check out the license.
Reader Comments
This code will work in most versions of ColdFusion. You could shorten the code a bit by using the DateTimeFormat() function in CF10 and CF11.
@Brian,
It's funny you mention that. I actually started off trying to use the dateTimeFormat(). But, I was getting a really odd output. I had a mask that was something link:
"Mmm d, yyyy 'at' h:nn:ss TT"
... but the 'at' kept getting converted to 'p'. Not sure why. Even the examples in the docs use the '' notation to escape portions of the mask. It had me flummoxed - I couldn't figure it out, so just reverted to something more manual.