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.
Want to use code from this post? Check out the license.
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?