golang time.Format()为相同的unix时间戳提供不同的结果

golang time.Format()为相同的unix时间戳提供不同的结果,go,time,Go,Time,使用time.Unix()和time.Parse()初始化的time.time具有完全相同的Unix时间戳,使用time.Format(“2006-01-02”)打印时会得到不同的结果 这个问题在操场上是不可复制的,但如果我自己编译的话,我会得到它 我的默认时区是洛杉矶,可能在不同的时区结果会有所不同 围棋版 go版本go1.12.1达尔文/amd64 建造 /测试 test.go: 主程序包 进口( “fmt” “时间” ) func main(){ control1:=time.Unix(1

使用time.Unix()和time.Parse()初始化的time.time具有完全相同的Unix时间戳,使用time.Format(“2006-01-02”)打印时会得到不同的结果

这个问题在操场上是不可复制的,但如果我自己编译的话,我会得到它

我的默认时区是洛杉矶,可能在不同的时区结果会有所不同

围棋版 go版本go1.12.1达尔文/amd64

建造

/测试

test.go:

主程序包
进口(
“fmt”
“时间”
)
func main(){
control1:=time.Unix(154630800,0)
测试:=时间解析(“2006-01-02”、“2019-01-01”)
fmt.Println(“控件:”,control1.Unix(),control1.Format(“2006-01-02”))
fmt.Println(“test:”,test.Unix(),test.Format(“2006-01-02”))
}
/测试 控制:1546308002018-12-31 测试:1546308002019-01-01


所以unix ts是相同的(154630800),但日期不同。为什么?

打印的日期不同,因为它们有不同的时区

返回当地时间,同时:

从该值中省略的元素被假定为零,或者,如果不可能为零,则为一,因此解析“3:04pm”将返回对应于0年1月1日15:04:00UTC(请注意,由于年份为0,此时间早于零时间)

time.Parse()

这也解释了为什么你在运动场上看不到它:当地时间是UTC

在我的本地计算机中打印区域信息(CET时区):

产出:

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

谢谢你的解释。我没想到两个具有相同基础unix时间戳的日期会输出不同的结果。@serggp这不是两个日期,而是时间上的同一个瞬间,然后格式不同。当相同的知识/数据以不同的方式表示时,这种情况很常见:例如
two
(数字)可以表示为
2
(十进制)、
10
(二进制)、
two
(英语)等。但即使表示方式不同,它也承载相同的负载。
control: 1546300800 2019-01-01 +0000
test   : 1546300800 2019-01-01 +0000
UTC 0
UTC 0