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.

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


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


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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.