Soustraction du temps Durée du temps dans Go

104

J'ai une time.Timevaleur obtenue à partir de time.Now()et je veux obtenir une autre heure, il y a exactement 1 mois.

Je sais que soustraire est possible avec time.Sub()(qui en veut un autre time.Time), mais cela se traduira par un time.Durationet j'en ai besoin dans l'autre sens.

Martijn van Maasakkers
la source

Réponses:

124

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

Produit:

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

Aire de jeu: http://play.golang.org/p/QChq02kisT

lnmx
la source
33
qu'en est-il de soustraire un temps?
Thomas Browne
Subpour soustraire le temps. Duh!
Abhi
140

En réponse au commentaire de Thomas Browne, parce que la réponse de lnmx ne fonctionne que pour soustraire une date, voici une modification de son code qui fonctionne pour soustraire le temps d'un type 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)
}

Produit:

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

Sans oublier, vous pouvez également utiliser time.Hourou à la time.Secondplace de time.Minuteselon vos besoins.

Aire de jeu: https://play.golang.org/p/DzzH4SA3izp

Cchio
la source
4
N'utilisez pas ParseDurationde valeurs statiques! Utilisez simplement -10 * time.Minute, c'est pour cela que ces constantes sont définies. Par exemple, time.Now().Add(-10 * time.Minute)c'est tout ce dont vous auriez besoin.
Dave C
22
Wow, l'API de temps est tellement incohérente. time.Add consiste à ajouter une durée, tandis que time.Sub consiste à soustraire un temps. Heureux d'avoir trouvé cette réponse car je regardais la fonction Sub et je n'aurais jamais deviné qu'elle a une signature différente de Add.
laurent
8
Notez également que passer implicitement convertis now.Add(-10 * time.Minute)à now.Add(time.Duration(-10) * time.Minute)au cas où votre obtenir une erreur lors de la multiplication d' une durée d'une valeur int ...
notzippy
51

Vous pouvez annuler un time.Duration:

then := now.Add(- dur)

Vous pouvez même comparer un time.Durationcontre 0:

if dur > 0 {
    dur = - dur
}

then := now.Add(dur)

Vous pouvez voir un exemple de travail sur http://play.golang.org/p/ml7svlL4eW

doc what
la source
2
Il y a cependant un hic: -1 * durfonctionnera, mais d := -1 ; dur = d * durgénérera une erreur: "types incompatibles int et time.Duration"
BlakBat
4
C'est la bonne réponse pour le titre de la question et elle doit être marquée comme réponse.
selalerer
0

Il y en a time.ParseDurationqui accepteront volontiers les durées négatives, selon le manuel . Autrement dit, il n'est pas nécessaire d'annuler une durée où vous pouvez obtenir une durée exacte en premier lieu.

Par exemple, lorsque vous devez soustraire une heure et demie, vous pouvez le faire comme suit:

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
la source