Вычитание времени Продолжительность из времени в Go


105

У меня есть time.Timeзначение, полученное из, time.Now()и я хочу получить другое время, ровно 1 месяц назад.

Я знаю, что вычитание возможно с помощью time.Sub()(который хочет другого time.Time), но это приведет к a, time.Durationа мне нужно наоборот.

Ответы:


126

Попробуйте AddDate :

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()

    fmt.Println("now:", now)

    then := now.AddDate(0, -1, 0)

    fmt.Println("then:", then)
}

Производит:

now: 2009-11-10 23:00:00 +0000 UTC
then: 2009-10-10 23:00:00 +0000 UTC

Детская площадка: http://play.golang.org/p/QChq02kisT


33
как насчет вычитания времени?
Томас Браун

Subчтобы вычесть время. Ага!
Абхи

Вычитание времени и вычитание времени - это разные операции. Чтобы вычесть время , вы должны вызвать time.Now (). Sub (time.Time {}), чтобы получить разницу в виде продолжительности. Чтобы вычесть время , скажем, 1 минуту, вам нужно будет сделать time.Now (). Add ( time.Minute * -1 ). Отсутствие симметрии между Sub () и Add () бесит.
jcope

141

В ответ на комментарий Томаса Брауна, поскольку ответ lnmx работает только для вычитания даты, вот модификация его кода, которая работает для вычитания времени из типа time.Time.

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()

    fmt.Println("now:", now)

    count := 10
    then := now.Add(time.Duration(-count) * time.Minute)
    // if we had fix number of units to subtract, we can use following line instead fo above 2 lines. It does type convertion automatically.
    // then := now.Add(-10 * time.Minute)
    fmt.Println("10 minutes ago:", then)
}

Производит:

now: 2009-11-10 23:00:00 +0000 UTC
10 minutes ago: 2009-11-10 22:50:00 +0000 UTC

Не говоря уже о том, что вы также можете использовать time.Hourили time.Secondвместо time.Minuteв соответствии с вашими потребностями.

Игровая площадка: https://play.golang.org/p/DzzH4SA3izp


4
Не используйте ParseDurationстатические значения! Просто используйте -10 * time.Minute, для чего эти константы определены. Например, time.Now().Add(-10 * time.Minute)это все, что вам нужно.
Dave C

22
Вау, API времени настолько непоследователен. time.Add добавляет продолжительность, а time.Sub - вычитает время. Рад, что нашел этот ответ, потому что я смотрел на функцию Sub и никогда бы не догадался, что у нее другая подпись от Add.
Лоран

8
Также обратите внимание , что идут неявно новообращенных now.Add(-10 * time.Minute)к now.Add(time.Duration(-10) * time.Minute)в случае вашего получаю сообщение об ошибке при умножении длительности на целочисленное значение ...
notzippy

52

Вы можете отрицать time.Duration:

then := now.Add(- dur)

Вы даже можете сравнить time.Durationс 0:

if dur > 0 {
    dur = - dur
}

then := now.Add(dur)

Вы можете увидеть рабочий пример на http://play.golang.org/p/ml7svlL4eW


2
Однако есть одна загвоздка: -1 * durбудет работать, но d := -1 ; dur = d * durсгенерирует ошибку: «Несоответствующие типы int и time.Duration»
BlakBat

4
Это правильный ответ для названия вопроса, и он должен быть отмечен как ответ.
selalerer 05

0

Есть такие, time.ParseDurationкоторые с радостью примут отрицательные значения продолжительности, как указано в руководстве . Иначе говоря, нет необходимости отрицать продолжительность, когда вы в первую очередь можете получить точную продолжительность.

Например, когда вам нужно вычесть полтора часа, вы можете сделать это так:

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()

    fmt.Println("now:", now)

    duration, _ := time.ParseDuration("-1.5h")

    then := now.Add(duration)

    fmt.Println("then:", then)
}

https://play.golang.org/p/63p-T9uFcZo

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.