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>
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 :-)
import org.joda.time.format.*;
...
public class StringAndDateUtils {
public static String yesterdayOrToday(String date) {
DateTime dateTime = DateTimeFormat.forPattern("MM/dd/yyyy").parseDateTime(date);
DateTime today = new DateTime();
DateTime yesterday = today.minusDays(1);
if (dateTime.toLocalDate().equals(today.toLocalDate())) {
return "Today " ;
} else if (dateTime.toLocalDate().equals(yesterday.toLocalDate())) {
return "Yesterday " ;
} else {
return date;
}
}
}
modelMap.addAttribute("StringAndDateUtils", new StringAndDateUtils());
<#assign date = realDateObject?string("MM/dd/yyyy")/>
${StringAndDateUtils.yesterdayOrToday(date)}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With