如何在freemarker中将日期转换为字符串?

时间:2017-11-08 07:28:55

标签: java freemarker

我这样做了..

<#assign createdOn='${receipt.arPaymDate}'>
${createdOn?datetime("MMM dd yyyy HH:mm:ss 'GMT'Z")?date}

但我正处于执行之下

  

无法将类似日期的值转换为字符串,因为它不知道是否已知   它是一个日期(没有时间部分),时间或日期时间值。归咎于   表达式:==&gt; receipt.arPaymDate [在模板中   &#34; WEB-INF / FTL / receiptPdf.ftl&#34;在第22行,第47栏

感谢advened

2 个答案:

答案 0 :(得分:1)

您可能需要先初始化日期格式

<#setting date_format="dd-MM-yyyy">

<#assign createdOn='${receipt.arPaymDate}'> 
${createdOn?datetime("MMM dd yyyy HH:mm:ss 'GMT'Z")?date}

另见How to convert date in specific format in Freemarker template or javascript

答案 1 :(得分:0)

这取决于receipt.arPaymDate的类型。

在任何情况下,你都不应该写<#assign createdOn='${receipt.arPaymDate}'>,而是<#assign createdOn=receipt.arPaymDate>,因为前者将receipt.arPaymDate转换为字符串(当你在那里插入一个空字符串时),即使它已经是java.util.Date。如果它是String,那么它什么都不做,所以它是不必要的冗长。

如果receipt.arPaymDatejava.util.Date,并且您在没有'${...}'的情况下执行作业,那么您不需要?datetime(...)部分,只需要{{1} }} 第1部分}}。 (如果?date${createdOn?date},即使?date也可以省略,因为已知只存储日期部分,而不是时间。)

如果receipt.arPaymDate是一个字符串,那么你必须解析它到目前为止,你可以写java.sql.Date。模式具有时间部分不是问题,receipt.arPaymDate仍会将结果标记为仅限日期的值。

此外,如果不清楚,此示例中的分配是不必要的。人们可以写${createdOn?date("MMM dd yyyy HH:mm:ss 'GMT'Z")}