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.Time
waarden, resultaat zal een waarde zijn van time.Duration
.
Wanneer afgedrukt, maakt een time.Duration
zichzelf “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:ss
wilt, kunt u een time.Time
waarde 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
, month
en day
zullen 0
).
Antwoord 2, autoriteit 17%
Eigenlijk wordt er in de documentatie van het time
pakket over gesproken:
https://godoc.org/time#Time.Sub
https://godoc.org/time#Duration.Hours
U moet een object Duration
maken 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
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))
}
}
}