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

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

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

谢谢!!

【问题讨论】:

    标签: templates datetime freemarker pojo pretty-print


    【解决方案1】:

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

    Page generated: ${.now}
    

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

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

    【讨论】:

    【解决方案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)>)
    

    参考文献

    【讨论】:

    • @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
    • 我是从教程里拿的,我一般放链接,不知道为什么我错过了这个
    猜你喜欢
    • 1970-01-01
    • 2014-10-28
    • 2019-02-17
    • 2014-07-11
    • 2013-11-18
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多