两个时间的区别,时间对象

刚接触这个问题,问题可能是最基本的。

我有两次机会。时间对象,我想得到两者之间的差异,以小时/分钟/秒为单位。让我们说:

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

在上面的例子中,因为差值是0,所以它应该是00:00:00。考虑另一个例子:

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

在这种情况下,不同将是00:05:41。我看了 https://godoc.org/time,但不能使任何东西出来。

141088 次浏览

Actually, the time package's documentation does discuss it:

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

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

You should produce a Duration object using Sub() and then use one of the 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())
}

You may use Time.Sub() to get the difference between the 2 time.Time values, result will be a value of time.Duration.

When printed, a time.Duration formats itself "intelligently":

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


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


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

Output:

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

If you want the time format HH:mm:ss, you may constuct a time.Time value and use its Time.Format() method like this:

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

Output:

00:05:41

Try the examples on the Go Playground.

Of course this will only work if the time difference is less than a day. If the difference may be bigger, then it's another story. The result must include days, months and years. Complexity increases significnatly. See this question for details:

golang time.Since() with months and years

The solution presented there solves this issue by showing a function with signature:

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

You may use that even if your times are within 24 hours (in which case year, month and day will be 0).

To complement Shmulik Klein's answer:

Another way to calculate disjoint hours/minutes/seconds out of a time.Duration:

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 hours 36 minutes 25.999999999999375 seconds

note:

  • slight precision loss due to the use of the float64 type
  • we ignore leap seconds and assume every minute has 60 seconds

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


}
}






There are 2 common ways:

straight forward one:

startTime := time.Now()
diff := time.Now().Sub(startTime)

shorter one (a bit):

startTime := time.Now()
diff := time.Since(startTime)