Как преобразовать time.Time в строку в Go? (форматирование даты и времени)
Основное решение: метод Format() и "магическая" дата
В Go для преобразования time.Time в строку используется метод Format(layout string). Самое важное, что нужно запомнить: Go использует фиксированную эталонную дату для описания формата вывода. Эта дата — Mon Jan 2 15:04:05 MST 2006 (или в упрощённом виде: 2006-01-02T15:04:05Z07:00).
Вот как это работает: вы не пишете "YYYY-MM-DD", а используете конкретные числа из эталонной даты:
2006— год01— месяц (01 = январь)02— день15— часы в 24-часовом формате (03 — 12-часовой)04— минуты05— секундыMST— часовой пояс (можно заменить на-0700для смещения)
Пример для вашего формата "2024-12-25 14:30:00":
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
// Формат: год-месяц-день часы:минуты:секунды
layout := "2006-01-02 15:04:05"
str := now.Format(layout)
fmt.Println(str) // Вывод: 2024-12-25 14:30:00
}
Другие популярные форматы
// Только дата
dateOnly := now.Format("2006-01-02")
fmt.Println(dateOnly) // 2024-12-25
// С временной зоной
withTZ := now.Format("2006-01-02 15:04:05 MST")
fmt.Println(withTZ) // 2024-12-25 14:30:00 UTC
// ISO 8601 / RFC 3339 (стандартный для JSON)
iso := now.Format(time.RFC3339)
fmt.Println(iso) // 2024-12-25T14:30:00Z
// Русский формат
russian := now.Format("02.01.2006 15:04")
fmt.Println(russian) // 25.12.2024 14:30
Важные моменты
- Чувствительность к регистру:
01и1— разные вещи.01даёт месяц с ведущим нулём (01-12),1— без (1-12). - Предопределённые константы: в пакете
timeесть готовые форматы:time.RFC3339,time.Kitchenи другие. - Производительность:
Format()работает быстро, но если вы вызываете его в цикле миллионы раз, можно закешировать результат или использоватьtime.AppendFormat().
Обратное преобразование: строка → time.Time
Для парсинга строки обратно во время используется функция time.Parse(layout, value string):
str := "2024-12-25 14:30:00"
layout := "2006-01-02 15:04:05"
t, err := time.Parse(layout, str)
if err != nil {
panic(err)
}
fmt.Println(t) // 2024-12-25 14:30:00 +0000 UTC
Совет: Если вы работаете с API или базами данных, используйте time.RFC3339 — это стандартный формат для JSON и современных систем.
Альтернативный подход: использование строковых констант и форматирование с нулями
Если вам не нравится "магическая" дата Go, или вы хотите больше контроля над форматированием, можно использовать функции из пакета fmt с отдельными полями структуры time.Time:
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
// Ручное форматирование через fmt.Sprintf
str := fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d",
t.Year(),
t.Month(),
t.Day(),
t.Hour(),
t.Minute(),
t.Second(),
)
fmt.Println(str) // 2024-12-25 14:30:00
}
Этот метод даёт полный контроль, но:
- Минусы: больше кода, легко ошибиться с разрядностью (забыть
%02dдля месяца/дня) - Плюсы: интуитивно понятно для новичков, легко добавить кастомную логику (например, "сегодня" вместо даты)
Также можно использовать time.Now().String() и обрезать строку, но это ненадёжный подход — формат может измениться в будущих версиях Go. Лучше всегда использовать Format() или fmt.Sprintf с явным указанием полей.
Итог: Для 95% случаев используйте Format() — это идиоматичный способ в Go. Ручное форматирование оправдано только когда нужна нестандартная логика (например, "3 часа назад" вместо точного времени).