Freemarker 在模板中打印日期

Posted

技术标签:

【中文标题】Freemarker 在模板中打印日期【英文标题】:Freemarker print date in template 【发布时间】:2011-08-29 21:21:25 【问题描述】:

我正在尝试打印模板激活时的当前日期。我已经读到我必须将一个新的 Date() Java 对象传递给模板,但我不知道该怎么做或将它放在代码中的什么位置。

有人知道在这种情况下如何将 Java 对象传递给模板吗?

谢谢!!

【问题讨论】:

【参考方案1】:

实际上,您不必将 new Date() 传递给您的模板,因为在模板的输出中放置时间戳是很常见的,因此 FreeMarker 提供了一个名为 .now 的 special variable,它返回当前日期和时间。您可以像这样在模板中使用它:

Page generated: $.now

(FreeMarker 还包含用于格式化日期的不同内置函数:http://freemarker.org/docs/ref_builtins_date.html

更新:仅适用于最新版本的 FreeMarker,2.3.17。

【讨论】:

感谢您的回答,但我收到此错误:ParseException: Unknown built-in variable: now 我的做法是使用 $content.metaData.modificationDate?string.short。 content.metaData.modificationDate 为我提供了该模板的最后一次修改,这正是我所需要的。 特殊变量.now 是在大约一周前发布的2.3.17 版本中引入的(参见freemarker.org/docs/versions_2_3_17.html)。如果您无法更新,则必须将当前日期传递给数据模型,例如作为根 hashmap 的一部分(如果您还不了解这些内容,请参阅 freemarker.org/docs/pgui_quickstart_createdatamodel.html 和 freemarker.org/docs/pgui_quickstart_merge.html 了解详细信息)。【参考方案2】:

使用 Freemarker 的ObjectConstructor API 创建日历对象和格式化程序对象,然后将两者结合起来打印日期:

<#-- 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 在实现时是一个安全漏洞。现在,它只允许您实例化一个实现freemarker.template.TemplateModel 接口的java 对象。如果您想要以前版本中存在的 ?new 内置功能,请为您的模板提供一个 freemarker.template.utility.ObjectConstructor 类的实例。例如:

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

然后在模板中你可以这样做:

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

参考文献

Freemarker 2.3: Version History

Tag Developers Guide: Freemarker

CRUD Operations using Servlet and FreeMarker Template Engine

【讨论】:

@mateen 没问题。希望它能节省您的时间。【参考方案3】:

$.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

Source

【讨论】:

不错(实际上不是)从官方文档中复制粘贴。你至少可以插入link 我是从教程里拿的,我一般放链接,不知道为什么我错过了这个

以上是关于Freemarker 在模板中打印日期的主要内容,如果未能解决你的问题,请参考以下文章

在 Freemarker 中打印日期天数差异时出错

freemarker模板中的日期格式问题

在 Netsuite Advanced PDF 模板中使用 Freemarker 语法进行日期翻译

在 Freemarker 中使用 NetSuite 日期

FreeMarker 当前日期比较

如何从 Freemarker 中的模板数据映射对象递归打印数据?