Zeit subtrahieren. Dauer von der Zeit in Go

104

Ich habe einen time.TimeWert von erhalten time.Now()und möchte eine andere Zeit erhalten, die genau 1 Monat her ist.

Ich weiß, dass Subtrahieren mit möglich ist time.Sub()(was einen anderen will time.Time), aber das führt zu a time.Durationund ich brauche es umgekehrt.

Martijn van Maasakkers
quelle

Antworten:

123

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

Produziert:

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

Spielplatz: http://play.golang.org/p/QChq02kisT

lnmx
quelle
32
Was ist mit dem Subtrahieren einer Zeit?
Thomas Browne
SubZeit subtrahieren. Duh!
Abhi
139

Als Antwort auf den Kommentar von Thomas Browne, da die Antwort von lnmx nur zum Subtrahieren eines Datums funktioniert, ist hier eine Modifikation seines Codes, die zum Subtrahieren der Zeit von einer Zeit funktioniert. Zeittyp.

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

Produziert:

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

Ganz zu schweigen davon, dass Sie auch time.Houroder time.Secondanstelle time.MinuteIhrer Bedürfnisse verwenden können.

Spielplatz: https://play.golang.org/p/DzzH4SA3izp

cchio
quelle
4
Benutzer nicht ParseDurationfür statische Werte! Verwenden Sie einfach -10 * time.Minute, dafür sind diese Konstanten definiert. ZB ist einfach time.Now().Add(-10 * time.Minute)alles was du brauchst.
Dave C
21
Wow, die Zeit-API ist so inkonsistent. time.Add fügt eine Dauer hinzu, während time.Sub eine Zeit subtrahiert. Ich bin froh, dass ich diese Antwort gefunden habe, weil ich mir die Sub-Funktion angesehen habe und nie gedacht hätte, dass sie eine andere Signatur als Add hat.
Laurent
8
Beachten Sie auch, dass go implizit in konvertiert wird now.Add(-10 * time.Minute), now.Add(time.Duration(-10) * time.Minute)falls Sie beim Multiplizieren einer Dauer mit einem int-Wert einen Fehler erhalten ...
notzippy
51

Sie können Folgendes negieren time.Duration:

then := now.Add(- dur)

Sie können sogar ein time.Durationgegen vergleichen 0:

if dur > 0 {
    dur = - dur
}

then := now.Add(dur)

Ein funktionierendes Beispiel finden Sie unter http://play.golang.org/p/ml7svlL4eW

docwhat
quelle
2
Es gibt jedoch einen Haken: Funktioniert -1 * dur, d := -1 ; dur = d * durgeneriert jedoch einen Fehler: "Nicht übereinstimmende Typen int und time.Duration"
BlakBat
4
Das ist die richtige Antwort für den Titel der Frage und sollte als Antwort markiert werden.
Selalerer
0

Es gibt, time.ParseDurationdie gerne negative Dauern akzeptieren, wie im Handbuch beschrieben . Andernfalls müssen Sie keine Dauer negieren, bei der Sie zunächst eine genaue Dauer erhalten können.

Wenn Sie beispielsweise anderthalb Stunden abziehen müssen, können Sie dies folgendermaßen tun:

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
quelle