如何在 golang 中转换 ISO 8601 时间



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

如果您正在寻找一个简单但不完美的解决方案,请考虑使用time.RFC3339常量。 但也要知道,ISO8601之间存在差异,对于这个答案来说太复杂了。

请参阅 https://ijmacd.github.io/rfc3339-iso8601/以了解差异,并且还有一个方便的测试文件生成器来显示差异。这里也有关于SO的很好的讨论ISO 8601和RFC 3339日期格式有什么区别?

package main
import (
    "time"
    "fmt"
)
func main(){
    fmt.Println(time.Now().Format(time.RFC3339))
}

戈朗时间.格式

package main
import (
    "fmt"
    "time"
)
func main() {
    fmt.Println(time.Now().UTC().Format("2006-01-02T15:04:05-0700"))
}

我有以下规格:

YYYY-MM-DDThh:mm:ss.sssZ

最终Z明确出现在示例中。

以下是我的处理方式:

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

这是

2006-01-02T15:04:05.999Z

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

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

披露:我写了那个库。

将格式中的符号替换为 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. 

最新更新