Форматирование текущего времени в Go в формате yyyyMMddHHmmss
Правильный способ форматирования времени в Go
В Go используется уникальный подход к форматированию времени, который отличается от других языков. Вместо символов-заполнителей (как %Y в Python или yyyy в Java) Go использует конкретную референсную дату:
Mon Jan 2 15:04:05 MST 2006
Это запоминается мнемонически: 1 2 3 4 5 6 7 — месяц (January = 1), день (2), час (15 = 3 PM), минута (4), секунда (5), год (2006 = 6), часовой пояс (MST = 7 букв).
Решение вашей задачи
Для формата yyyyMMddHHmmss (год, месяц, день, часы, минуты, секунды) нужно использовать референсные значения:
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
// Формат: 2006 (год), 01 (месяц), 02 (день), 15 (часы 24h), 04 (минуты), 05 (секунды)
formatted := now.Format("20060102150405")
fmt.Println(formatted) // Пример: "20250315143022"
}
Подробное объяснение референсной даты
Каждый компонент даты/времени в Go представлен конкретным числом из референсной даты:
- 2006 — год (4 цифры).
06— год (2 цифры). - 01 — месяц (2 цифры, с ведущим нулём).
1— месяц (без нуля).Jan— сокращённое название месяца. - 02 — день (2 цифры, с ведущим нулём).
2— день (без нуля). - 15 — часы в 24-часовом формате (с нулём).
3— часы в 12-часовом формате (без нуля).03— часы в 12-часовом формате (с нулём). - 04 — минуты (с ведущим нулём).
4— минуты (без нуля). - 05 — секунды (с ведущим нулём).
5— секунды (без нуля). - PM — AM/PM индикатор.
- MST — часовой пояс.
Дополнительные примеры
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
// Формат: yyyy-MM-dd HH:mm:ss
fmt.Println(now.Format("2006-01-02 15:04:05")) // "2025-03-15 14:30:22"
// Формат: dd/MM/yyyy
fmt.Println(now.Format("02/01/2006")) // "15/03/2025"
// Формат: HH:mm:ss
fmt.Println(now.Format("15:04:05")) // "14:30:22"
// Формат с AM/PM
fmt.Println(now.Format("03:04:05 PM")) // "02:30:22 PM"
// Только дата
fmt.Println(now.Format("2006-01-02")) // "2025-03-15"
}
Почему Go использует такой подход?
Основные причины:
- Читаемость: строка формата сама похожа на ожидаемый результат.
"2006-01-02"сразу понятно, что получится"2025-03-15". - Отсутствие путаницы: в других языках легко перепутать
%m(месяц) и%M(минуты). В Go такой проблемы нет. - Гибкость: можно комбинировать любые части даты и текста без экранирования.
Важное замечание
Если вы хотите использовать миллисекунды или наносекунды, добавьте:
now.Format("2006-01-02 15:04:05.000") // миллисекунды (3 цифры)
now.Format("2006-01-02 15:04:05.000000") // микросекунды (6 цифр)
now.Format("2006-01-02 15:04:05.000000000") // наносекунды (9 цифр)
Таким образом, для вашего формата yyyyMMddHHmmss правильный ответ — "20060102150405". Запомните референсную дату Mon Jan 2 15:04:05 MST 2006 — и вы сможете создавать любые форматы.
Альтернативный подход: использование констант для форматов
Если вам неудобно запоминать референсную дату, можно создать функцию-обёртку или использовать константы для часто используемых форматов:
package main
import (
"fmt"
"time"
)
// Константы для форматов
const (
YYYYMMDDHHmmss = "20060102150405"
YYYYMMDD = "20060102"
HHmmss = "150405"
)
func main() {
now := time.Now()
fmt.Println(now.Format(YYYYMMDDHHmmss)) // "20250315143022"
fmt.Println(now.Format(YYYYMMDD)) // "20250315"
fmt.Println(now.Format(HHmmss)) // "143022"
}
Использование библиотеки-помощника
Можно написать небольшую вспомогательную функцию, которая принимает формат в стиле других языков и конвертирует его:
func FormatTime(t time.Time, format string) string {
// Простой конвертер для некоторых форматов
layout := strings.NewReplacer(
"yyyy", "2006",
"MM", "01",
"dd", "02",
"HH", "15",
"mm", "04",
"ss", "05",
).Replace(format)
return t.Format(layout)
}
func main() {
now := time.Now()
fmt.Println(FormatTime(now, "yyyyMMddHHmmss")) // "20250315143022"
}
Важно: такой конвертер — это дополнительный слой абстракции, который может привести к ошибкам при сложных форматах. Лучше привыкнуть к нативному подходу Go — он более гибкий и надёжный.
Рекомендую просто запомнить референсную дату Mon Jan 2 15:04:05 MST 2006 — это займёт 5 минут практики, но сэкономит много времени в будущем.
Ответов пока нет.
Войдите чтобы оставить ответ