В Go в качестве шаблона даты и времени используются не особые символы %d-%b-%Y
как в других языках программирования, а фиксированные значения даты или времени — 2 Января 15:04:05 2006 года.
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
Содержание статьи
- Пример парсинга даты в Golang
- Форматирование даты в строку
- Популярные шаблоны для даты и времени
- Исключительные случаи при работе с датой и временем
Для форматирования даты в Golang используется метод Format:
1 |
func (t Time) Format(layout string) string |
Для парсинга даты используется функция time.Parse:
1 |
func Parse(layout, value string) (Time, error) |
Параметр layout
описывает формат значения времени. Он должен быть магической референтной датой — Mon Jan 2 15:04:05 MST 2006
, отформатированной таким же способом, что ожидаемое для форматирования значение.
Пример парсинга даты в Golang
Для парсинга "2017-08-31"
мы используем шаблон строки "2006-01-02"
, так как это эквивалентно yyyy-mm-dd
магической референтной даты.
1 2 3 4 5 6 7 |
input := "2017-08-31" layout := "2006-01-02" t, _ := time.Parse(layout, input) fmt.Println(t) // 2017-08-31 00:00:00 +0000 UTC fmt.Println(t.Format("02-Jan-2006")) // 31-Aug-2017 |
Что такого магического в Mon Jan 2 15:04:05 MST 2006
? Если показать этот шаблон в таком порядке…
1 |
01/02 03:04:05PM '06 -0700 |
… то можно увидеть, что двух одинаковых полей нет. Это значит, что для данной конкретной даты каждое поле будет идентифицировано точно, независимо от форматирования.
Форматирование даты в строку
В случае, когда требуется текстовое представление значения времени, ожидается, что будет произведено определенное форматирование. Тип Time
из пакета time
дает возможность создавать вывод string
в указанном формате. Есть несколько правил касательно того, как это можно сделать. Далее будет рассмотрено несколько важных моментов.
1. Создайте файл format.go
со следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
package main import ( "fmt" "time" ) func main() { tTime := time.Date(2017, time.March, 5, 8, 5, 2, 0, time.Local) // Форматирование выполнено // с использованием данного формата // Jan 2 15:04:05 2006 MST fmt.Printf("tTime is: %s\n", tTime.Format("2006/1/2")) fmt.Printf("The time is: %s\n", tTime.Format("15:04")) // Выбираем предпочтительный формат fmt.Printf("The time is: %s\n", tTime.Format(time.RFC1123)) // Форматирование поддерживает отступ с пробелами // только для дней в версии Go 1.9.2 fmt.Printf("tTime is: %s\n", tTime.Format("2006/1/_2")) // Нулевой отступ делается с добавлением 0 вначале месяца или дня. fmt.Printf("tTime is: %s\n", tTime.Format("2006/01/02")) fmt.Printf("tTime is: %s\n", tTime.Format("15:04:05.00")) fmt.Printf("tTime is: %s\n", tTime.Format("15:04:05.999")) // AppendFormat добавляет форматированное время данному буферу fmt.Println(string(tTime.AppendFormat([]byte("The time is up: "), "03:04PM"))) } |
2. Запустите код через go run format.go
;
3. Посмотрите на результат в терминале:
1 2 3 4 5 6 7 8 |
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
для форматирования вывода в строку.
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
. По факту библиотека рассматривает Грегорианский календарь без дополнительных секунд.
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»