如何在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(...) 期望 createdOnDate。但是,您已将其初始化为createdOn = '$...',这使其成为String(用引号括起来的值)。试试&lt;#assign createdOn = receipt.arPaymDate /&gt; 【参考方案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是什么类型。

无论如何,你不应该写&lt;#assign createdOn='$receipt.arPaymDate'&gt;,而应该写&lt;#assign createdOn=receipt.arPaymDate&gt;,因为前者会将receipt.arPaymDate转换成一个字符串(当你在那里插入一个空字符串时),即使它已经是一个@987654325 @。如果它是String,那么它什么也不做,所以它是不必要的冗长。

如果receipt.arPaymDatejava.util.Date,并且您在没有'$...' 的情况下进行分配,则不需要?datetime(...) 部分,只需要?date 部分:$createdOn?date。 (如果receipt.arPaymDatejava.sql.Date,则即使?date 也可以省略,因为已知它只存储日期部分,而不是时间。)

如果receipt.arPaymDate是一个字符串,所以你必须解析它到日期,你可以写$createdOn?date("MMM dd yyyy HH:mm:ss 'GMT'Z")。模式有时间部分不是问题,?date 仍会将结果标记为仅日期值。

此外,如果不清楚,本示例中的分配是不必要的。可以写$receipt.arPaymDate?date

【讨论】:

以上是关于如何在freemarker中将日期转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中将字符串日期(2021年1月25日)转换为y-m-d日期(2021-01-01)

如何在freemarker模板中将字符串转换为数字

在 Freemarker 中将字符串转换为 JSON

无法在 Swift 中将日期转换为特定格式

如何在android中将字符串转换为日期时间[关闭]

如何在java中将日期转换为2016年2月26日[重复]