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

时间:2019-01-07 09:05:11

标签: bash go buildah

使用buildah,我可以通过此调用找出生成图像的日期:

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

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

这将返回:

Nov 13, 2018 08:04

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

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

这给了我想要的UNIX纪元:

1542063840

但是,由于我的'{{.CreatedAt}}'是我应该能够格式化的Go模板,因此如何直接打印出历元秒(或RFC-3339等)而不是依靠{{1} }。

您可以猜到,我是个完全的新手,文档没有提供我可以复制粘贴的任何内容


注意:按照以下答案,增强功能请求已发布到buildah issues db

1 个答案:

答案 0 :(得分:2)

不幸的是,你不走运。

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

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

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

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

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

params是上述结构的值。

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

{{.CreatedAtTime.Unix}}