我试图通过Go语言了解时间转换的问题。这是代码示例:
MATCH()
它打印以下输出:
package main
import (
"fmt"
"time"
)
func unix2Str(ts int64) string {
const layout = "20060102"
t := time.Unix(ts, 0)
return t.Format(layout)
}
func unixTime(ts string) int64 {
const layout = "20060102"
t, err := time.Parse(layout, ts)
if err != nil {
fmt.Println(err)
return 0
}
return t.Unix()
}
func main() {
ts1 := "20110320"
ts2 := "20110321"
ut1 := unixTime(ts1)
ut2 := unixTime(ts2)
fmt.Println(ts1, ut1, unix2Str(ut1))
fmt.Println(ts2, ut2, unix2Str(ut2))
}
但是,由于我从字符串格式转换为Unix并且反向,我希望字符串格式的日期结果相同。但事实并非如此。实际上,打印的unix时间20110320 1300579200 20110319
20110321 1300665600 20110320
在python中转换为我开始的原始日期,例如
1300579200
这是Go代码中的错误还是我错过了什么?
答案 0 :(得分:8)
这是因为您的本地时区与UTC之间存在差异。 Parse
返回UTC时间,Unix
返回当地时间。例如,
package main
import (
"fmt"
"time"
)
func unix2Str(ts int64) string {
const layout = "20060102"
t := time.Unix(ts, 0)
fmt.Println(t)
return t.Format(layout)
}
func unixTime(ts string) int64 {
const layout = "20060102"
t, err := time.Parse(layout, ts)
if err != nil {
fmt.Println(err)
return 0
}
fmt.Println(t)
return t.Unix()
}
func main() {
ts1 := "20110320"
ts2 := "20110321"
ut1 := unixTime(ts1)
ut2 := unixTime(ts2)
fmt.Println(ts1, ut1, unix2Str(ut1))
fmt.Println(ts2, ut2, unix2Str(ut2))
}
输出:
2011-03-20 00:00:00 +0000 UTC
2011-03-21 00:00:00 +0000 UTC
2011-03-19 20:00:00 -0400 EDT
20110320 1300579200 20110319
2011-03-20 20:00:00 -0400 EDT
20110321 1300665600 20110320
func Parse(layout, value string) (Time, error)
Parse解析格式化的字符串并返回它的时间值 代表。布局通过显示引用如何定义格式 时间,定义为
如果它是值,Mon Jan 2 15:04:05 -0700 MST 2006
将被解释;它就是一个例子 输入格式。然后将对此进行相同的解释 输入字符串。
如果没有时区指示符,Parse将返回UTC时间。
func Unix(sec int64, nsec int64) Time
Unix返回对应于给定Unix时间的本地时间秒 自1970年1月1日UTC以来的秒和nsec纳秒。