如何将毫秒数转换为易读时间间隔?FTL模板实现咨询
FreeMarker毫秒数转易读时长字符串方案
无需自定义转换器的原生实现
FreeMarker没有直接处理时长毫秒数的内置函数,但可以通过数学计算+条件拼接实现需求,无需额外编写Java代码:
<#-- 转换为总秒数 --> <#assign totalSeconds = millisecondsSpent / 1000> <#-- 拆分出小时、分钟、秒 --> <#assign hours = (totalSeconds / 3600)?int> <#assign remainingSecs = totalSeconds % 3600> <#assign minutes = (remainingSecs / 60)?int> <#assign seconds = remainingSecs % 60?int> <#-- 收集非零的时长部分 --> <#assign durationSegments = []> <#if hours > 0> <#assign durationSegments += ["${hours}小时"]> </#if> <#if minutes > 0> <#assign durationSegments += ["${minutes}分钟"]> </#if> <#-- 兜底显示秒,避免空结果 --> <#if seconds > 0 || durationSegments?size == 0> <#assign durationSegments += ["${seconds}秒"]> </#if> <#-- 拼接为最终字符串 --> ${durationSegments?join(",")}
自定义Java转换器(复用性更强)
如果需要在多个模板中复用该逻辑,自定义转换器是更优雅的方案:
- 实现FreeMarker的
TemplateMethodModelEx接口,在exec方法中编写毫秒转时长的逻辑 - 将转换器注册到FreeMarker配置的共享变量中
- 在FTL中直接调用,示例:
${formatDuration(millisecondsSpent)}
额外说明
- 原生实现会自动忽略数值为0的时长部分,比如仅耗时45秒时,只会显示“45秒”
- 可根据需求调整拼接分隔符(比如把“,”改成“、”)或单位表述
内容的提问来源于stack exchange,提问作者Lukáš Petrovický
相关产品推荐
相关产品推荐

