golang time.Format()对于相同的unix时间戳给出不同的结果

时间:2019-06-05 07:40:10

标签: go time

使用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),但日期不同。为什么?

1 个答案:

答案 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