使用time.Unix()和time.Parse()(具有完全相同的unix时间戳)初始化的time.Time,使用time.Format(“ 2006-01-02”)可以打印出不同的结果
这个问题在操场上无法重现,但是如果我自己编译它就可以解决。
我的默认时区是洛杉矶,可能在不同时区的结果会有所不同。
转到版本 go版本go1.12.1 darwin / amd64
开始构建
./ test
test.go:
package main
import (
"fmt"
"time"
)
func main() {
control1 := time.Unix(1546300800, 0)
test, _ := time.Parse("2006-01-02", "2019-01-01")
fmt.Println("control:", control1.Unix(), control1.Format("2006-01-02"))
fmt.Println("test:", test.Unix(), test.Format("2006-01-02"))
}
./测试 控制:1546300800 2018-12-31 测试:1546300800 2019-01-01
因此UNIX ts相同(1546300800),但日期不同。为什么?
答案 0 :(得分:3)
打印日期不同,因为它们具有不同的时区。
time.Unix()
返回本地时间,而time.Parse()
:
从值中省略的元素假定为零,或者当不可能为零时为1,因此解析“ 3:04 pm”将返回对应于1月1日,年0、15:04:00的时间 UTC < / strong>(请注意,因为年份为0,所以此时间早于零时间)。
time.Parse()
默认情况下返回具有time.Time
区域的UTC
(如果区域信息不是输入和布局的一部分)。
这也解释了为什么您不能在Go Playground上看到它:当地时间是UTC。
在我的本地计算机(CET时区)上打印区域信息:
fmt.Println("control:", control1.Unix(), control1.Format("2006-01-02 -0700"))
fmt.Println("test :", test.Unix(), test.Format("2006-01-02 -0700"))
fmt.Println(control1.Zone())
fmt.Println(test.Zone())
输出:
control: 1546300800 2019-01-01 +0100
test : 1546300800 2019-01-01 +0000
CET 3600
UTC 0
如果您将两个时间都切换到同一区域(例如UTC
或本地时间),则打印日期将相同:
control1 = control1.UTC()
test = test.UTC()
此后,输出:
control: 1546300800 2019-01-01 +0000
test : 1546300800 2019-01-01 +0000
UTC 0
UTC 0