Sottrazione di tempo Durata dal tempo in Go


104

Ho ottenuto un time.Timevalore da time.Now()e voglio ottenere un altro tempo che è esattamente 1 mese fa.

So che la sottrazione è possibile con time.Sub()(che ne vuole un altro time.Time), ma ciò risulterà in a time.Duratione ne ho bisogno al contrario.

Risposte:


124

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

Produce:

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

Parco giochi: http://play.golang.org/p/QChq02kisT


33
che ne dici di sottrarre un tempo?
Thomas Browne

Subper sottrarre tempo. Duh!
Abhi

140

In risposta al commento di Thomas Browne, poiché la risposta di lnmx funziona solo per sottrarre una data, ecco una modifica del suo codice che funziona per sottrarre tempo da un tipo di tempo.

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

Produce:

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

Per non parlare, puoi anche usare time.Houro al time.Secondposto delle time.Minutetue esigenze.

Parco giochi: https://play.golang.org/p/DzzH4SA3izp


4
Non utilizzare ParseDurationper valori statici! Basta usare -10 * time.Minute, questo è ciò per cui sono definite quelle costanti. Ad esempio, time.Now().Add(-10 * time.Minute)è tutto ciò di cui avresti bisogno.
Dave C

22
Wow, l'API del tempo è così incoerente. time.Add serve per aggiungere una durata, mentre time.Sub serve per sottrarre un tempo. Sono contento di aver trovato questa risposta perché stavo guardando la funzione Sub e non avrei mai immaginato che avesse una firma diversa da Aggiungi.
laurent

8
Nota anche che vai implicitamente converte now.Add(-10 * time.Minute)in now.Add(time.Duration(-10) * time.Minute)nel caso in cui
ricevi

51

Puoi negare un time.Duration:

then := now.Add(- dur)

Puoi anche confrontare un time.Durationcontro 0:

if dur > 0 {
    dur = - dur
}

then := now.Add(dur)

Puoi vedere un esempio funzionante su http://play.golang.org/p/ml7svlL4eW


2
C'è un problema però: -1 * durfunzionerà, ma d := -1 ; dur = d * durgenererà un errore: "tipi non corrispondenti int e time.Duration"
BlakBat

4
Questa è la risposta giusta per il titolo della domanda e dovrebbe essere contrassegnata come risposta.
selalerer

0

C'è time.ParseDurationche accetterà felicemente durate negative, come da manuale . Altrimenti, non è necessario negare una durata in cui è possibile ottenere una durata esatta in primo luogo.

Ad esempio, quando devi sottrarre un'ora e mezza, puoi farlo in questo modo:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.