两个time.Time对象之间的差异

时间:2016-10-26 11:03:28

标签: datetime go time

Go'非常新鲜。问题可能是基本问题。

我有两次time.Time对象,我希望在小时/分钟/秒方面得到两者之间的差异。让我们说:

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,但无法做出任何改变。

4 个答案:

答案 0 :(得分:20)

您可以使用Time.Sub()来获取2 time.Time个值之间的差异,结果将是time.Duration的值。

打印时,time.Duration“智能地”自行格式化:

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

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

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

输出:

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

如果您需要时间格式HH:mm:ss,您可以构建time.Time值并使用其Time.Format()方法,如下所示:

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

输出:

00:05:41

尝试Go Playground上的示例。

当然,这只有在时差小于一天时才有效。如果差异可能更大,那么这是另一个故事。结果必须包括日,月和年。复杂性显着增加。有关详细信息,请参阅此问题:

golang time.Since() with months and years

那里提出的解决方案通过显示带签名的函数来解决这个问题:

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

即使您的时间在24小时内(在这种情况下yearmonthday将是0),您也可以使用它。

答案 1 :(得分:7)

实际上,time软件包的文档确实在讨论它:

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

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

您应该使用Duration生成Sub()个对象,然后使用其中一个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())
}

答案 2 :(得分:2)

补充Shmulik Klein的回答:

计算不相交的小时/分钟/秒的另一种方法。持续时间:

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小时36分钟25.999999999999375秒

请注意:

  • 由于使用了float64类型而导致的轻微精度损失
  • 我们忽略闰秒并假设每分钟有60秒

答案 3 :(得分:0)

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

    }
}