Freemarker распечатать дату в шаблоне - PullRequest
9 голосов
/ 20 мая 2011

Я пытаюсь напечатать текущую дату, когда шаблон активирован. Я прочитал, что мне нужно передать новый Java-объект Date () в шаблон, но я не знаю, как это сделать или где поместить его в код.

Кто-нибудь знает, как передать объект Java в шаблон в этом случае?

Спасибо !!

Ответы [ 3 ]

11 голосов
/ 22 мая 2011

На самом деле вам не нужно передавать new Date() в шаблон, потому что размещение метки времени в выводе шаблона довольно распространено, и поэтому FreeMarker предоставляет специальную переменную , которая называется .now, которая возвращаеттекущая дата и время.Вы можете использовать его в своем шаблоне следующим образом:

Page generated: ${.now}

(FreeMarker также содержит различные встроенные модули для форматирования дат: http://freemarker.org/docs/ref_builtins_date.html)

Обновление: работает только с последней версией FreeMarker, 2.3.17 .

3 голосов
/ 18 октября 2012

Используйте API-интерфейс ObjectConstructor *1002* для Freemarker, чтобы создать объект календаря и объект форматирования, а затем объедините их для печати даты:

<#-- Create constructor object -->
<#assign objectConstructor = "freemarker.template.utility.ObjectConstructor"?new()>

<#-- Call calendar constructor -->
<#assign clock = objectConstructor("java.util.GregorianCalendar")>

<#-- Call formatter constructor -->
<#assign mmddyy = objectConstructor("java.text.SimpleDateFormat","MM/dd/yyyy")>

<#-- Call getTime method to return the date in milliseconds-->
<#assign date = clock.getTime()>

<#-- Call format method to pretty print the date -->
<#assign now = mmddyy.format(date)>

<#-- Display date -->
${now}

Встроенная ?new, как это было реализовано, была дырой в безопасности. Теперь он позволяет только создавать экземпляр объекта Java, который реализует интерфейс freemarker.template.TemplateModel. Если вы хотите, чтобы функциональность новой встроенной функции существовала в предыдущих версиях, сделайте доступным экземпляр класса freemarker.template.utility.ObjectConstructor для вашего шаблона. Например:

myDataModel.put("objConstructor", new ObjectConstructor());

и затем в шаблоне вы можете сделать это:

<#assign aList = objConstructor("java.util.ArrayList", 100)>)

Ссылки

1 голос
/ 25 апреля 2017

${.now} является идеальным ответом. Просто хотел добавить несколько других способов получения прямых значений от даты

#-- Predefined format names: -->

${openingTime?string.short}
${openingTime?string.medium}
${openingTime?string.long}
${openingTime?string.full}
${openingTime?string.xs} <#-- XSD xs:time -->
${openingTime?string.iso} <#-- ISO 8601 time -->

${.now?string.short}
${.now?string.medium}
${.now?string.long}
${.now?string.full}
${.now?string.xs} <#-- XSD xs:date -->
${.now?string.iso} <#-- ISO 8601 date -->

${.now?string.short}
${.now?string.medium}
${.now?string.long}
${.now?string.full}
${.now?string.medium_short} <#-- medium date, short time -->
${.now?string.xs} <#-- XSD xs:dateTime -->
${.now?string.iso} <#-- ISO 8601 combined date and time -->

<#-- Programmer-defined named format (@ + name): -->
${.now?string.@fileDate}

<#-- Advanced ISO 8601 and XSD formatting: -->
${.now?string.iso_m_u}
${.now?string.xs_ms_nz}

<#-- SimpleDateFormat patterns: -->
${.now?string["dd.MM.yyyy, HH:mm"]}
${.now?string["EEEE, MMMM dd, yyyy, hh:mm a '('zzz')'"]}
${.now?string["EEE, MMM d, ''yy"]}
${.now?string.yyyy} <#-- Same as ${.now?string["yyyy"]} -->

выдаст

01:45 PM
01:45:09 PM
01:45:09 PM PST
01:45:09 PM PST
13:45:09-08:00
13:45:09-08:00

2/20/07
Apr 20, 2007
April 20, 2007
Friday, April 20, 2007
2007-02-20-08:00
2007-02-20

2/20/07 01:45 PM
Feb 20, 2007 01:45:09 PM
February 20, 2007 01:45:09 PM PST
Friday, February 20, 2007 01:45:09 PM PST
Feb 8, 2003 9:24 PM
2007-02-20T13:45:09-08:00
2007-02-20T13:45:09-08:00

Apr/20/2007 13:45

2007-02-20T21:45Z
2007-02-20T13:45:09.000

08.04.2003 21:24
Tuesday, April 08, 2003, 09:24 PM (PDT)
Tue, Apr 8, '03
2003
...