1

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

这个问题在操场上是不可重现的,但如果我自己编译它,我就会明白。

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

go 版本 go 版本 go1.12.1 darwin/amd64

去建造

。/测试

测试.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),但是日期不同。为什么?

4

1 回答 1

4

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

time.Unix()返回本地时间,而time.Parse()

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

time.Parse()默认情况下返回一个time.TimeUTC区域(如果区域信息不是输入和布局的一部分)。

这也解释了为什么在 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
于 2019-06-05T07:50:21.447 回答