我在格式为hh:mm:ss
的日志文件中有一系列类似秒表的时间戳,例如"00:03:30"
。我如何在Golang中解析这些时间戳,以便找到两个时间间隔之间的差异?
例如,替换00:03:30
和00:03:00
应该返回00:00:30
或30
。
答案 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
}
答案 1 :(得分:2)
只需使用time.Parse
和time.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类型。
您将能够进行所需的时间比较。持续时间。
答案 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())
}