суббота, 1 августа 2020 г.

Пакет time в Golang, тип Time, методы Sub, Truncate, Round

Метод Sub

func (t Time) Sub(u Time) Duration

Sub возвращает продолжительность t-u. Если результат превышает максимальное (или минимальное) значение, которое может быть сохранено в Duration, будет возвращена максимальная (или минимальная) продолжительность. Чтобы вычислить t-d для продолжительности d, используйте t.Add(-d).

Пример использования Sub

package main

import (
    "fmt"
    "time"
)

func main() {
    start := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)
    end := time.Date(2000, 1, 1, 12, 0, 0, 0, time.UTC)

    difference := end.Sub(start)
    fmt.Printf("difference = %v\n", difference)

}

Вывод:

difference = 12h0m0s

Метод Truncate

func (t Time) Truncate(d Duration) Time

Truncate возвращает результат округления t до значения, кратного d (начиная с нулевого времени). Если d <= 0, Truncate возвращает t без любых монотонных показаний часов, но в остальном без изменений.

Truncate действует над временем как абсолютной продолжительностью с нулевого времени; он не действует в форме представления времени. Таким образом, Truncate(Hour) может возвращать время с ненулевой минутой, в зависимости от Location времени.

Пример использования Truncate

package main

import (
    "fmt"
    "time"
)

func main() {
    t, _ := time.Parse("2006 Jan 02 15:04:05", "2012 Dec 07 12:15:30.918273645")
    trunc := []time.Duration{
        time.Nanosecond,
        time.Microsecond,
        time.Millisecond,
        time.Second,
        2 * time.Second,
        time.Minute,
        10 * time.Minute,
    }

    for _, d := range trunc {
        fmt.Printf("t.Truncate(%5s) = %s\n", d, 
                   t.Truncate(d).Format("15:04:05.999999999"))
    }
    // Чтобы округлить до последней полуночи 
    // в местном часовом поясе, создаем новую Date.
    midnight := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, time.Local)
    _ = midnight

}

Вывод:

t.Truncate(  1ns) = 12:15:30.918273645
t.Truncate(  1µs) = 12:15:30.918273
t.Truncate(  1ms) = 12:15:30.918
t.Truncate(   1s) = 12:15:30
t.Truncate(   2s) = 12:15:30
t.Truncate( 1m0s) = 12:15:00
t.Truncate(10m0s) = 12:10:00

Метод Round

func (t Time) Round(d Duration) Time

Round возвращает результат округления t до ближайшего кратного d (начиная с нулевого времени). Поведение при округлении для значений на полпути заключается в округлении. Если d <= 0, Round возвращает t без любых монотонных показаний часов, но в остальном без изменений.

Round действует над временем как абсолютной продолжительностью с нулевого времени; он не действует в форме представления времени. Таким образом, Round(Hour) может возвращать время с ненулевой минутой, в зависимости от Location времени.

Отличие от метода Truncate заключается в том, что Truncate возвращает результат округления t до кратного d, а Round возвращает результат округления t до ближайшего кратного d.

Пример использования Round

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.Date(0, 0, 0, 12, 15, 30, 918273645, time.UTC)
    round := []time.Duration{
        time.Nanosecond,
        time.Microsecond,
        time.Millisecond,
        time.Second,
        2 * time.Second,
        time.Minute,
        10 * time.Minute,
        time.Hour,
    }

    for _, d := range round {
        fmt.Printf("t.Round(%6s) = %s\n", d, t.Round(d).Format("15:04:05.999999999"))
    }
}

Вывод:

t.Round(   1ns) = 12:15:30.918273645
t.Round(   1µs) = 12:15:30.918274
t.Round(   1ms) = 12:15:30.918
t.Round(    1s) = 12:15:31
t.Round(    2s) = 12:15:30
t.Round(  1m0s) = 12:16:00
t.Round( 10m0s) = 12:20:00
t.Round(1h0m0s) = 12:00:00


Читайте также:


Комментариев нет:

Отправить комментарий