Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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>
like image 981
egervari Avatar asked Dec 05 '22 00:12

egervari


2 Answers

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 :-)

like image 75
da maddin Avatar answered Jan 12 '23 21:01

da maddin


1. Create utility class with following method:

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;
        }
    }
}

2. In your controller add the Class to your model:

modelMap.addAttribute("StringAndDateUtils", new StringAndDateUtils());

3. On your .FTL pages use the method like this:

<#assign date = realDateObject?string("MM/dd/yyyy")/>  
${StringAndDateUtils.yesterdayOrToday(date)}
like image 39
MatBanik Avatar answered Jan 12 '23 21:01

MatBanik