Golang time и Golang date: форматирование даты и времени в Go | OTUS

Golang time и Golang date: форматирование даты и времени в Go

В языке программирования Golang для выполнения операций над временем используется стандартный пакет time. Используя его, можно получить текущие параметры времени и даты, отформатировать дату в строку, создать таймер либо бегущую строку, cконвертировать временные зоны.

В этой статье пойдёт рассказ о форматировании даты в строку, о парсинге даты в Golang, о популярных шаблонах для даты и времени и о том, какие существуют исключительные случаи во время работы с датой и временем (time) в Golang.

В качестве шаблона в языке программирования Go используют фиксированные значения времени либо даты, а не особые символы, такие как %d-%b-%Y. В целях форматирования задействуется метод Format:

    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 референтной "магической" даты).

1-1801-fc908e.png

Может возникнуть справедливый вопрос: а что же такого магического есть в Mon Jan 2 15:04:05 MST 2006? Давайте посмотрим на шаблон в другом порядке:

2-1801-519f28.png

Видно, что здесь нет двух одинаковых полей. А это означает, что для такой конкретной даты каждое поле будет точно идентифицированным вне зависимости от форматирования.

Форматируем даты в строку

Если нужно получить текстовое представление значения времени, то можно ожидать выполнения определенного форматирования. В пакете time есть тип Time, позволяющий создавать вывод string в указанном формате. Существует ряд правил относительно того, как правильно это выполнять. Наиболее важные моменты следует рассмотреть:

  1. Давайте создадим файл format.go с определённым содержанием: 3-1801-096072.png
  2. Теперь запустим код с помощью go run format.go.
  3. И увидим результат:
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.

Популярные шаблоны

Ниже будут представлены таблицы с шаблонами для даты, времени, даты и времени.

4-1801-a84705.png 5-1801-f3ee9f.png

Об исключительных случаях

Теперь следует перечислить особые случаи, с которыми, используя пакет time, справиться нельзя:

  1. Случай № 1. Нет возможности уточнить, что час должен быть представлен в 24-часовом временном формате без начального нуля.
  2. Случай № 2. Нет возможности указать полночь как 24:00 вместо 00:00. Типичное применение для этого — давать часы работы, которые заканчиваются в полночь, по типу 07:00-24:00.
  3. Случай № 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.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто