After my post yesterday on date math, someone sent me a question about IsDate() vs. IsNumericDate(). I briefly touch on the use of IsNumericDate() to determine if you have a numeric date, but I was not clear on exactly how it works. IsDate() takes a date/time object. IsNumericDate() takes a number. There are some caveats here. Since IsNumericDate() requires a number, if you send it a date/time object, ColdFusion will automatically convert the date/time object to a number, therefore allowing it to work. IsDate(), on the other hand, takes a date/time object and will NOT be true if passed a number, even if that number represents a date.
Take a look at this example:
<!--- Get date/time object. ---> <cfset dtNow = Now() /> <!--- Get NUMERIC date value. ---> <cfset flNow = (dtNow * 1) /> <!--- Output the date and test methods. ---> #DateFormat( dtNow )# - #IsDate( dtNow )# - #IsNumericDate( dtNow )# <!--- Output the numeric date and test methods. ---> #DateFormat( flNow )# - #IsDate( flNow )# - #IsNumericDate( flNow )#
In that second line, just notice that I am multiplying the date by 1. This forces ColdFusion to convert the date/time object to a number. The code produces this output:
30-Aug-06 - YES - YES
30-Aug-06 - NO - YES
As you can see, a standard date/time object will return true for BOTH IsDate() and IsNumericDate(). A numeric date will return true for IsNumericDate(), but FALSE for IsDate(). Sorry if I was unclear about this before. As a safe guard, if you are working on a page where you might be working with numeric dates, I would recommend always using IsNumericDate() as it will give you the most useful responses.
Ben, this article completely solved the issue I was having. Thanks for the great work, keep it up!
One note: am I misreading the CF :iveDocs, or does their note on the isDate() function specifically say it WILL work when passed a string, which obviously isn't the case since it needs a date object?
isDate() will work with a string - but, it won't work with a string that represents a number... is what I think they are saying. So, for example, this will return false:
isDate( "123" )
... but this will return true:
isDate( "jun 1, 2010" )
... both of which are strings. Of course, I might be misunderstanding what the docs are saying.
I'm running into a situation where isDate is returning true when being run against decimal numbers. Should 34.5 really equal 12/31/2013?