Or you can change your CFML code to get around the problem, as I also discuss below.
[Update: Adobe did offer this "fix" also in the March 2021 release of CF2021 Update 1. As such, you no longer need to obtain the fix jar file discussed below. But the rest of the information applies. Again, the update does NOT change the change DEFAULT behavior. You still need to add the JVM arg discussed, if you want to do that.]
For more on the problem, see see my recent post on the issue. For more on the fix, see that Adobe technote or read on for some additional details.
BackgroundTwo weeks ago, I shared that other blog post reporting a problem discovered with CF2021, where a new Dateformat mask of D had been added, for "day of year" (for the dateformat and lsdateformat functions, perhaps among others.)
That would be fine, except that CF had traditionally not paid attention to the case of datemask values. So with this change, existing code that might refer, for example, to a dateformat mask of "MM-DD-YYYY" would produce today a date of "12-342-2020". With the fix implemented, the mask would produce instead a date (today) of 12-07-2020.
Of course, another way to get the "correct" date would be to change the dateformat mask to use a lowercase d, as in "mm-dd-yyyy".
Implementing the hotfix
[Update Mar 2021: As of the release of CF2021 update 1, in Mar 2021, you no longer need the "special hotfix jar" discussed in this section. That's rolled into Update 1 and above. But you DO still need to add the JVM arg, if you want to tell CF to revert its behavior of the D dateformat arg to how it worked before CF2021. The CF update does NOT revert the behavior for you. Proceed with point 3 below.]
There are three relatively simple steps to cause this new/corrected behavior, as documented in the aforementioned Adobe technote:
Download the hotfix jar. (This step and the next one will likely not be needed once the first formal CF2021 "update" comes out. Indeed, this link may fail to work soon after that first formal CF2021 update, in which case just skip here to step 3.)Again, this is now no longer needed after update 1 of CF2021.) Place this jar file into the cfusion/lib/updates folder within CF2021.
- Add the following JVM argument to CF's jvm arguments: -Dcoldfusion.datemask.useDasdayofmonth=truewhether by editing those in the CF Admin "Java & JVM" page, or edit the jvm.config, found in the cfusion/bin folder within CF2021. (The latter option is safer, as you can more easily save a backup of the file and revert it, if you make any mistake.)
If you have created another instance, using the Instance Manager feature in the CF Admin in the Enterprise, Trial, or Developer edition, you would need to repeat those steps for that instance, with regard to its own folder as a sibling to cfusion, as well as its own CF Admin.
Finally, I mentioned above that the jar will not likely need to be updated once the first real "update" to CF2021 comes out. Similarly, it's likely that the update would also remove that jar file, so you need not to bother. I discuss this matter of applying such "special hotfixes" in this blog post.
Is there any way to easily change all my code instead?
Some readers may either be unable to implement this fix, and/or change their JVM args, or for some other reason may rather fix their code (to change their use of D to d) rather than rely on this Adobe "fix".
I will point out that in the comments to my previous post on the matter, there were a few commenters who offered regular expressions that you could use in any of various editors, to find and replace these troublesome dateformat usages. In particular, see comments there first from Scott Steinbeck and then from Curtis Fraser, as well as the couple of comments before and after each that relate to the use of such regex's in different IDEs/editors. Thanks, guys!
What if I DO want to use "D" for "day of year"
Of course, if you ever DO want to use D as "day of year", you'd want to either remove that JVM argument or set its value to "false".
Just know then that you must then be sure to find and correct any references to "D" in dateformat masks which you really mean to mean to return "day of month". See the previous section.
Great to see Adobe respond to this issue so quickly.
And while we can lament that they didn't anticipate this issue previously, see my first post for a couple of points to keep in mind in that regard: first, the "D" value is a long-valid Java date mask for "day of year" (which CF was only finally implementing), and second, Lucee has the same "problem" of currently ignoring the case of dateformat masks (so that they'd have the same issue if they ever tried to implement this "D" mask value.
For more content like this from Charlie Arehart:
Need more help with problems?
- Signup to get his blog posts by email:
- Follow his blog RSS feed
- View the rest of his blog posts
- View his blog posts on the Adobe CF portal
- If you may prefer direct help, rather than digging around here/elsewhere or via comments, he can help via his online consulting services
- See that page for more on how he can help a) over the web, safely and securely, b) usually very quickly, c) teaching you along the way, and d) with satisfaction guaranteed