Formatting Date in Freemarker to say "Today", "Yesterday", etc

date, format, freemarker

Solution

As the question is quite old i guess the problem vanished but anyhow, I just did it like this:

<#assign diff = (mydate?long / 86400000)?round - (.now?long / 86400000)?round />

.now is a buildin, 86400 is a constant every programmer might know and if you arent put off by ugly looks this gives you a integer diff of days. today is 0, yesterday is -1 etc.

If you would want to make ?is_today work there is a way to extend the freemarker language by implementing a TemplateDirectiveModel as outlined here:

http://freemarker.sourceforge.net/docs/pgui_datamodel_directive.html

but i dont know yet how to actually add it to available options with the ?... notation :-)

Problem

Is there a way in freemarker to compare dates to test if the date is today or yesterday... or do I have to write code in Java to do these tests? I basically want to do this: ``` <#------------------------------------------------------------------------------ formatDate -------------------------------------------------------------------------------> <#macro formatDate date showTime=true> <#if date??> <span class="Date"> <#if date?is_today> Today <#elseif date?is_yesterday> Yesterday <#else> ${date?date} </#if> </span> <#if showTime> <span class="Time">${date?time}</span> </#if> </#if> </#macro> ``` EDIT: My best guess to implement this is to pass "today" and "yesterday" into the model for the pages that use this function and then compare the date values against these 2 objects in the model. I am out of out of options, but I'd rather not have to do this for every page that uses this macro. Any other options that are nicer? ``` <#if date??> <span class="Date"> <#if date?date?string.short == today?date?string.short> Today <#elseif date?date?string.short == yesterday?date?string.short> Yesterday <#else> ${date?date} </#if> </span> <#if showTime> <span class="Time">${date?time}</span> </#if> </#if> ```

Original source