Уроки модуля (4/5)
Пакет «Время»
The time package models three distinct concepts: instants (time.Time), durations (time.Duration) and periodic tools (timer, ticker). Их различие имеет решающее значение: мгновение — это точка на временной шкале, продолжительность — это интервал.
time.Time — мгновения
now := time.Now() // current instant in the local timezone
utc := now.UTC() // same instant in UTC
later := now.Add(2 * time.Hour) // add a duration
diff := later.Sub(now) // 2h0m0s (it's a Duration)
fmt.Println(now.Year(), now.Month(), now.Day())
fmt.Println(now.Weekday())time.Time является неизменяемым: все методы Add, Truncate, Round возвращают новый Time.
Для сравнения моментов используйте Before, After, Equal. Не используйте ==, если моменты могут иметь разные часовые пояса/монотонные часы.
time.Duration — интервалы
d := 250 * time.Millisecond
fmt.Println(d) // 250ms
fmt.Println(d.Seconds()) // 0.25 (float64)
const timeout = 5 * time.Secondtime.Duration — это псевдоним int64, который отсчитывает наносекунды. The constants time.Nanosecond, time.Microsecond, time.Millisecond, time.Second, time.Minute, time.Hour are of type Duration.
Парсинг и форматирование: эталонный макет
Go не использует строки типа YYYY-MM-DD. Он использует канонический эталонный момент:
Mon Jan 2 15:04:05 MST 2006то есть 01/02 03:04:05PM '06 -0700. Запомнив эту раскладку (мнемоника: 1-2-3-4-5-6-7), вы сможете отформатировать любую дату:
const layout = "2006-01-02 15:04:05"
s := time.Now().Format(layout) // "2026-05-16 14:30:00"
t, err := time.Parse(layout, "2026-05-16 14:30:00")В стандартной библиотеке есть готовые макеты: time.RFC3339 ("2006-01-02T15:04:05Z07:00"), time.RFC1123, time.Kitchen ("3:04PM").
fmt.Println(time.Now().Format(time.RFC3339))Время измерения
start := time.Now()
work()
elapsed := time.Since(start) // = time.Now().Sub(start)
fmt.Println("ci ha messo", elapsed)time.Since использует монотонные часы: на них не влияют настройки системных часов (NTP, летнее время). Для измерения производительности это то, что вам нужно.
Таймер и тикер
time.After(d)возвращаетchan time.Time, который получает только один раз послеd. Полезно вselect:
select {
case res := <-ch:
fmt.Println("ok", res)
case <-time.After(2 * time.Second):
return errors.New("timeout")
}time.NewTimer(d)— останавливаемый вариант (t.Stop()).time.NewTicker(d)отправляет повторно каждыйd. Запомнитеdefer ticker.Stop(), чтобы избежать утечек горутины.
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
fmt.Println("tick")
}Упражнения
Распечатайте текущий момент в формате по времени.RFC3339.
Решение доступно после 3 попыток
Измерьте, сколько времени занимает time.Sleep 10ms, используя time.Since и распечатайте результат.
Решение доступно после 3 попыток
Какого типа константа time.Second?
d := time.Second
// d ha tipo ???