解析hh:mm:来自Go的秒表的时间?

时间:2017-11-02 03:40:04

标签: go time

我在格式为hh:mm:ss的日志文件中有一系列类似秒表的时间戳,例如"00:03:30"。我如何在Golang中解析这些时间戳,以便找到两个时间间隔之间的差异?

例如,替换00:03:3000:03:00应该返回00:00:3030

4 个答案:

答案 0 :(得分:5)

您可以从另一个时间减去一次。

package main

import (
    "fmt"
    "time"
)

func main() {

    t1, err := time.Parse("15:04:05", "03:00:30")
    t2, err := time.Parse("15:04:05", "03:00:00")

    fmt.Println(err, t1.Sub(t2), t1.Sub(t2).Seconds())
}

工作示例 - https://play.golang.org/p/VegXLBvfnM

更新:如何处理24:00:00以上的持续时间?这样可以手动解析它们:

func Parse(st string) (int, error) {
    var h, m, s int
    n, err := fmt.Sscanf(st, "%d:%d:%d", &h, &m, &s)
    fmt.Print(n, err)
    if err != nil || n != 3 {
        return 0, err  
    }
    return h*3600 + m*60 + s, nil
}

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

答案 1 :(得分:2)

只需使用time.Parsetime.Sub

即可

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

package main

import (
    "fmt"
    "time"
)

func main() {
    t1, _ := time.Parse("03:04:05", "00:03:30")
    t2, _ := time.Parse("03:04:05", "00:03:00")

    fmt.Println(t1.Sub(t2)) //30s
}

答案 2 :(得分:1)

对于感兴趣的人,我创建了一个go模块,该模块将HH:MM:SS字符串解析为time.Duration类型。

您将能够进行所需的时间比较。持续时间。

https://github.com/dannav/hhmmss

答案 3 :(得分:-1)

另一种解决方案:https://play.golang.org/p/MHDLSGJIZd

package main

import (
    "fmt"
    "time"
)

// Parse a duration string of "hh:mm:ss" format
func Parse(str string) (time.Duration, error) {
    return time.ParseDuration(str[0:2] + "h" + str[3:5] + "m" + str[6:8] + "s")
}

// Sub subtract 2 durations
func Sub(d1, d2 time.Duration) time.Duration {
    epoch := time.Unix(0, 0)
    t1, t2 := epoch.Add(d1), epoch.Add(d2)
    return t1.Sub(t2)
}

func main() {
    var err error
    var d1, d2 time.Duration

    if d1, err = Parse("60:01:30"); err != nil {
        panic(err)
    }
    if d2, err = Parse("25:00:00"); err != nil {
        panic(err)
    }

    diff := Sub(d1, d2)
    fmt.Println(err, diff, diff.Seconds())
}