golang 中的 RFC3339 时间解析

我正在从数据库中提取时间戳,它使用 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


慕婉清6462132
浏览 447回答 2
2回答

慕村225694

您可以使用所显示的定义解析时间戳time.RFC3339,并在事后通过添加 UTC 偏移量来调整它们,以便它们在 UTC 中是正确的。udbtime = udbtime.Add(4*time.Hour)但是,这要求您检查每次是否落在 EST 或 EDT 中以添加正确的偏移量,除非您可以假设它们都是 EDT。更好的方法是使用您自己的时间格式而不使用特定的 TZ 偏移量(Z 不是用于解析的时间规范的一部分),并使用time.ParseInLocation.这样,您可以根据时间是 EST 还是 EDT 来计算正确的偏移量。https://play.golang.org/p/IrUnTwvlkkRFC3339local := "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 EDTts2 := "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

守着一只汪

你可以试试 go-carbon,一个简单的、语义化的、对开发者友好的 golang 日期时间包carbon.Parse("2020-12-31").ToRfc3339String() //  output2020-12-31T00:00:00+08:00https://github.com/golang-module/carbon
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go