我从数据库中提取时间戳,它使用的是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
答案 0 :(得分:0)
您可以使用已显示的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
答案 1 :(得分:0)
你可以试试 go-carbon,一个简单的、语义化的、对开发者友好的日期时间 golang 包
carbon.Parse("2020-12-31").ToRfc3339String()
// output
2020-12-31T00:00:00+08:00
答案 2 :(得分:-1)
如果您100%确定数据库中的时区不正确,可以将其转换为
t2 := time.Date(
t.Year(),
t.Month(),
t.Day(),
t.Hour(),
t.Minute(),
t.Second(),
t.Nanosecond(),
time.FixedZone("EDT", -4*60*60),
)