web-dev-qa-db-fra.com

Différence entre deux objets time.Time

Très nouveau sur le 'Go'. La question pourrait être simple.

J'ai deux objets time.Time et je veux faire la différence entre les deux en termes d'heures/minutes/secondes. Disons:

t1 = 2016-09-09 19:09:16 +0530 IST
t2 = 2016-09-09 19:09:16 +0530 IST

Dans le cas ci-dessus, puisque la différence est 0. Cela devrait me donner 00:00:00. Prenons un autre cas:

t1 = 2016-09-14 14:12:48 +0530 IST
t2 = 2016-09-14 14:18:29 +0530 IST

Dans ce cas, la différence serait de 00:05:41. J'ai regardé le https://godoc.org/time mais je n'ai rien pu en faire.

17
Hemant Bhargava

Vous pouvez utiliser Time.Sub() pour obtenir la différence entre les 2 time.Time valeurs, le résultat sera une valeur de time.Duration .

Une fois imprimé, un time.Duration Se formate "intelligemment":

t1 := time.Now()
t2 := t1.Add(time.Second * 341)

fmt.Println(t1)
fmt.Println(t2)

diff := t2.Sub(t1)
fmt.Println(diff)

Sortie:

2009-11-10 23:00:00 +0000 UTC
2009-11-10 23:05:41 +0000 UTC
5m41s

Si vous voulez le format d'heure HH:mm:ss, Vous pouvez construire une valeur time.Time Et utiliser sa méthode Time.Format() comme ceci:

out := time.Time{}.Add(diff)
fmt.Println(out.Format("15:04:05"))

Sortie:

00:05:41

Essayez les exemples sur le Go Playground .

Bien sûr, cela ne fonctionnera que si le décalage horaire est inférieur à un jour. Si la différence peut être plus grande, alors c'est une autre histoire. Le résultat doit inclure des jours, des mois et des années. La complexité augmente considérablement. Voir cette question pour plus de détails:

golang time.Depuis () avec mois et années

La solution présentée ici résout ce problème en affichant une fonction avec signature:

func diff(a, b time.Time) (year, month, day, hour, min, sec int)

Vous pouvez l'utiliser même si vos heures sont dans les 24 heures (auquel cas year, month et day seront 0).

26
icza

En fait, la documentation du package time en parle:

https://godoc.org/time#Time.Sub

https://godoc.org/time#Duration.Hours

Vous devez produire un objet Duration à l'aide de Sub(), puis utiliser l'un des Seconds(), Minutes(), Hours().

package main

import (
        "fmt"
        "time"
)

func main() {
        t1 := time.Date(1984, time.November, 3, 13, 0, 0, 0, time.UTC)
        t2 := time.Date(1984, time.November, 3, 10, 0, 0, 0, time.UTC)
        fmt.Printf("The hours diffrence is: %d", t1.Sub(t2).Hours())
}
8
Shmulik Klein

Pour compléter la réponse de Shmulik Klein:

Une autre façon de calculer des heures/minutes/secondes disjointes sur un temps.

https://play.golang.org/p/VRoXG5NxLo

package main

import (
    "fmt"
    "math"
    "time"
)

func main() {
    t1 := time.Date(1984, time.November, 3, 13, 0, 0, 0, time.UTC)
    t2 := time.Date(1984, time.November, 3, 10, 23, 34, 0, time.UTC)

    hs := t1.Sub(t2).Hours()

    hs, mf := math.Modf(hs)
    ms := mf * 60

    ms, sf := math.Modf(ms)
    ss := sf * 60

    fmt.Println(hs, "hours", ms, "minutes", ss, "seconds")
}

2 heures 36 minutes 25.999999999999375 secondes

remarque:

  • légère perte de précision due à l'utilisation du type float64
  • nous ignorons les secondes intercalaires et supposons que chaque minute a 60 secondes
2
thwd