如何在golang中转换ISO 8601时间?

cod*_*efx 46 go

golang中以下shell命令的等效代码是什么? date -u +%Y-%m-%dT%T%z

cik*_*erd 102

package main

import (
    "time"
    "fmt"
)

func main(){
    fmt.Println(time.Now().Format(time.RFC3339))
}
Run Code Online (Sandbox Code Playgroud)

golang Time.Format

  • 据我所知,RFC3339是ISO 8601的更严格版本.因此,如果系统需要ISO,则使用RFC格式可能是安全的. (6认同)
  • ISO 8601和RFC3339在技术上不是一回事。/sf/ask/36557601/ (5认同)
  • 这应该是公认的答案。其他人可能会工作,但是他们一定会使那些不熟悉该代码的人感到困惑。 (2认同)

Cra*_*row 33

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println(time.Now().UTC().Format("2006-01-02T15:04:05-0700"))
}
Run Code Online (Sandbox Code Playgroud)


avi*_*rat 7

我有以下规格:

YYYY-MM-DDThh:mm:ss.sssZ
Run Code Online (Sandbox Code Playgroud)

最终Z明确存在于示例中。

我是这样处理的:

  • 首先我找到了time.RFCxxx离我的目标最近的那个
  • 我复制了它的值
  • 我摆弄它直到我找到预期的结果

这是

2006-01-02T15:04:05.999Z
Run Code Online (Sandbox Code Playgroud)

  • “我摆弄了它”——为什么我们不能有愉快的约会。 (6认同)

dus*_*van 5

用 Z 替换格式中的符号会触发 ISO 8601 行为。这正是时间。RFC3339。如果您希望字符串输出以 'Z' 结尾,您需要做的是转换为 UTC 区域。

package main    
import (
    "fmt"
    "time"
)

func main() {
    fmt.Println(time.Now().UTC().Format("2006-01-02T15:04:05Z07:00"))
}
// this is the same format used by RFC3339. just a note on why. 
Run Code Online (Sandbox Code Playgroud)

  • 多谢!我可以格式化为 ISO8601 基本格式(无冒号): `fmt.Println(time.Now().UTC().Format("20060102T150405Z"))` 事实上它也适用于其他方向:`tm, err :=时间.解析(“20060102T150405Z”,“20220201T204925Z”)` (2认同)

btu*_*bbs 5

ISO8601 允许可变级别的粒度。您可以只有年、年+月、年+月+日,添加时间部分,也可以选择时区部分。但是,Go 的内置时间解析要求您提前知道将包含哪些部分。

github.com/btubbs/datetime 库提供了一个更灵活的解析器,可以处理所有常用的 ISO8601 格式。见https://github.com/btubbs/datetime

披露:我写了那个库。