Odejmowanie czasu Czas trwania od czasu w Go

104

Mam time.Timewartość uzyskaną z time.Now()i chcę uzyskać inny czas, czyli dokładnie 1 miesiąc temu.

Wiem, że odejmowanie jest możliwe z time.Sub()(który chce innego time.Time), ale to spowoduje a time.Durationi potrzebuję tego na odwrót.

Martijn van Maasakkers
źródło

Odpowiedzi:

124

Wypróbuj 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)
}

Produkuje:

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

Plac zabaw: http://play.golang.org/p/QChq02kisT

lnmx
źródło
33
a co z odejmowaniem czasu?
Thomas Browne
Subaby odjąć czas. Duh!
Abhi
140

W odpowiedzi na komentarz Thomasa Browne'a, ponieważ odpowiedź lnmx działa tylko w przypadku odejmowania daty, oto modyfikacja jego kodu, która działa w celu odejmowania czasu od czasu.

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)
}

Produkuje:

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

Nie wspominając o tym, że możesz również użyć time.Hourlub time.Secondzamiast time.Minutezgodnie ze swoimi potrzebami.

Plac zabaw: https://play.golang.org/p/DzzH4SA3izp

cchio
źródło
4
Nie ParseDurationużywaj wartości statycznych! Po prostu użyj -10 * time.Minute, po to są zdefiniowane te stałe. Np. time.Now().Add(-10 * time.Minute)To wszystko, czego potrzebujesz.
Dave C
22
Wow, API czasu jest tak niespójne. time.Add to dodanie czasu trwania, a time.Sub to odjęcie czasu. Cieszę się, że znalazłem tę odpowiedź, ponieważ patrzyłem na funkcję Sub i nigdy bym nie zgadł, że ma inny podpis niż Add.
laurent
8
Zwróć również uwagę, że idź niejawnie konwertuje now.Add(-10 * time.Minute)do now.Add(time.Duration(-10) * time.Minute)w przypadku, gdy pojawi się błąd podczas mnożenia czasu trwania przez wartość int ...
notzippy
51

Możesz zanegować time.Duration:

then := now.Add(- dur)

Możesz nawet porównać time.Durationz 0:

if dur > 0 {
    dur = - dur
}

then := now.Add(dur)

Możesz zobaczyć działający przykład pod adresem http://play.golang.org/p/ml7svlL4eW

docwhat
źródło
2
Jest jednak pewien haczyk: -1 * durzadziała, ale d := -1 ; dur = d * durwygeneruje błąd: „niedopasowane typy int i time.Duration”
BlakBat
4
To jest właściwa odpowiedź na tytuł pytania i należy ją zaznaczyć jako odpowiedź.
selalerer
0

Są, time.ParseDurationktóre z radością zaakceptują negatywne czasy trwania, zgodnie z instrukcją . W przeciwnym razie nie ma potrzeby negowania czasu trwania, w którym można uzyskać dokładny czas trwania w pierwszej kolejności.

Np. Kiedy musisz odjąć półtorej godziny, możesz to zrobić w następujący sposób:

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

sanmai
źródło