以 bash 友好的方式格式化 Go 日期

Formatting a Go date in a bash-friendly manner

使用 buildah,我可以通过此调用找到我的映像的构建日期:

buildah images --format '{{.CreatedAt}}' my_image

--format 参数是一个 Go 模板,如 described for a related command

这个returns:

Nov 13, 2018 08:04

据我所知,这是我当前使用的时区,但它没有本地化,并且缺少时区信息。如果我像这样将输出输入 Linux 的 date

date -d "`buildah images --format '{{.CreatedAt}}' my_container`" +%s

这给了我想要的,UNIX 纪元秒:

1542063840

然而,由于我的 '{{.CreatedAt}}' 是一个 Go 模板,我应该能够格式化,我如何直接打印出纪元秒(或 RFC-3339 等)而不是依赖 date.

如您所料,我是一个彻头彻尾的 Go 新手,文档没有提供任何我可以复制粘贴的内容


注意:按照下面的回答,增强请求发布到buildah issues db

不幸的是你运气不好。

传给模板执行的参数值是imageOutputParams类型,声明在images.go:

type imageOutputParams struct {
    Tag       string
    ID        string
    Name      string
    Digest    string
    CreatedAt string
    Size      string
}

如您所见,CreatedAt 字段的类型为 string,而不是 time.Time,因此您不能对其调用 time.Time 方法。如果没有自定义注册函数,您也不能对其进行任何有用的 date/time 处理。但由于您只是提供模板文本,因此您也无法注册自定义函数。

您传递的模板在函数 outputUsingTemplate() 中执行,如下所示:

err = tmpl.Execute(os.Stdout, params)

其中 params 是上述结构的值。

建议项目所有者添加一个新字段,将 CreatedAt 时间戳作为 time.Time 值,这样您就可以使用 Time.Unix() 获取纪元秒。模板将如下所示:

{{.CreatedAtTime.Unix}}