如何在freemarker中将日期转换为字符串?
Posted
技术标签:
【中文标题】如何在freemarker中将日期转换为字符串?【英文标题】:How to convert date to string in freemarker? 【发布时间】:2018-04-20 19:08:48 【问题描述】:我是这样做的..
<#assign createdOn='$receipt.arPaymDate'>
$createdOn?datetime("MMM dd yyyy HH:mm:ss 'GMT'Z")?date
但我正在执行以下操作
无法将类似日期的值转换为字符串,因为不知道是否 它是日期(无时间部分)、时间或日期时间值。被指责的 表达式:==>receipt.arPaymDate [在模板中 “WEB-INF/ftl/receiptPdf.ftl”在第 22 行第 47 列]
谢谢你
【问题讨论】:
这几乎不是示例中的错误消息,因为您使用的是?date
,所以 FreeMarker 会知道它是一个仅限日期的值。
$createdOn?datetime(...)
期望 createdOn
是 Date
。但是,您已将其初始化为createdOn = '$...'
,这使其成为String
(用引号括起来的值)。试试<#assign createdOn = receipt.arPaymDate />
。
【参考方案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
【讨论】:
@wodong 谢谢,我做了一点修改,这对我来说很重要,谢谢 这个答案有问题:在分配中不必要地使用'$...'
,以及不必要地使用?datetime
和?date
。但请看我的回答。【参考方案2】:
这取决于receipt.arPaymDate
是什么类型。
无论如何,你不应该写<#assign createdOn='$receipt.arPaymDate'>
,而应该写<#assign createdOn=receipt.arPaymDate>
,因为前者会将receipt.arPaymDate
转换成一个字符串(当你在那里插入一个空字符串时),即使它已经是一个@987654325 @。如果它是String
,那么它什么也不做,所以它是不必要的冗长。
如果receipt.arPaymDate
是java.util.Date
,并且您在没有'$...'
的情况下进行分配,则不需要?datetime(...)
部分,只需要?date
部分:$createdOn?date
。 (如果receipt.arPaymDate
是java.sql.Date
,则即使?date
也可以省略,因为已知它只存储日期部分,而不是时间。)
如果receipt.arPaymDate
是一个字符串,所以你必须解析它到日期,你可以写$createdOn?date("MMM dd yyyy HH:mm:ss 'GMT'Z")
。模式有时间部分不是问题,?date
仍会将结果标记为仅日期值。
此外,如果不清楚,本示例中的分配是不必要的。可以写$receipt.arPaymDate?date
。
【讨论】:
以上是关于如何在freemarker中将日期转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章