You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Alfresco 5.0d CE中FreeMarker无法插值NativeDate类型日期值求助

解决Alfresco 5.0d CE中FreeMarker模板处理NativeDate的问题

这个问题我之前在Alfresco开发中也碰到过——本质是FreeMarker只识别Java标准的java.util.Date(或Calendar)类型,而org.mozilla.javascript.NativeDate是Rhino JavaScript引擎的日期对象,FreeMarker既不会自动转换它,也无法对其使用?date/?time/?datetime这些内置方法,所以直接插值才会输出对象的toString形式。

给你两种靠谱的解决办法:

方法1:在Web脚本控制器中转换为Java Date

如果你的Web脚本用的是JavaScript控制器,直接把NativeDate转换成Java标准Date再传入模型是最稳妥的方式:

// JavaScript控制器代码示例
// 假设var.startDate是你的NativeDate对象
var javaStartDate = new java.util.Date(var.startDate.getTime());
model.startDate = javaStartDate;

之后在FreeMarker模板里就能正常使用日期格式化功能了:

<!-- 格式化完整日期时间 -->
${startDate?datetime('yyyy-MM-dd HH:mm:ss')}

<!-- 仅显示日期部分 -->
${startDate?date('yyyy-MM-dd')}

<!-- 仅显示时间部分 -->
${startDate?time('HH:mm:ss')}

方法2:直接在FreeMarker模板内转换

如果不想修改控制器代码,也可以在模板里直接处理NativeDate。利用NativeDate的getTime()方法获取时间戳,再用FreeMarker的.new方法创建Java Date对象:

<#-- 先判断对象是否存在,避免空指针 -->
<#if var.startDate??>
  <#assign javaStartDate = .new("java.util.Date", var.startDate.getTime())>
  开始时间:${javaStartDate?datetime('yyyy-MM-dd HH:mm:ss')}
<#else>
  开始时间:未设置
</#if>

补充说明

  • 两种方法的核心都是把NativeDate转换成Java的java.util.Date,因为FreeMarker的日期内置方法只对Java标准日期类型生效。
  • 如果你的Web脚本用的是Java控制器,那直接在后端把任何日期对象转换成java.util.Date再传入模型即可,不需要额外处理。

内容的提问来源于stack exchange,提问作者Dmitriy Korobkov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:39:57