【问题标题】:How to get difference between timestamps (either between strings or time.time) [duplicate]如何获取时间戳之间的差异(字符串或 time.time 之间)[重复]
【发布时间】:2019-10-08 00:07:02
【问题描述】:

我有一个问题:我需要知道 golang 中两个时间戳之间的差异/持续时间。因此,我使用时间库(https://golang.org/pkg/time/)。

如果我有两个“time.time”类型的时间戳,使用“time.Sub()”很容易获得差异。我的问题是我的一个时间戳来自另一个函数,只能将其作为字符串传输:

t1 := "2009-11-10 23:00:00 +0000 UTC m=+0.000000001" //类型:字符串

t2 := time.Now() //类型:time.time

现在我必须了解基本的可能性:

A) 也将 t2 转换为字符串,并尝试找出两个字符串之间的差异(UGLY)

B) 将t1从“string”类型转换为“time.time”类型,然后应用“time.Sub()”

我想走 B)。因此,我发现

time.Parse(格式,时间字符串)

应该可以做到。所以我尝试使用 t1 转换

t1_time, err := time.Parse(time.RFC3339, t1)

但结果并不如预期!相反,我得到了这个

0001-01-01 00:00:00 +0000 UTC

并且错误说“错误解析时间“2009-11-10 23:00:02 +0000 UTC m=+2.000000001”为“2006-01-02T15:04:05Z07:00”:无法解析“23: 00:02 +0000 UTC m=+2.000000001" as "T" "。

如果我使用与 t1 相同的自己的时间格式

时间格式 := "2009-11-10 23:00:00 +0000 UTC m=+0.000000001"

t1_time, err := time.Parse(timeformat , t1)

结果仍然错误,我收到错误消息“错误解析时间“2009-11-10 23:00:02 +0000 UTC m=+2.000000001”为“2009-11-10 23:00:00 +0000 UTC m=+0.000000001”:无法将“9-11-10 23:00:02 +0000 UTC m=+2.000000001”解析为“009-”。

我也尝试过 UNIX 时间,但时间库不允许我将字符串转换为 unix。

我做错了什么??!为什么解析不起作用?感谢您的帮助!

【问题讨论】:

  • go 使用静态时间点作为格式化的参考。具体见golang.org/pkg/time/#pkg-constants:这个时间点Mon Jan 2 15:04:05 MST 2006或RFC3339中"2006-01-02T15:04:05Z07:00"
  • 您不应该使用"2009-11-10 23:00:00 +0000 UTC m=+0.000000001" 作为时间格式。不仅解析起来不太方便,而且格式也不稳定。来自文档:“返回的字符串用于调试;为了获得稳定的序列化表示,请使用带有显式格式字符串的t.MarshalTextt.MarshalBinaryt.Format。”
  • 所以你希望你的时间(2009 年的那个)在t1。但是你希望你的 format2006 字符串格式
  • @Volker 和@Flimzy 我真的对这个很好奇。重复参考处理基本时间分量,但不包括单调分量。如果有人确实时间添加/减去该部分可能非常重要。我想知道这个问题在这方面是否真的是独一无二的?
  • @colminator:您是否建议单调部分与 OP 的答案相关?我没有看到有人提到这一点。如果问题是如何解析单调时间和/或如何比较这些部分,它可能是独一无二的。但在我看来,问题只是:如何编组/ umharshal 时间,以及如何计算差异。副本应该回答这个问题。

标签: string parsing go time timestamp


【解决方案1】:

基本上你想要的:

    t1_raw := "2009-11-10 23:00:00 +0000 UTC m=+0.000000001"
    format := "2006-01-02 15:04:05 -0700 MST"

    // for simplicity t1_raw[:29] discards time's monotonic delta
    // i.e. the " m=+0.000000001" suffix

    t1, err := time.Parse(format, t1_raw[:29])
    if err != nil {
            log.Fatal(err)
    }

    log.Println("Duration ->", t2.Sub(t1))

如果您真的想要包含单调增量,则必须手动解析该数字并将增量应用于t1

游乐场version.

注意: Playground 版本将显示零持续时间 - 因为 Playground 的时钟从 Nov 11 2009 开始 - go 的开创性生日。

【讨论】:

  • 谢谢@colminator!这对我行得通。我不需要单调增量,但它在我使用的参考代码中,所以我现在使用 [:29] 处理它。感谢您的帮助!
猜你喜欢
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
相关资源
最近更新 更多