Тип time.Duration

Тип time.Duration представляет собой промежуток времени и выражается в наносекундах. Он используется во многих функциях пакета time, например, для установки таймаутов, задержек и измерения длительности операций. Значение типа time.Duration может быть как положительным, так и отрицательным.

Синтаксис

Значения time.Duration создаются с помощью числовых литералов с множителями:

goconst (
  dur = 5 * time.Second
)

Также можно преобразовать целое число в time.Duration:

godur := time.Duration(10) * time.Second

Константы длительности

Пакет time предоставляет константы для распространенных единиц измерения времени:

gotime.Nanosecond  // 1 наносекунда
time.Microsecond // 1 микросекунда
time.Millisecond // 1 миллисекунда
time.Second    // 1 секунда
time.Minute    // 1 минута
time.Hour    // 1 час

Обратите внимание, что константа time.Minute равна 60 секундам, а time.Hour - 60 минутам.

Метод Hours

Метод Hours возвращает длительность в часах как число с плавающей точкой:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  dur := 2*time.Hour + 30*time.Minute
  res := dur.Hours()
  fmt.Println(res)
}

Результат выполнения кода:

go"2.5"

Метод Minutes

Метод Minutes возвращает длительность в минутах как число с плавающей точкой:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  dur := 90 * time.Minute
  res := dur.Minutes()
  fmt.Println(res)
}

Результат выполнения кода:

go"90"

Метод Seconds

Метод Seconds возвращает длительность в секундах как число с плавающей точкой:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  dur := 5*time.Second + 500*time.Millisecond
  res := dur.Seconds()
  fmt.Println(res)
}

Результат выполнения кода:

go"5.5"

Метод Milliseconds

Метод Milliseconds возвращает длительность в миллисекундах как целое число:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  dur := 2*time.Second + 300*time.Millisecond
  res := dur.Milliseconds()
  fmt.Println(res)
}

Результат выполнения кода:

go"2300"

Метод Nanoseconds

Метод Nanoseconds возвращает длительность в наносекундах как целое число:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  dur := 2*time.Microsecond + 500*time.Nanosecond
  res := dur.Nanoseconds()
  fmt.Println(res)
}

Результат выполнения кода:

go"2500"

Метод String

Метод String возвращает строковое представление длительности в человекочитаемом формате:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  dur := 3*time.Hour + 15*time.Minute + 30*time.Second
  res := dur.String()
  fmt.Println(res)
}

Результат выполнения кода:

go"3h15m30s"

Метод Truncate

Метод Truncate округляет длительность вниз до ближайшего значения, кратного переданной длительности:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  dur := 2*time.Hour + 45*time.Minute + 30*time.Second
  res := dur.Truncate(time.Hour)
  fmt.Println(res)
}

Результат выполнения кода:

go"2h0m0s"

Метод Round

Метод Round округляет длительность до ближайшего значения, кратного переданной длительности:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  dur := 2*time.Hour + 45*time.Minute + 30*time.Second
  res := dur.Round(time.Hour)
  fmt.Println(res)
}

Результат выполнения кода:

go"3h0m0s"

Метод Abs

Метод Abs возвращает абсолютное значение длительности:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  dur := -10 * time.Second
  res := dur.Abs()
  fmt.Println(res)
}

Результат выполнения кода:

go"10s"

Пример с таймаутом

Рассмотрим использование time.Duration для установки таймаута операции:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  timeout := 5 * time.Second
  
  // Имитация длительной операции
  select {
  case <-time.After(timeout):
    fmt.Println("Operation timed out")
  }
}

Результат выполнения кода:

go"Operation timed out"

Сравнение длительностей

Значения time.Duration можно сравнивать с помощью обычных операторов сравнения:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  dur1 := 10 * time.Second
  dur2 := 5 * time.Second
  
  if dur1 > dur2 {
    fmt.Println("dur1 is longer")
  }
}

Результат выполнения кода:

go"dur1 is longer"

Смотрите также

  • тип time.Time,
    который представляет момент времени
  • функцию time.ParseDuration,
    которая разбирает строку в длительность
  • метод time.Time.Sub,
    который вычисляет разницу между двумя моментами времени
  • метод time.Time.Add,
    который добавляет длительность к моменту времени