【问题标题】:convert timestamp from one valid RFC3339 format to another in Go在 Go 中将时间戳从一种有效的 RFC3339 格式转换为另一种格式
【发布时间】:2020-02-04 19:30:15
【问题描述】:

我有2020-01-17T14:41:56.393+0530这种格式的时间戳字符串,我希望它们转换成这种格式2019-01-18T04:32:03Z

该 godoc 上的 time.Parse 方法 documentation 说这些都是有效的 RFC3339 格式,但是我如何将它们从这种形式转换为 Z 形式?

其实我想做的是找出这个格式2020-01-17T14:41:56.393+0530的某个时间戳是否在z格式2019-01-18T04:32:03Z的两个时间戳的范围内

【问题讨论】:

  • 将位置更改为 UTC。
  • 这些不是不同的格式,只是不同的时区。

标签: go timestamp


【解决方案1】:

都是有效的 RFC3339 格式

时间包将RFC3339定义为:

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

所以2020-01-17T14:41:56.393+0530 无效(时区中没有冒号)。有关 Go 对此的处理是否符合 RFC 的讨论,请参阅 this issue

将它们从这种形式转换为 Z 形式

您不需要 - 一旦您转换为 time.Time,该软件包会为您处理时区。例如:

checkTime, err := time.Parse("2006-01-02T15:04:05Z0700", "2020-01-17T14:41:56.393+0530")
if err != nil {
    panic(err)
}
startRange, err := time.Parse(time.RFC3339, "2020-01-18T02:32:03Z")
if err != nil {
    panic(err)
}
endRange, err := time.Parse(time.RFC3339, "2020-01-18T04:32:03Z")
if err != nil {
    panic(err)
}

fmt.Printf("check: %v start: %v end: %v", checkTime, startRange, endRange)
if !startRange.After(checkTime) && !endRange.Before(checkTime) {
    fmt.Println("Check 1 in range")
}

checkTime, err = time.Parse(time.RFC3339, "2020-01-18T09:41:56.393+05:30")
if err != nil {
    panic(err)
}
if !startRange.After(checkTime) && !endRange.Before(checkTime) {
    fmt.Println("Check 2 in range")
}

fmt.Printf("check: %v start: %v end: %v", checkTime.Local(), startRange.Local(), endRange.Local())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多