plush 模板中需用内置 date 函数格式化时间:{{ date "2006-01-02" .createdat }},参数顺序为格式串在前、time.time 在后;nil 或零值静默输出空串,时区固定为本地,自定义时区需注册 helper(如 datecn),unixmilli 需升级 plush 至 v4.18.0+ 才正确识别。

Plush 模板里不能直接用 Go 的 time.Format(),因为 Plush 不暴露底层 time.Time 方法;必须通过预定义函数或自定义 helper 实现日期格式化。
Plush 内置的 date 函数怎么用
Plush 提供了 date 辅助函数,但它的参数顺序和 Go 原生习惯相反:第一个参数是格式字符串,第二个才是 time.Time 值。
- 正确写法:
{{ date "2006-01-02" .CreatedAt }}→ 输出2024-05-18 - 常见错误:
{{ .CreatedAt.Format "2006-01-02" }}会报can't call method Format on time.Time - 支持的格式字符串是 Go 的参考时间
"Mon Jan 2 15:04:05 MST 2006"的子集,比如"2006-01-02T15:04:05Z"、"Jan 2, 2006"都可以 - 如果
.CreatedAt是 nil 或零值,date会静默渲染空字符串——建议在 action 层提前校验或提供默认值
需要自定义时区或更复杂逻辑?加个 plush.Helper
内置 date 总是用服务器本地时区(time.Local),没法指定 Asia/Shanghai。这时得注册自定义 helper:
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
// 在 app.go 或 actions/render.go 中注册
r := render.New(render.Options{
// ...
})
r.AddFunc("datecn", func(layout string, t time.Time) string {
if t.IsZero() {
return ""
}
loc, _ := time.LoadLocation("Asia/Shanghai")
return t.In(loc).Format(layout)
})
模板中即可使用:{{ datecn "2006-01-02 15:04" .UpdatedAt }}
- 注意:helper 函数名不能含点(
.),否则Plush解析失败 - 时区加载失败时
time.LoadLocation返回nil,要加判空,否则t.In(nil)panic - 不要在 helper 里做耗时操作(如 HTTP 请求),
Plush是同步执行,会阻塞模板渲染
为什么 time.UnixMilli 类型在 Plush 里显示为数字而不是时间
Go 1.26+ 引入的 time.UnixMilli(int64) 返回的是 time.Time,但某些旧版 Plush(v4.17.0 之前)未识别其底层结构,会直接输出毫秒数值(如 1712345678901)。
- 验证方式:在 action 里打印
fmt.Printf("%#v", t),确认是否为time.Time实例 - 临时绕过:在 action 层转成标准
time.Unix(0, t.UnixMilli()*int64(time.Millisecond)) - 根治方案:升级
github.com/gobuffalo/plush到 v4.18.0+,它已修复对UnixMilli的支持 - 别依赖
String()方法——Plush不调用它,只按字段反射,而time.Time的字段是 unexported 的
真正麻烦的不是语法,而是时区和 nil 处理——这两个点在线上环境最容易出错,且日志里不报 panic,只默默渲染空串或错乱时间。










