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

将Instant转换为Date时遇Freemarker错误:Expected hash

嘿,我来帮你搞定这个Freemarker的时间转换问题,先理清楚错误根源,再给你靠谱的修复方案:

错误原因拆解

你遇到的 freemarker.template.TemplateException: Expected hash. newDate evaluated instead to freemarker.template.SimpleDate 报错,核心问题有两个:

  1. newDate 的调用逻辑错误:你在Java代码里传入的 java.util.Date,会被Freemarker自动包装成 SimpleDate 类型。模板里的 newDate.getAsDate() 完全是错误用法——SimpleDate 根本没有这个方法,Freemarker把它当成了要访问哈希(hash)结构的属性,所以抛出了"Expected hash"的错误。
  2. Instant 转换逻辑混乱:你在模板里混用了 newDate 和 Instant 的方法,from 是 Instant 的静态方法,不能通过 newDate 的实例去调用,逻辑本身就不成立。
修复方案

方案1:Java层完成转换(推荐)

尽量把时间转换逻辑放在Java代码里,既清晰又便于维护,模板只负责展示:

Date newDate = new Date();
Instant instant = Instant.now();
// 将Instant转换为Date(这里用系统默认时区,你可以根据需求指定时区,比如ZoneId.of("Asia/Shanghai"))
Date instantDate = Date.from(instant);
// 处理你的秒级时间戳data.time.seconds
Date timestampDate = Date.from(Instant.ofEpochSecond(data.time.seconds));

// 把转换好的对象传入模板上下文
webContext.put("newDate", newDate);
webContext.put("instantDate", instantDate);
webContext.put("timestampDate", timestampDate);

然后在Freemarker模板里直接使用并格式化:

<!-- 格式化日期,示例格式为yyyy-MM-dd HH:mm:ss -->
[#assign dateFormated = timestampDate?string("yyyy-MM-dd HH:mm:ss")/]

方案2:模板内直接处理Instant(需Freemarker 2.3.28+)

如果一定要在模板里处理Instant,请确保你的Freemarker版本是2.3.28及以上(支持Java 8时间API):
Java代码保持传入Instant和时间戳:

Instant instant = Instant.now();
webContext.put("instant", instant);
webContext.put("timestampSeconds", data.time.seconds);

模板内转换并格式化:

<!-- 将Instant转为Date,指定时区(示例用UTC,可替换为你需要的时区如"Asia/Shanghai") -->
[#assign instantDate = instant?date("UTC")/]
<!-- 从秒级时间戳生成Instant再转Date -->
[#assign targetInstant = Instant.ofEpochSecond(timestampSeconds)/]
[#assign targetDate = targetInstant?date("UTC")/]
<!-- 格式化输出 -->
[#assign dateFormated = targetDate?string("yyyy-MM-dd HH:mm:ss")/]
关键注意事项
  • Freemarker对Java原生日期类(Date、Calendar)会自动包装,不能直接调用Java方法,必须用Freemarker的内建函数(比如?string、?date)来处理。
  • 使用Java 8时间API时,一定要确认Freemarker版本兼容性,避免出现不支持的情况。
  • 时间转换时务必明确时区,依赖系统默认时区容易出现时间偏移问题。

内容的提问来源于stack exchange,提问作者Tonino Fernandez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:18:50