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

如何在FreeMarker中从Instant时间对象获取星期几(如Monday)

解决Java Instant转星期几的问题

首先,你遇到的问题主要是因为Freemarker的?string["EEEE"]无法直接处理Instant类型——Instant本质是一个UTC时间戳,它本身不携带时区上下文(虽然它基于UTC),而星期几的计算需要关联到具体的日期,这需要明确的时区信息。

下面给你两种可行的解决方案:

方案一:在Java后端提前处理(推荐)

在把数据传给Freemarker模板之前,先将Instant转换为带时区的日期时间对象,直接计算出星期几的名称,再传递给模板:

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.DayOfWeek;
import java.time.format.TextStyle;
import java.util.Locale;

// 解析你的Instant字符串
Instant instant = Instant.parse("2018-05-19T22:00:00Z");
// 将Instant关联到UTC时区(因为你的时间是Z结尾,代表UTC)
ZonedDateTime utcDateTime = instant.atZone(ZoneId.of("UTC"));
// 获取星期几的完整英文名称(比如Saturday)
DayOfWeek dayOfWeek = utcDateTime.getDayOfWeek();
String dayName = dayOfWeek.getDisplayName(TextStyle.FULL, Locale.ENGLISH);

// 把dayName传入Freemarker模板,直接渲染即可

在模板里直接使用:

${dayName}

方案二:在Freemarker模板中直接处理

如果需要在模板里完成转换,你需要先把Instant转换为带时区的ZonedDateTime,再进行格式化。确保你的Freemarker版本支持Java 8的时间API(一般2.3.28及以上版本都支持):

${date.atZone(java.time.ZoneId.of("UTC"))?string["EEEE"]}

这里的date就是你传入模板的Instant对象,通过atZone()方法关联UTC时区后,就能用?string["EEEE"]正确格式化出星期几的完整英文名称了。

验证结果

你的示例时间2018-05-19T22:00:00Z对应的UTC日期是2018年5月19日,这天的星期几是Saturday,你可以用上面的方法验证结果是否正确。

内容的提问来源于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:12:52