Select Page

Parsing Nullish Date “0001-01-01T00:00:00Z” In Lucee CFML 5.3.8.201

Cyberdime
Published: May 20, 2022

At work, one of the APIs that I consume returns data for a Date column that didn’t always exist. And, instead of returning a null or an empty string for rows in which the value in the database is NULL, they return what I assume is a null-coalesced date: 0001-01-01T00:00:00Z. I didn’t realize that this was happening until I started to see dates in my system showing up as 2001 – which is many years before the API in question even existed. It turns out, passing a date/time mask into the parseDateTime() function is kind of important in Lucee CFML 5.3.8.201.

To be honest, I almost never have to parse dates in my ColdFusion applications. So, I have next to no instinct for edge-cases around parsing dates from strings. When I tried the parseDateTime() function with a “normal date” and without a date/time mask, it just worked. As such, I just assumed that I was good-to-go. But, there’s something about the year 0001 that is mucking-up the parsing.

Luckily, I can fix this by explicitly providing the correct date/time mask:

<cfscript>
	// My computer runs in EST, but our production servers run in UTC, so I just want to
	// set my local code to run like the production code.
	setTimezone( "Etc/UTC" );
	// This represents a "nullish" date returned by one of the APIs I consume. It's passed
	// over as a STRING, not a Date/Time value.
	nullishDate = "0001-01-01T00:00:00Z";
	dump( nullishDate );
	echo( "<hr />" );
	// Attempt to parse the nullish date with no mask.
	dump( parseDateTime( nullishDate ) );
	dump( year( parseDateTime( nullishDate ) ) );
	echo( "<hr />" );
	// Attempt to parse the nullish date with a DATE-only mask.
	dump( parseDateTime( nullishDate, "YYYY-MM-dd" ) );
	dump( year( parseDateTime( nullishDate, "YYYY-MM-dd" ) ) );
	echo( "<hr />" );
	// Attempt to parse the nullish date with a full DATE/TIME mask.
	dump( parseDateTime( nullishDate, "YYYY-MM-dd'T'HH:nn:ss'Z'" ) );
	dump( year( parseDateTime( nullishDate, "YYYY-MM-dd'T'HH:nn:ss'Z'" ) ) );
</cfscript>

In this code, I’m dumping-out the parsed date/time value as well as the year() of the parsed value, just to make sure nothing funky is happening in the rendering. And, when we run this ColdFusion code, we get the following output:

The output of the parseDateTime() calls with various masks. Inclusion of the mask yields the correct year in Lucee CFML.

As you can see, when omitting the mask, I get the incorrect year 2001. However, when including either a date-only mask or a full date/time mask, I get the correct year, 1.

ASIDE: In my production code, I’m not actually worrying about this parsing issue. Instead, I just have this conditional check:

if ( date.left( 4 ) == "0001" )

… before I attempt to parse the value as a date.

So, I guess the real lesson here is just to always provide a date/time mask to the parseDateTime() function even if the function appears to be working without it. Best not to leave anything to chance.

Want to use code from this post?
Check out the license.

Source: www.bennadel.com