Разберём тип
Duration, операции сложения и вычитания дат, сравнение и работу с часовыми поясами.Duration
time.Duration — это промежуток времени в наносекундах. Создаётся через умножение на константы пакета:d := 5 * time.Second
d := 2*time.Hour + 30*time.Minute
d := time.Duration(500) * time.Millisecond
Можно распарсить из строки:
d, err := time.ParseDuration("1h30m")
d, err := time.ParseDuration("2h45m30s")
d, err := time.ParseDuration("100ms")
d, err := time.ParseDuration("-1h") // отрицательная длительностьУ
Duration есть методы для конвертации в нужные единицы:d := 2*time.Hour + 30*time.Minute + 45*time.Second
d.Hours() // 2.5125
d.Minutes() // 150.75
d.Seconds() // 9045
d.Milliseconds() // 9045000
d.String() // 2h30m45s
Доступные константы:
time.Nanosecond // 1
time.Microsecond // 1000 наносекунд
time.Millisecond // 1000 микросекунд
time.Second // 1000 миллисекунд
time.Minute // 60 секунд
time.Hour // 60 минут
Арифметика времени
Добавить
Duration к time.Time:now := time.Now()
future := now.Add(24 * time.Hour)
future := now.Add(2*time.Hour + 30*time.Minute)
Для календарных операций (где важны границы месяцев и лет) есть
AddDate():nextMonth := now.AddDate(0, 1, 0) // +1 месяц
nextYear := now.AddDate(1, 0, 0) // +1 год
lastWeek := now.AddDate(0, 0, -7) // -7 дней
Разница между двумя моментами:
diff := future.Sub(now) // возвращает Duration
fmt.Println(diff.Hours())
Два удобных сокращения:
elapsed := time.Since(start) // то же, что time.Now().Sub(start)
remaining := time.Until(deadline) // то же, что deadline.Sub(time.Now())
Сравнение
Методы
Before(), After() и Equal() делают то, что ожидаешь:t1 := time.Now()
t2 := t1.Add(time.Hour)
t1.Before(t2) // true
t1.After(t2) // false
t1.Equal(t2) // false
Начиная с Go 1.20 появился метод
Compare(), который возвращает -1, 0 или 1:cmp := t1.Compare(t2) // -1 (t1 раньше t2)
Таймзоны
Загрузка таймзоны по имени IANA:
nyc, err := time.LoadLocation("America/New_York")
tokyo, err := time.LoadLocation("Asia/Tokyo")
utc := time.UTC
local := time.LocalКонвертация между зонами:
now := time.Now()
utcTime := now.UTC()
nycTime := now.In(nyc)
Создание времени сразу в нужной зоне:
t := time.Date(2024, 1, 15, 10, 30, 0, 0, nyc)
Получить информацию о текущей зоне:
name, offset := now.Zone()
fmt.Println(name, offset) // EST -18000 (смещение в секундах)
Если нужна зона с фиксированным смещением:
est := time.FixedZone("EST", -5*60*60)Важный момент:
time.LoadLocation() ищет данные IANA в системе. Если на сервере нет файла tzdata, вызов вернёт ошибку. В Go 1.15 появился пакет time/tzdata, который вшивает базу зон прямо в бинарник. Достаточно импорта:import _ "time/tzdata"
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoDeep