форматирования даты и времени в Go

В Go в качестве шаблона используются не особые символы %d-%b-%Y, а фиксированные значения даты или времени — 2 Января 15:04:05 2006 года.

Форум Гоферов

Мы работаем над форумом для программистов на Golang. Очень нужны модераторы которые хотят помочь с ответами для новичков и помочь в развитии Go-сообщества.

Go на Форум

Уроки, статьи и Видео

Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.

Go в ВК Go в Telegram

Содержание статьи

Для форматирования даты в Golang используется метод Format:

Для парсинга даты используется функция time.Parse:

Параметр layout описывает формат значения времени. Он должен быть магической референтной датой — Mon Jan 2 15:04:05 MST 2006, отформатированной таким же способом, что ожидаемое для форматирования значение.

Пример парсинга даты в Golang

Для парсинга "2017-08-31" мы используем шаблон строки "2006-01-02", так как это эквивалентно yyyy-mm-dd магической референтной даты.

Что такого магического в Mon Jan 2 15:04:05 MST 2006? Если показать этот шаблон в таком порядке…

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

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

В случае, когда требуется текстовое представление значения времени, ожидается, что будет произведено определенное форматирование. Тип Time из пакета time дает возможность создавать вывод string в указанном формате. Есть несколько правил касательно того, как это можно сделать. Далее будет рассмотрено несколько важных моментов.

1. Создайте файл format.go со следующим содержимым:

2. Запустите код через go run format.go;
3. Посмотрите на результат в терминале:

Тип Time из пакета time предоставляет метод Format для форматирования вывода в строку.

Go использует референтное значение времени Jan 2 15:04:05 2006 MST для определения макета вывода. Изучите код примера, чтобы узнать об опциях отступа.

Внимание! Заметка для референтной даты заключается в том, что когда она представлена в числовой форме, она представлена как 1,2,3,4,5,6,-7. Значение -7 означает, что временная зона MST отличается от UTC на 7 часов.

Пакет time включает некоторые предварительно установленные форматы (к примеру, time.Kitchen); вы можете открыть их в документации для ознакомления с константами пакета.

Для дополнительной информации о предварительно определенных форматов и опций форматирования изучите документацию для пакета time.

Популярные шаблоны для даты и времени в Golang

Даты

Шаблон Go Java нотация C нотация Заметки
2006-01-02 yyyy-MM-dd %F ISO 8601
20060102 yyyyMMdd %Y%m%d ISO 8601
January 02, 2006 MMMM dd, yyyy %B %d, %Y
02 January 2006 dd MMMM yyyy %d %B %Y
02-Jan-2006 dd-MMM-yyyy %d-%b-%Y
01/02/06 MM/dd/yy %D US
01/02/2006 MM/dd/yyyy %m/%d/%Y US
010206 MMddyy %m%d%y US
Jan-02-06 MMM-dd-yy %b-%d-%y US
Jan-02-2006 MMM-dd-yyyy %b-%d-%Y US
06 yy %y
Mon EEE %a
Monday EEEE %A
Jan-06 MMM-yy %b-%y

Время

Шаблон Go Java нотация C нотация Заметки
15:04 HH:mm %R
15:04:05 HH:mm:ss %T ISO 8601
3:04 PM K:mm a %l:%M %p US
03:04:05 PM KK:mm:ss a %r US

Дата и время

Шаблон Go Java нотация C нотация Заметки
2006-01-02T15:04:05 yyyy-MM-dd’T’HH:mm:ss %FT%T ISO 8601
2006-01-02T15:04:05-0700 yyyy-MM-dd’T’HH:mm:ssZ %FT%T%z ISO 8601
2 Jan 2006 15:04:05 d MMM yyyy HH:mm:ss %e %b %Y %T
2 Jan 2006 15:04 d MMM yyyy HH:mm %e %b %Y %R
Mon, 2 Jan 2006 15:04:05 MST EEE, d MMM yyyy HH:mm:ss z %a, %e %b %Y %T %Z RFC 1123
RFC 822

Исключительные случаи при работе с датой и временем в Golang

Далее перечислены особы случаи, с которыми нельзя справиться при помощи пакета time.

  • Невозможно уточнить, что час должен быть представлен без начального нуля в 24-часовом временном формате;
  • Невозможно указать полностью как 24:00 вместо 00:00. Типичным использованием для этого было бы начало завершающихся часов в полночь вроде 07:00-24:00;
  • Невозможно указать время, содержащее дополнительную секунду: 23:59:60. По факту библиотека рассматривает Грегорианский календарь без дополнительных секунд.