Форматирование даты во Freemarker с указанием «Сегодня», «Вчера» и т. Д. - PullRequest
3 голосов
/ 07 декабря 2010

Есть ли в freemarker способ сравнить даты, чтобы проверить, является ли дата сегодняшней или вчерашней ... или мне нужно написать код на Java для этих тестов?

Я в основном хочу сделать это:

<#------------------------------------------------------------------------------
 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>

РЕДАКТИРОВАТЬ: Моя лучшая догадка для реализации этого состоит в том, чтобы передать "сегодня" и "вчера" в модель для страниц, которые используют эту функцию, а затем сравнить значения даты с этими 2 объектами в модели , У меня нет выбора, но я бы предпочел не делать это для каждой страницы, которая использует этот макрос. Любые другие варианты, которые лучше?

<#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>

Ответы [ 4 ]

10 голосов
/ 27 ноября 2012

Поскольку вопрос довольно старый, я думаю, что проблема исчезла, но в любом случае, я просто сделал это так:

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

.now - это сборка, 86400 - это константа, которую может знать каждый программист, и если вас не пугает уродливый взгляд, это дает вам целое число дней. сегодня 0, вчера -1 и т. д.

Если вы хотите заставить? Is_today работать, есть способ расширить язык freemarker, реализуя TemplateDirectiveModel, как показано здесь:

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

но я пока не знаю, как на самом деле добавить его к доступным опциям с пометкой? ...: -)

2 голосов
/ 08 января 2011

1. Создайте служебный класс с помощью следующего метода:

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. В вашем контроллере добавьте класс к вашей модели:

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

3. На ваших страницах .FTL используйте такой метод:

<#assign date = realDateObject?string("MM/dd/yyyy")/>  
${StringAndDateUtils.yesterdayOrToday(date)}
1 голос
/ 05 марта 2011

Вы можете преобразовать строку в целое число (следите за ролловерами!) И сравнить в соответствии с http://sourceforge.net/projects/freemarker/forums/forum/2345/topic/3027925?message=6479650

Будьте осторожны, не превышайте максимальное значение типа int, если добавляете дополнительные цифры, например, в миллисекундах.

(из приведенной выше ссылки)

[#assign  Adate = myDateA?string("yyyyMMdd")?number?int ]
[#assign  Atime = myDateA?string("HHmmss")?number?int ]
[#assign  Bdate = myDateB?string("yyyyMMdd")?number?int ]
[#assign  Btime = myDateB?string("HHmmss")?number?int ]

То, что я сделал, - это создание TemplateMethodModel для сравнения дат (Примечание.1011 * В шаблоне я называю его следующим образом:

[#if compareDate(now?string("yyyyMMddHHmmss"),"<", program.resStartDateTime?string("yyyyMMddHHmmss"))]

К вашему сведению, "сейчас" - это объект DateModel, добавленный перед обработкой шаблона.

model.put("now", new DateModel(new Date(), BeansWrapper.getDefaultInstance()));

TemplateMethodModel можно сделать более общимпутем передачи строки синтаксического анализа в качестве аргумента и создания средства форматирования даты при выполнении.

0 голосов
/ 12 июня 2015

$ {houradd (дата, 24)? Строка ("гггг-ММ-дд ЧЧ: мм: сс")}

$ {houradd (дата, -24)? Строка ("гггг-ММ-дд ЧЧ: мм: сс ")}

$ {dayadd (дата, 1)? строка (" гггг-мм-дд ЧЧ: мм: сс ")}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...