在Go语言的Web开发中,经常需要在HTML模板中展示time.Time类型的时间数据,默认情况下模板直接输出该类型会显示完整的结构体信息,无法符合业务要求的展示格式,因此需要掌握对应的格式化方法。

使用内置的time格式化方法
time.Time类型自带Format方法,我们可以先在后端对时间进行格式化处理,再将格式化后的字符串传入模板。这种方式的优点是逻辑处理集中在后端,模板只需要做简单的展示。
首先看后端的Go代码实现:
package main
import (
"html/template"
"net/http"
"time"
)
func main() {
// 定义模板内容
tmpl := `
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>时间展示</title>
</head>
<body>
<p>格式化后的时间:{{.FormattedTime}}</p>
</body>
</html>
`
// 解析模板
t, err := template.New("timeTmpl").Parse(tmpl)
if err != nil {
panic(err)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 获取当前时间
now := time.Now()
// 定义时间格式,Go的时间格式化参考时间是2006-01-02 15:04:05
formattedTime := now.Format("2006-01-02 15:04:05")
// 定义传递给模板的数据结构
data := struct {
FormattedTime string
}{
FormattedTime: formattedTime,
}
// 渲染模板
t.Execute(w, data)
})
// 启动服务
http.ListenAndServe(":8080", nil)
}
自定义模板函数实现格式化
如果希望模板层直接处理时间格式化,不需要在后端提前处理,可以自定义模板函数,将格式化逻辑注册到模板中,方便多个模板复用。
实现自定义模板函数的步骤如下:
- 定义一个接收time.Time参数并返回格式化字符串的函数
- 使用template.FuncMap将该函數注册到模板中
- 在模板中调用自定义的格式化函数
下面是完整的实现代码:
package main
import (
"html/template"
"net/http"
"time"
)
func main() {
// 定义模板内容,调用自定义的formatTime函数
tmpl := `
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>时间展示</title>
</head>
<body>
<p>原始时间对象:{{.NowTime}}</p>
<p>自定义函数格式化:{{formatTime .NowTime}}</p>
<p>带参数的格式化:{{formatTimeWithLayout .NowTime "2006年01月02日 15时04分"}}</p>
</body>
</html>
`
// 创建FuncMap,注册自定义函数
funcMap := template.FuncMap{
// 基础格式化函数,使用默认格式
"formatTime": func(t time.Time) string {
return t.Format("2006-01-02 15:04:05")
},
// 带格式参数的自定义函数
"formatTimeWithLayout": func(t time.Time, layout string) string {
return t.Format(layout)
},
}
// 创建模板并关联FuncMap
t := template.New("timeTmpl").Funcs(funcMap)
// 解析模板
_, err := t.Parse(tmpl)
if err != nil {
panic(err)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 传递当前时间到模板
data := struct {
NowTime time.Time
}{
NowTime: time.Now(),
}
// 渲染模板
t.Execute(w, data)
})
// 启动服务
http.ListenAndServe(":8080", nil)
}
两种方式的对比
两种格式化方式各有适用场景,我们可以通过下面的表格来对比两者的差异:
| 对比项 | 后端提前格式化 | 自定义模板函数 |
|---|---|---|
| 逻辑位置 | 后端业务逻辑层 | 模板层 |
| 复用性 | 仅当前场景可用,复用需重复写格式化代码 | 注册后所有模板都可调用,复用性高 |
| 灵活性 | 格式固定,修改需要改后端代码 | 可以在模板中传参调整格式,更灵活 |
| 适用场景 | 全局格式统一,不需要模板层调整的场景 | 多个模板需要不同时间格式的场景 |
注意事项
在使用自定义模板函数时,需要注意以下几点:
- 注册自定义函数的操作必须在解析模板之前完成,否则模板解析时无法识别自定义函数会报错
- Go的时间格式化参考时间是固定的2006-01-02 15:04:05,不要使用其他时间作为格式参考
- 如果传递的时间可能为nil,需要在自定义函数中做空值判断,避免模板渲染时出现异常
如果遇到时间格式化后显示错误的问题,可以先检查格式字符串是否符合Go的格式化规则,再检查自定义函数的注册顺序是否正确。
Gohtml/templatetime.Time时间格式化修改时间:2026-06-18 10:48:37