Разберём базу: как получить текущее время, как создать конкретную дату и как форматировать и парсить строки. Всё на примерах из стандартной библиотеки, без сторонних зависимостей.
Текущее время и его компоненты
Всё начинается с
time.Now(). Этот вызов возвращает структуру time.Time с текущим временем:now := time.Now()
fmt.Println(now) // 2024-01-15 10:30:00.123456789 -0500 EST
Из неё можно вытащить любой компонент через методы:
now.Year() // 2024
now.Month() // January
now.Day() // 15
now.Hour() // 10
now.Minute() // 30
now.Second() // 0
now.Weekday() // Monday
now.YearDay() // 15 (день в году)
Для интеграций часто нужны Unix-таймстемпы:
now.Unix() // 1705329000 (секунды)
now.UnixMilli() // 1705329000123 (миллисекунды)
now.UnixNano() // 1705329000123456789 (наносекунды)
Создание конкретной даты
Если нужно задать дату руками, используйте
time.Date():t := time.Date(2024, time.January, 15, 10, 30, 0, 0, time.UTC)
Аргументы по порядку: год, месяц, день, час, минута, секунда, наносекунда, таймзона.
Из Unix-таймстемпа:
t := time.Unix(1705329000, 0)
t := time.UnixMilli(1705329000123)
Из строки через парсинг:
t, err := time.Parse("2006-01-02", "2024-01-15")
t, err := time.Parse(time.RFC3339, "2024-01-15T10:30:00Z")Нулевое значение
time.Time можно проверить методом IsZero():var t time.Time
fmt.Println(t.IsZero()) // true
Форматирование и парсинг
Тут Go отличается от большинства языков. Вместо
%Y-%m-%d или yyyy-MM-dd используется референсная дата: Mon Jan 2 15:04:05 MST 2006. Запоминается просто: 1/2 3:4:5 2006.Форматируем в строку:
now.Format("2006-01-02") // 2024-01-15
now.Format("02/01/2006") // 15/01/2024
now.Format("January 2, 2006") // January 15, 2024
now.Format("15:04:05") // 10:30:00
now.Format("3:04 PM") // 10:30 AMЕсть готовые константы:
now.Format(time.RFC3339) // 2024-01-15T10:30:00-05:00
now.Format(time.Kitchen) // 10:30AM
now.Format(time.DateOnly) // 2024-01-15 (Go 1.20+)
now.Format(time.TimeOnly) // 10:30:00 (Go 1.20+)
Парсинг работает зеркально: передаёте тот же шаблон и строку:
t, err := time.Parse("2006-01-02", "2024-01-15")
t, err := time.Parse("01/02/2006 3:04 PM", "01/15/2024 10:30 AM")Если нужно парсить с привязкой к таймзоне, используйте
time.ParseInLocation():loc, _ := time.LoadLocation("America/New_York")
t, err := time.ParseInLocation("2006-01-02 15:04", "2024-01-15 10:30", loc)Шпаргалка по символам формата
2006 — 4-значный год06 — 2-значный год01 — месяц с нулём (01)1 — месяц без нуля (1)January — полное название месяцаJan — сокращённое название02 — день с нулём2 — день без нуляMonday — полное название дня неделиMon — сокращённое15 — час в 24-часовом формате03 — час в 12-часовом с нулём3 — час в 12-часовом без нуля04 — минуты05 — секундыPM — AM/PMMST — сокращение таймзоны-07:00 — смещениеZ07:00 — Z для UTC, смещение для остальных📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoDeep