Freemarker 将以毫秒为单位的时间戳转换为带时区的日期

Freemarker convert timestamp in milliseconds to date with time zone

我可以使用以下格式将毫秒转换为日期:

${createdTime?number_to_datetime?string("yyyy-MM-dd HH:mm:ss")}

输出为:2021-07-22 11:02:38

现在我想给它加一个时区Asia/Colombo,请问有什么办法可以给freemarker number_to_datetime格式加一个时区吗?

从 2.3.31 开始,您不能直接将时区传递给 ?string。 (你可以 ?iso(timeZone) 和它的朋友,但那些输出只有 ISO 格式。)

但是,您可以使用 <#setting time_zone='Asia/Colombo'> 更改时区。之后,所有内容都将在该时区进行格式化(我的意思是在同一顶级模板执行期间)。虽然这可能是不需要的,但您想将其改回原来的样子。在那种情况下,想法是这样的:

<#macro withTimeZone tz>
  <#local lastTZ = .time_zone>
  <#setting time_zone = tz>
  <#nested>
  <#setting time_zone = lastTZ>
</#macro>

现在您可以这样做了:

<@withTimeZone "Asia/Colombo">${.now?string('yyyy-MM-dd HH:mm:ss')}</@>

当然你也可以用这个包围一个更大的模板部分。

请注意,.time_zone 是在 FreeMarker 2.3.31 中添加的。