Freemarker print date in template

前端 未结 3 1956
难免孤独
难免孤独 2021-02-08 10:10

I am trying to print the current date when the template is activated. I have read that I have to pass a new Date() Java object to the template, but I don\'t know how to do that

相关标签:
3条回答
  • 2021-02-08 10:14

    Actually you don't have to pass a new Date() to your template, because placing a timestamp into a template's output is quite common and therefore FreeMarker provides a special variable called .now which returns the current date and time. You can use it in your template like this:

    Page generated: ${.now}
    

    (FreeMarker also contains different built-ins for formatting dates: http://freemarker.org/docs/ref_builtins_date.html)

    Update: Works only with the latest version of FreeMarker, 2.3.17.

    0 讨论(0)
  • 2021-02-08 10:23

    ${.now} is the perfect answer. Just wanted to add few other ways to get direct values from date

    #-- 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"]} -->
    

    will output

    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
    
    0 讨论(0)
  • 2021-02-08 10:30

    Use the ObjectConstructor API of Freemarker to create a calendar object and a formatter object, then combine the two to print the date:

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

    The ?new built-in, as it was implemented, was a security hole. Now, it only allows you to instantiate a java object that implements the freemarker.template.TemplateModel interface. If you want the functionality of the ?new built-in as it existed in prior versions, make available an instance of the freemarker.template.utility.ObjectConstructor class to your template. For example:

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

    and then in the template you can do this:

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

    References

    • Freemarker 2.3: Version History

    • Tag Developers Guide: Freemarker

    • CRUD Operations using Servlet and FreeMarker Template Engine

    0 讨论(0)
提交回复
热议问题