内置日期/时间/日期时间值

Page Contents

日期,时间,日期时间(当与日期/时间/日期时间值一起使用时)

这些内置函数可用于指定使用类似日期的变量的哪些部分:

理想情况下,您不需要使用这些内置插件。不幸的是,由于 Java 平台的技术局限性,FreeMarker 有时无法找出类似日期的值的哪些部分是日期,时间或日期时间。问程序员哪些变量有此问题。如果 FreeMarker 必须在需要此信息的位置执行操作(例如,将值显示为文本),但不知道正在使用哪些部件,它将停止并出现错误。这是您必须使用这些内置功能的时间。例如,假设openingTime是这样的问题变量:

<#assign x = openingTime> <#-- no problem can occur here -->
${openingTime?time} <#-- without ?time it would fail -->
<#-- For the sake of better understanding, consider this: -->
<#assign openingTime = openingTime?time>
${openingTime} <#-- this will work now -->

这些内置函数也可以用于将日期时间值转换为日期或时间。例如:

Last updated: ${lastUpdated} <#-- assume that lastUpdated is a date-time value -->
Last updated date: ${lastUpdated?date}
Last updated time: ${lastUpdated?time}

将输出类似:

Last updated: 04/25/2003 08:00:54 PM
Last updated date: 04/25/2003
Last updated time: 08:00:54 PM

如果?的左侧是字符串,则这些内置的将字符串转换为日期/时间/日期时间

date_if_unknown,time_if_unknown,datetime_if_unknown

Note:

此内置功能自 FreeMarker 2.3.21 开始存在。

内置date_if_unknowntime_if_unknowndatetime_if_unknown标记带有一些子类型的类似日期的值:分别为不带时间的日期,时间或日期时间。但是,如果该值已包含此信息,则内置无效。也就是说,它将永远不会转换值的子类型,仅在未知时才添加子类型。

iso_...

Note:

*自 FreeMarker 2.3.21 起已弃用这些内置功能,其中date_formattime_formatdatetime_format设置除了 Java SimpleDateFormat模式之外,还支持"iso"(对于 ISO 8601:2004 格式)和"xs"(对于 XML Schema 格式)。因此,可以将默认格式设置为 ISO 8601,或者一次可以使用myDate?string.iso进行 ISO 格式设置。 在这里查看更多...

这些内置函数将日期,时间或日期时间值转换为遵循 ISO 8601:2004“扩展”格式的字符串。

此内置变量有多种变体:iso_utciso_localiso_utc_nziso_local_nziso_utc_miso_utc_m_nz等。名称由以下单词按此 Sequences 构造,每个单词之间用_隔开。

请注意,自 FreeMarker 2.3.19 起,偏移量始终包含符合 XML Schema 日期/时间/ dateTime 格式的分钟。 (但是,如果主要为 XML Schema 格式生成,请使用 xs 格式.)

Example:

<#assign aDateTime = .now>
<#assign aDate = aDateTime?date>
<#assign aTime = aDateTime?time>

Basic formats:
${aDate?iso_utc}
${aTime?iso_utc}
${aDateTime?iso_utc}

Different accuracies:
${aTime?iso_utc_ms}
${aDateTime?iso_utc_m}

Local time zone:
${aDateTime?iso_local}

可能的输出(取决于当前时间和时区):

Basic formats:
2011-05-16
21:32:13Z
2011-05-16T21:32:13Z

Different accuracies:
21:32:13.868Z
2011-05-16T21:32Z

Local time zone:
2011-05-16T23:32:13+02:00

还有另一组iso_...内置变体,其中您从名称中省略了localutc单词,而是将时区指定为内置参数。例:

<#assign aDateTime = .now>
${aDateTime?iso("UTC")}
${aDateTime?iso("GMT-02:30")}
${aDateTime?iso("Europe/Rome")}

The usual variations are supported:
${aDateTime?iso_m("GMT+02")}
${aDateTime?iso_m_nz("GMT+02")}
${aDateTime?iso_nz("GMT+02")}

可能的输出(取决于当前时间和时区):

2011-05-16T21:43:58Z
2011-05-16T19:13:58-02:30
2011-05-16T23:43:58+02:00

The usual variations are supported:
2011-05-16T23:43+02:00
2011-05-16T23:43
2011-05-16T23:43:58

如果无法解释时区参数,则模板处理将错误终止。

该参数也可以是java.util.TimeZone对象(可能是 Java 方法的返回值,或者在数据模型中),而不仅仅是字符串。

字符串(当与日期/时间/日期时间值一起使用时)

此内置将日期转换为具有指定格式的字符串。

Note:

您很少需要内置此功能,因为可以在 FreeMarker 的使用 date_format,time_format 和 datetime_format 设置全局指定日期/时间/日期时间值的默认格式。仅在所需格式与通常使用的格式不同的地方使用此内置功能。对于其他地方,程序员应该在模板之外正确设置默认格式。

可以指定所需的格式,例如?string.format?string["format"](或等效的历史记录?string("format"))。这些是等效的,除了使用引号引起来的格式外,您可以在format中包括任何字符,例如空格。 format的语法与date_formattime_formatdatetime_format的配置设置完全相同; 请参阅那里的可能值的文档

示例:如果输出的语言环境是美国英语,并且时区是美国太平洋时区,并且openingTimejava.sql.TimenextDiscountDayjava.sql.Date,并且lastUpdatedjava.sql.Timestampjava.util.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 -->

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

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

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

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

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

请注意,使用自定义格式(如上面的lastUpdated?string.@fileDate),模板只能引用应用程序域的含义,并且可以在模板外部的中心位置指定确切格式。 (程序员可以阅读有关在这里定义这样的命名格式...的信息)

Warning!

不幸的是,由于 Java 平台的局限性,可能会在数据模型中出现类似日期的变量,而 FreeMarker 无法确定该变量是日期(年,月,日)还是时间。 (小时,分钟,秒,毫秒)或日期时间。在这种情况下,当您编写${lastUpdated?string.short}${lastUpdated?string.xs}之类的东西时,即没有指定要显示的确切字段的格式,或者只是使用${lastUpdated},FreeMarker 不知道如何显示该值。然后它将不得不停止错误。为防止这种情况,您可以使用内置日期,时间和日期时间帮助 FreeMarker。例如:${lastUpdated?datetime?string.short}。询问程序员数据模型的某些变量是否存在此问题,或者为了安全起见,始终使用?date?time?datetime内置函数。

Note:

您永远不需要将__,?time?datetime"yyyy.MM.dd HH:mm"之类的格式模式一起使用,因为使用该模式,您可以告诉 FreeMarker 显示日期的哪一部分。但是,FreeMarker 会盲目地信任您,因此,如果您显示实际上没有存储在变量中的 Component,则可以显示“噪音”。例如,${openingTime?string["yyyy-MM-dd hh:mm:ss a"]}(其中openingTime仅存储时间)将显示1970-01-01 09:24:44 PM

为避免误解,格式不必是字符串 Literals,它可以是变量或任何其他表达式,只要其结果为字符串即可。例如,它可以像"..."?string[myFormat]

另请参阅:日期插值

上一章 首页 下一章