0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>В языке программирования Golang для выполнения операций над временем используется стандартный пакет<strong>time</strong>. Используя его, можно получить текущие параметры времени и даты, отформатировать дату в строку, создать таймер либо бегущую строку, cконвертировать временные зоны.</p>
1
<p>В языке программирования Golang для выполнения операций над временем используется стандартный пакет<strong>time</strong>. Используя его, можно получить текущие параметры времени и даты, отформатировать дату в строку, создать таймер либо бегущую строку, cконвертировать временные зоны.</p>
2
<p>В этой статье пойдёт рассказ о форматировании даты в строку, о парсинге даты в Golang, о популярных шаблонах для даты и времени и о том, какие существуют исключительные случаи во время работы с датой и временем (time) в Golang.</p>
2
<p>В этой статье пойдёт рассказ о форматировании даты в строку, о парсинге даты в Golang, о популярных шаблонах для даты и времени и о том, какие существуют исключительные случаи во время работы с датой и временем (time) в Golang.</p>
3
<p>В качестве шаблона в языке программирования Go используют фиксированные значения времени либо даты, а не особые символы, такие как %d-%b-%Y. В целях форматирования задействуется метод<strong>Format</strong>:</p>
3
<p>В качестве шаблона в языке программирования Go используют фиксированные значения времени либо даты, а не особые символы, такие как %d-%b-%Y. В целях форматирования задействуется метод<strong>Format</strong>:</p>
4
func (t Time) Format(layout string) string<p>Для парсинга даты применяют функцию<strong>time.Parse</strong>:</p>
4
func (t Time) Format(layout string) string<p>Для парсинга даты применяют функцию<strong>time.Parse</strong>:</p>
5
func Parse(layout, value string) (Time, error)<p>Чтобы описать формат значения времени, нужен специальный параметр макета<strong>layout</strong>. Он д. б. референтной датой - Mon Jan 2 15:04:05 MST 2006, которая отформатирована так же, как и ожидаемое для форматирования значение.</p>
5
func Parse(layout, value string) (Time, error)<p>Чтобы описать формат значения времени, нужен специальный параметр макета<strong>layout</strong>. Он д. б. референтной датой - Mon Jan 2 15:04:05 MST 2006, которая отформатирована так же, как и ожидаемое для форматирования значение.</p>
6
<h2>Парсинг даты</h2>
6
<h2>Парсинг даты</h2>
7
<p>Для парсинга "2017-08-31" применим шаблон строки "2006-01-02" (это эквивалентно yyyy-mm-dd референтной "магической" даты).</p>
7
<p>Для парсинга "2017-08-31" применим шаблон строки "2006-01-02" (это эквивалентно yyyy-mm-dd референтной "магической" даты).</p>
8
<p>Может возникнуть справедливый вопрос: а что же такого магического есть в Mon Jan 2 15:04:05 MST 2006? Давайте посмотрим на шаблон в другом порядке:</p>
8
<p>Может возникнуть справедливый вопрос: а что же такого магического есть в Mon Jan 2 15:04:05 MST 2006? Давайте посмотрим на шаблон в другом порядке:</p>
9
<p>Видно, что здесь нет двух одинаковых полей. А это означает, что для такой конкретной даты каждое поле будет точно идентифицированным вне зависимости от форматирования.</p>
9
<p>Видно, что здесь нет двух одинаковых полей. А это означает, что для такой конкретной даты каждое поле будет точно идентифицированным вне зависимости от форматирования.</p>
10
<h2>Форматируем даты в строку</h2>
10
<h2>Форматируем даты в строку</h2>
11
<p>Если нужно получить текстовое представление значения времени, то можно ожидать выполнения определенного форматирования. В пакете time есть тип<strong>Time</strong>, позволяющий создавать вывод string в указанном формате. Существует ряд правил относительно того, как правильно это выполнять. Наиболее важные моменты следует рассмотреть:</p>
11
<p>Если нужно получить текстовое представление значения времени, то можно ожидать выполнения определенного форматирования. В пакете time есть тип<strong>Time</strong>, позволяющий создавать вывод string в указанном формате. Существует ряд правил относительно того, как правильно это выполнять. Наиболее важные моменты следует рассмотреть:</p>
12
<ol><li>Давайте создадим файл<em>format.go</em>с определённым содержанием:</li>
12
<ol><li>Давайте создадим файл<em>format.go</em>с определённым содержанием:</li>
13
<li>Теперь запустим код с помощью<strong>go run format.go</strong>.</li>
13
<li>Теперь запустим код с помощью<strong>go run format.go</strong>.</li>
14
<li>И увидим результат:</li>
14
<li>И увидим результат:</li>
15
</ol>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<p>Тип Time в пакете time предоставляет нам метод Format, необходимый для форматирования вывода в строку. Также пакет time содержит ряд предварительно установленных форматов (в качестве примера можно привести time.Kitchen). Чтобы ознакомиться с константами этого пакета, можно открыть их в официальной<a>документации</a>. Если же интересует более подробная информация как о предварительно определённых форматах, так и об опциях форматирования, получить её можно тоже в официальной документации, но уже<a>для пакета time</a>.</p>
15
</ol>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<p>Тип Time в пакете time предоставляет нам метод Format, необходимый для форматирования вывода в строку. Также пакет time содержит ряд предварительно установленных форматов (в качестве примера можно привести time.Kitchen). Чтобы ознакомиться с константами этого пакета, можно открыть их в официальной<a>документации</a>. Если же интересует более подробная информация как о предварительно определённых форматах, так и об опциях форматирования, получить её можно тоже в официальной документации, но уже<a>для пакета time</a>.</p>
16
<p>Чтобы определить макет вывода, в Go используется референтное значение времени Jan 2 15:04:05 2006 MST.</p>
16
<p>Чтобы определить макет вывода, в Go используется референтное значение времени Jan 2 15:04:05 2006 MST.</p>
17
<h2>Популярные шаблоны</h2>
17
<h2>Популярные шаблоны</h2>
18
<p>Ниже будут представлены таблицы с шаблонами для даты, времени, даты и времени.</p>
18
<p>Ниже будут представлены таблицы с шаблонами для даты, времени, даты и времени.</p>
19
<h2>Об исключительных случаях</h2>
19
<h2>Об исключительных случаях</h2>
20
<p>Теперь следует перечислить особые случаи, с которыми, используя пакет time, справиться нельзя:</p>
20
<p>Теперь следует перечислить особые случаи, с которыми, используя пакет time, справиться нельзя:</p>
21
<ol><li>Случай № 1. Нет возможности уточнить, что час должен быть представлен в 24-часовом временном формате без начального нуля.</li>
21
<ol><li>Случай № 1. Нет возможности уточнить, что час должен быть представлен в 24-часовом временном формате без начального нуля.</li>
22
<li>Случай № 2. Нет возможности указать полночь как 24:00 вместо 00:00. Типичное применение для этого - давать часы работы, которые заканчиваются в полночь, по типу 07:00-24:00.</li>
22
<li>Случай № 2. Нет возможности указать полночь как 24:00 вместо 00:00. Типичное применение для этого - давать часы работы, которые заканчиваются в полночь, по типу 07:00-24:00.</li>
23
<li>Случай № 3. Нет возможности указать время, которое содержит дополнительную високосную секунду: 23:59:60. На деле временной пакет предполагает использование григорианского календаря без високосных секунд.</li>
23
<li>Случай № 3. Нет возможности указать время, которое содержит дополнительную високосную секунду: 23:59:60. На деле временной пакет предполагает использование григорианского календаря без високосных секунд.</li>
24
</ol><h2>Как получить timestamp в Golang?</h2>
24
</ol><h2>Как получить timestamp в Golang?</h2>
25
<p>Если интересует метка времени (timestamp), следует использовать time.Now, а также один из time.Unix либо time.UnixNano. Нижеследующий код можно проверить в любом онлайн-компиляторе Go:</p>
25
<p>Если интересует метка времени (timestamp), следует использовать time.Now, а также один из time.Unix либо time.UnixNano. Нижеследующий код можно проверить в любом онлайн-компиляторе Go:</p>
26
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 }<p>Вывод в терминал на момент написания статьи был следующим:</p>
26
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 }<p>Вывод в терминал на момент написания статьи был следующим:</p>
27
2020-09-25 17:29:56.611382982 +0000 UTC m=+0.000159607 1601054996 1601054996611382982<p>Вот и всё, если хотите получить более продвинутые знания по программированию на Golang, записывайтесь на курсы в OTUS!</p>
27
2020-09-25 17:29:56.611382982 +0000 UTC m=+0.000159607 1601054996 1601054996611382982<p>Вот и всё, если хотите получить более продвинутые знания по программированию на Golang, записывайтесь на курсы в OTUS!</p>
28
<p><em>По материалам:</em>• 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.</p>
28
<p><em>По материалам:</em>• 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.</p>
29
29