Verschil tussen twee time.Time-objecten

Erg nieuw voor de ‘Go’. Vraag kan een basisvraag zijn.

Ik heb twee time.Time-objecten en ik wil het verschil tussen de twee zien in uren/minuten/seconden. Laten we zeggen:

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

In het bovenstaande geval, aangezien het verschil 0 is. Het zou me 00:00:00 moeten geven. Overweeg een ander geval:

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

In dit geval zou het verschil 00:05:41 zijn. Ik keek naar de https://godoc.org/timemaar kon er niets van maken.


Antwoord 1, autoriteit 100%

Je mag Time.Sub()gebruiken om het verschil te krijgen tussen de 2 time.Timewaarden, resultaat zal een waarde zijn van time.Duration.

Wanneer afgedrukt, maakt een time.Durationzichzelf “intelligent” op:

t1 := time.Now()
t2 := t1.Add(time.Second * 341)
fmt.Println(t1)
fmt.Println(t2)
diff := t2.Sub(t1)
fmt.Println(diff)

Uitvoer:

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

Als u de tijdnotatie HH:mm:sswilt, kunt u een time.Timewaarde maken en de Time.Format()methode als volgt:

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

Uitvoer:

00:05:41

Probeer de voorbeelden op de Go Playground.

Dit werkt natuurlijk alleen als het tijdsverschil minder dan een dag is. Als het verschil groter mag zijn, dan is het een ander verhaal. Het resultaat moet dagen, maanden en jaren bevatten. De complexiteit neemt aanzienlijk toe. Zie deze vraag voor details:

golang-tijd.Since() met maanden en jaren

De daar gepresenteerde oplossing lost dit probleem op door een functie met handtekening weer te geven:

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

Je mag dat gebruiken, zelfs als je tijden binnen 24 uur zijn (in dat geval year, monthen dayzullen 0).


Antwoord 2, autoriteit 17%

Eigenlijk wordt er in de documentatie van het timepakket over gesproken:

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

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

U moet een object Durationmaken met Sub()en vervolgens een van de 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 difference is: %f", t1.Sub(t2).Hours())
}

Antwoord 3, autoriteit 4%

Als aanvulling op het antwoord van Shmulik Klein:

Een andere manier om onsamenhangende uren/minuten/seconden uit een tijd te berekenen. Duur:

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 uur 36 minuten 25.999999999999375 seconden

opmerking:

  • licht precisieverlies door het gebruik van het type float64
  • we negeren schrikkelseconden en gaan ervan uit dat elke minuut 60 seconden heeft

Antwoord 4

DEMO


package main
import (
    "fmt"
    "math"
    "time"
)
func TimeAsString(dt float64) string {
    time := dt
    hours := math.Floor(time / 3600)
    minutes := math.Ceil(math.Mod(time, 3600)/60) - 1
    seconds := int(time) % 60
    return fmt.Sprintf("%v:%v:%v", hours, minutes, seconds)
}
func main() {
    mytime := 0.0
    last := time.Now()
    tick := time.Tick(33 * time.Millisecond)
    for {
        select {
        case <-tick:
            dt := time.Since(last).Seconds()
            last = time.Now()
            mytime += dt
            fmt.Println(TimeAsString(mytime))
        }
    }
}

Other episodes