⏱ Пакет time в Go: длительность, арифметика и таймзоны — 23 мая 2026 г. в 17:14:00.553
⏱ Пакет time в Go: длительность, арифметика и таймзоны Разберём тип 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"

