Golang time и Golang date: форматирование даты и времени в Go
В языке программирования Golang для выполнения операций над временем используется стандартный пакет time. Используя его, можно получить текущие параметры времени и даты, отформатировать дату в строку, создать таймер либо бегущую строку, cконвертировать временные зоны.
В этой статье пойдёт рассказ о форматировании даты в строку, о парсинге даты в Golang, о популярных шаблонах для даты и времени и о том, какие существуют исключительные случаи во время работы с датой и временем (time) в Golang.
В качестве шаблона в языке программирования Go используют фиксированные значения времени либо даты, а не особые символы, такие как
func (t Time) Format(layout string) string
Для парсинга даты применяют функцию time.Parse:
func Parse(layout, value string) (Time, error)
Чтобы описать формат значения времени, нужен специальный параметр макета layout. Он д. б. референтной датой — Mon Jan 2 15:04:05 MST 2006, которая отформатирована так же, как и ожидаемое для форматирования значение.
Парсинг даты
Для парсинга "2017-08-31" применим шаблон строки "2006-01-02" (это эквивалентно yyyy-mm-dd референтной "магической" даты).
Может возникнуть справедливый вопрос: а что же такого магического есть в Mon Jan 2 15:04:05 MST 2006? Давайте посмотрим на шаблон в другом порядке:
Видно, что здесь нет двух одинаковых полей. А это означает, что для такой конкретной даты каждое поле будет точно идентифицированным вне зависимости от форматирования.
Форматируем даты в строку
Если нужно получить текстовое представление значения времени, то можно ожидать выполнения определенного форматирования. В пакете time есть тип Time, позволяющий создавать вывод string в указанном формате. Существует ряд правил относительно того, как правильно это выполнять. Наиболее важные моменты следует рассмотреть:
- Давайте создадим файл format.go с определённым содержанием:
- Теперь запустим код с помощью go run format.go.
- И увидим результат:
tTime is: 2017/3/5 The time is: 08:05 The time is: Sun, 05 Mar 2017 08:05:02 UTC tTime is: 2017/3/ 5 tTime is: 2017/03/05 tTime is: 08:05:02.00 tTime is: 08:05:02 The time is up: 08:05AM
Тип Time в пакете time предоставляет нам метод Format, необходимый для форматирования вывода в строку. Также пакет time содержит ряд предварительно установленных форматов (в качестве примера можно привести time.Kitchen). Чтобы ознакомиться с константами этого пакета, можно открыть их в официальной документации. Если же интересует более подробная информация как о предварительно определённых форматах, так и об опциях форматирования, получить её можно тоже в официальной документации, но уже для пакета time.
Чтобы определить макет вывода, в Go используется референтное значение времени Jan 2 15:04:05 2006 MST.
Популярные шаблоны
Ниже будут представлены таблицы с шаблонами для даты, времени, даты и времени.
Об исключительных случаях
Теперь следует перечислить особые случаи, с которыми, используя пакет time, справиться нельзя:
- Случай № 1. Нет возможности уточнить, что час должен быть представлен в 24-часовом временном формате без начального нуля.
- Случай № 2. Нет возможности указать полночь как 24:00 вместо 00:00. Типичное применение для этого — давать часы работы, которые заканчиваются в полночь, по типу 07:00-24:00.
- Случай № 3. Нет возможности указать время, которое содержит дополнительную високосную секунду: 23:59:60. На деле временной пакет предполагает использование григорианского календаря без високосных секунд.
Как получить timestamp в Golang?
Если интересует метка времени (timestamp), следует использовать time.Now, а также один из time.Unix либо time.UnixNano. Нижеследующий код можно проверить в любом онлайн-компиляторе Go:
package main import ( "fmt" "time" ) func main() { // местное время (текущее) now := time.Now() // число секунд с 1 января 1970 года по Гринвичу (UTC) sec := now.Unix() // число наносекунд с 1 января 1970 года // по Гринвичу (UTC) nsec := now.UnixNano() fmt.Println(now) // time.Time fmt.Println(sec) // int64 fmt.Println(nsec) // int64 }
Вывод в терминал на момент написания статьи был следующим:
2020-09-25 17:29:56.611382982 +0000 UTC m=+0.000159607 1601054996 1601054996611382982
Вот и всё, если хотите получить более продвинутые знания по программированию на Golang, записывайтесь на курсы в OTUS!
По материалам: • https://golangs.org/date-time-layout-2006-01-02; • https://golang-blog.blogspot.com/2020/04/format-date-time-in-golang.html; • https://golang-blog.blogspot.com/2020/04/timestamp-in-golang.html.