【问题标题】:How do I parse an ISO 8601 Timestamp in Go?如何在 Go 中解析 ISO 8601 时间戳?
【发布时间】:2016-11-30 11:13:31
【问题描述】:

我知道我需要在 Go 中使用时间布局(如此处所示 https://golang.org/src/time/format.go),但我找不到 ISO 8601 时间戳的布局。

如果有帮助,我会从 Facebook API 获取时间戳。这是一个示例时间戳:2016-07-25T02:22:33+0000

【问题讨论】:

标签: go time timestamp


【解决方案1】:

我发现这个布局可以工作:"2006-01-02T15:04:05-0700"

【讨论】:

  • 我不知道为什么这个答案被否决了。 time.RFC3339 不起作用,但这种布局有效。
  • time.RFC3339 不适用于 ISO 8601。示例:play.golang.org/p/gIi7D5KuWa
  • 这是不正确的;它是 ISO 8601 的 RFC 3339 子集。值得注意的是,它无法解析 20060102T150405Z。
【解决方案2】:

RFC3339 相当于 ISO 8601。具体来说,格式相同,RFC3339 只是有更严格的要求(例如,它需要完整的 4 位数年份的日期表示)。

What's the difference between ISO 8601 and RFC 3339 Date Formats?

所以你可以使用常量time.RFC3339 作为你的布局。

【讨论】:

  • @TravisSmith 看看这个issue
  • 这个问题是关于不理解“Z07:00”在布局中的含义,但这里的问题是关于冒号。
  • RFC 3339 不等同于 ISO 8601;它是 ISO 8601 允许格式的子集。值得注意的是,使用 time.RFC3339 无法正确解析 20060102T150405Z。
【解决方案3】:

这里的问题是RFC3339 requires 区域偏移量被指定为“+00:00”(或在 UTC 的情况下为“Z”),而 ISO8601 允许它为“+0000”。

来自RFC3339

[...]

time-numoffset  = ("+" / "-") time-hour ":" time-minute
time-offset     = "Z" / time-numoffset

[...]

full-time       = partial-time time-offset
date-time       = full-date "T" full-time

所以而不是 time.RFC3339 布局

"2006-01-02T15:04:05Z07:00"

你必须使用:

"2006-01-02T15:04:05Z0700"

【讨论】:

  • 你的例子有问题。根据您对 RFC 的引用,它是“2006-01-02T15:04:05Z”或“2006-01-02T15:04:05+07:00”。您不能同时拥有“Z”和时区偏移量。
  • @thibpat 在时间戳中你不能,但在 布局字符串 中你可以。在那种情况下,means 中的“Z”表示当时区为 UTC 时,应而不是打印“Z”而不是偏移量。
  • 感谢您的精确,这更有意义,很抱歉没有立即抓住它。
【解决方案4】:

您可以使用日期的某些布局。

 data   := "2022-01-24T00:00:00.000-03:00"
 layout := "2006-01-02T15:04:05.000-03:00"

 dataTime, err :=  time.Parse(layout, data)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 2023-04-11
    • 2014-07-16
    • 2013-03-11
    • 2013-12-06
    • 2010-11-11
    • 2013-04-05
    • 2014-08-16
    相关资源
    最近更新 更多