如何在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
相关产品推荐
相关产品推荐

