【问题标题】:RFC3339 time parsing in golanggolang 中的 RFC3339 时间解析
【发布时间】:2016-06-20 17:31:38
【问题描述】:

我正在从数据库中提取时间戳,它使用 RFC3339 格式,但缺少时区。因此,当我尝试比较时间戳时,它将关闭。如何将 dbtime 更改为东部时间?

// time format
const
(
    RFC3339     = "2006-01-02T15:04:05Z07:00"
)

//now time
now := time.Now()
nowtime := now.Unix()

fmt.Println("Nowtime:", nowtime)
fmt.Println("Now:", now)

//time in db
fmt.Println("Dbtime string:", dbtime)
udbtime, err := time.Parse.EST(RFC3339,dbtime)
fmt.Println("RFC3339: " + RFC3339)
fmt.Println("dbtime parsed", udbtime)
fmt.Println("dbtime parsed unixtime", udbtime.Unix())

我的输出是

Nowtime: 1466443640
Now: 2016-06-20 13:27:20.963232824 -0400 EDT
Dbtime string: 2016-06-20T12:41:45.14Z
RFC3339: 2006-01-02T15:04:05Z07:00
dbtime parsed 2016-06-20 12:41:45.14 +0000 UTC
dbtime parsed unixtime 1466426505

【问题讨论】:

  • 举一个你正在解析的dbtime的例子。
  • 时区没有丢失,2016-06-20T12:41:45.14Z 的时间是 UTC。
  • 对不起原始时间戳。是 2016-06-20T12:41:45.14Z 但它实际上在 EDT。
  • 所以你想改变时区?
  • 2016-06-20T12:41:45.14Z 不能是 EDT,因为尾随的 Z 指定 UTC,所以您需要自己修复时间。

标签: parsing go time unix-timestamp rfc3339


【解决方案1】:

您可以使用定义的 time.RFC3339 解析时间戳,就像您展示的那样,并在事后通过添加 UTC 偏移量来调整它们,以便它们在 UTC 中是正确的。

udbtime = udbtime.Add(4*time.Hour)

但是,这要求您检查每次是否在 EST 或 EDT 中添加正确的偏移量,除非您可以假设它们都是 EDT。

更好的方法是使用您自己的时间格式而不使用特定的 TZ 偏移量(Z 不是用于解析的时间规范的一部分),并使用 time.ParseInLocation 对其进行解析。

通过这种方式,您可以根据时间是 EST 还是 EDT 来计算正确的偏移量。

https://play.golang.org/p/IrUnTwvlkk

RFC3339local := "2006-01-02T15:04:05Z"

loc, err := time.LoadLocation("America/New_York")
if err != nil {
    log.Fatal(err)
}

ts1 := "2016-06-20T12:41:45.14Z"
t1, _ := time.ParseInLocation(RFC3339local, ts1, loc)
fmt.Println(t1)
// prints: 2016-06-20 12:41:45.14 -0400 EDT

ts2 := "2016-01-20T12:41:45.14Z"
t2, _ = time.ParseInLocation(RFC3339local, ts2, loc)
fmt.Println(t2)
// prints: 2016-01-20 12:41:45.14 -0500 EST

【讨论】:

    【解决方案2】:

    你可以试试 go-carbon,一个简单的、语义化的、对开发者友好的用于日期时间的 golang 包

    carbon.Parse("2020-12-31").ToRfc3339String() 
    //  output
    2020-12-31T00:00:00+08:00
    

    https://github.com/golang-module/carbon

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多