Перейти до основного вмісту
Модуль 8 · Урок 4 із 539/50 у курсі~12 min
Модульні уроки (4/5)

Пакет "час".

Пакет time моделює три різні поняття: миттєві моменти (time.Time), тривалість (time.Duration) і періодичні інструменти (таймер, тікер). Важливо їх розрізняти: мить — це точка на шкалі часу, тривалість — це інтервал.

time.Time — миттєво

Go
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 — інтервали

Go
d := 250 * time.Millisecond
fmt.Println(d)         // 250ms
fmt.Println(d.Seconds()) // 0.25 (float64)

const timeout = 5 * time.Second

time.Duration — це псевдонім int64, який рахує наносекунди. Константи time.Nanosecond, time.Microsecond, time.Millisecond, time.Second, time.Minute, time.Hour мають тип Duration.

Розбір і форматування: довідковий макет

Go не використовує такі рядки, як YYYY-MM-DD. Він використовує канонічний еталонний момент:

Code
Mon Jan 2 15:04:05 MST 2006

тобто 01/02 03:04:05PM '06 -0700. Запам'ятавши цю схему (мнемоніка: 1-2-3-4-5-6-7), ви можете відформатувати будь-яку дату:

Go
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")

stdlib пропонує готові макети: time.RFC3339 ("2006-01-02T15:04:05Z07:00"), time.RFC1123, time.Kitchen ("3:04PM").

Go
fmt.Println(time.Now().Format(time.RFC3339))

Вимірювання часу

Go
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:
Go
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(), щоб уникнути витоків goroutine.
Go
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
    fmt.Println("tick")
}

вправи

вправи#go.m8.l4.e1
Спроби: 0Завантаження…

Надрукувати поточний момент часу, відформатований відповідно до часу.RFC3339.

Завантаження редактора…

Рішення доступне після 3 спроб

вправи#go.m8.l4.e2
Спроби: 0Завантаження…

Виміряйте, скільки часу займає time.Sleep 10 мс за допомогою time.Since та надрукуйте результат.

Завантаження редактора…

Рішення доступне після 3 спроб

Quiz#go.m8.l4.e3
Готовий

Який тип константи `time.Second`?

Go
d := time.Second
// d ha tipo ???
Варіанти відповідей