Как получить текущее время в виде строки с форматированием в Go?
Особенность форматирования времени в Go: "магическая" дата
В Go действительно нет привычных кодов форматирования вроде %Y или %d. Вместо этого используется уникальный подход с эталонной датой:
Mon Jan 2 15:04:05 MST 2006
Или в числовом виде: 01/02 03:04:05PM '06 -0700. Каждое число в этой дате уникально и однозначно определяет компонент времени:
- 2006 — год
- 01 — месяц
- 02 — день
- 15 — час (24-часовой формат)
- 03 — час (12-часовой формат)
- 04 — минуты
- 05 — секунды
- PM — AM/PM
- MST — часовой пояс
- -0700 — смещение часового пояса
Таким образом, чтобы получить нужный вам формат 15.10.2023 14:30:45, нужно просто расставить компоненты эталонной даты в нужном порядке:
func main() {
currentTime := time.Now()
formatted := currentTime.Format("02.01.2006 15:04:05")
fmt.Println(formatted) // Вывод: 15.10.2023 14:30:45
}
Основные методы работы с временем
Помимо Format(), в Go есть другие полезные методы пакета time:
time.Now()— текущее локальное времяtime.Now().UTC()— текущее время в UTCtime.Now().Unix()— Unix timestamp (количество секунд с 01.01.1970)time.Now().UnixNano()— Unix timestamp в наносекундах
Парсинг строки в время
Для обратной задачи — преобразования строки в time.Time — используется функция time.Parse() с тем же эталонным форматом:
func main() {
timeStr := "15.10.2023 14:30:45"
parsedTime, err := time.Parse("02.01.2006 15:04:05", timeStr)
if err != nil {
fmt.Println("Ошибка парсинга:", err)
return
}
fmt.Println(parsedTime) // 2023-10-15 14:30:45 +0000 UTC
}
Популярные форматы и их эталонные шаблоны
| Формат | Пример | Шаблон Go |
|---|---|---|
| YYYY-MM-DD | 2023-10-15 | "2006-01-02" |
| DD.MM.YYYY HH:MM:SS | 15.10.2023 14:30:45 | "02.01.2006 15:04:05" |
| RFC3339 | 2023-10-15T14:30:45Z | time.RFC3339 |
| Unix timestamp | 1697376645 | time.Now().Unix() |
Работа с часовыми поясами
Если нужно получить время в определённом часовом поясе, используйте time.LoadLocation():
func main() {
loc, _ := time.LoadLocation("Europe/Moscow")
moscowTime := time.Now().In(loc)
fmt.Println(moscowTime.Format("02.01.2006 15:04:05"))
}
Этот подход может показаться необычным поначалу, но он исключает путаницу с кодами форматирования и делает код более читаемым. Запомните эталонную дату 1 2 3 4 5 6 7 — и вы легко сможете форматировать время в любом виде!
<<Альтернативный подход: использование констант формата
Go предоставляет несколько предопределённых констант формата в пакете time, которые могут быть полезны:
func main() {
now := time.Now()
// Стандартные форматы
fmt.Println(now.Format(time.RFC3339)) // 2023-10-15T14:30:45Z
fmt.Println(now.Format(time.RFC822)) // 15 Oct 23 14:30 MSK
fmt.Println(now.Format(time.Kitchen)) // 2:30PM
fmt.Println(now.Format(time.Stamp)) // Oct 15 14:30:45
fmt.Println(now.Format(time.DateTime)) // 2023-10-15 14:30:45
}
Форматирование с помощью строковых функций
Если вам неудобно запоминать эталонную дату, можно использовать более "ручной" подход с извлечением компонентов времени:
func main() {
now := time.Now()
formatted := fmt.Sprintf("%02d.%02d.%04d %02d:%02d:%02d",
now.Day(), now.Month(), now.Year(),
now.Hour(), now.Minute(), now.Second())
fmt.Println(formatted) // 15.10.2023 14:30:45
}
Этот способ более привычен для новичков, но он менее производительный и более громоздкий. Рекомендую всё же освоить метод Format() — после небольшой практики он станет интуитивно понятным.