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

如何在Golang模板中计算并渲染时间间隔?

Go模板中直接计算时间间隔的实现方法

Go模板默认不会自动导入time包的函数,所以直接在模板里调用time.Since会报错。要实现你要的效果,只需要给模板注册一个自定义函数,把time.Since的逻辑封装进去即可,不用额外包装结构体。

步骤1:注册自定义模板函数

在解析模板前,先定义一个FuncMap,把我们需要的时间间隔计算函数注册进去:

package main

import (
	"html/template"
	"os"
	"time"
)

type Foo struct {
	Created time.Time
}

func main() {
	// 定义自定义函数,封装time.Since逻辑
	funcMap := template.FuncMap{
		"timeSince": func(t time.Time) string {
			return time.Since(t).String()
		},
	}

	// 解析模板时关联自定义函数集
	tmpl, err := template.New("foo").Funcs(funcMap).Parse(`Created at {{.Created.Format "2006-01-02 15:04"}} ({{timeSince .Created}} ago)`)
	if err != nil {
		panic(err)
	}

	// 模拟测试数据
	foo := Foo{Created: time.Now().Add(-time.Hour - 12*time.Minute - 34*time.Second)}
	err = tmpl.Execute(os.Stdout, foo)
	if err != nil {
		panic(err)
	}
}

步骤2:模板中调用自定义函数

模板里直接使用注册好的timeSince函数,同时用Format方法把时间格式化成你需要的样式:

Created at {{.Created.Format "2006-01-02 15:04"}} ({{timeSince .Created}} ago)

额外说明

  • 如果对Duration的输出格式有定制需求(比如去掉多余单位、简化显示),可以在自定义的timeSince函数里手动处理字符串,不用直接依赖String()方法。
  • 这种方式完全不需要修改原Foo结构体,直接使用原对象渲染即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:45:44