Форматирование даты Го дружественным способом - PullRequest
0 голосов
/ 07 января 2019

Используя buildah, я могу узнать дату создания моего изображения с помощью этого вызова:

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

Аргумент --format является шаблоном Go, как описано в для связанной команды .

Возвращает:

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 выдается дБ .

.

1 Ответ

0 голосов
/ 07 января 2019

К сожалению, вам не повезло.

Значение параметра, переданное в выполнение шаблона, имеет тип 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}}
...