【问题标题】:golang time.Format() gives different results for the same unix timestampgolang time.Format() 为相同的 unix 时间戳给出不同的结果
【发布时间】:2019-10-20 16:56:14
【问题描述】:

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

这个问题在操场上是无法重现的,但如果我自己编译它就会得到它。

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

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

开始构建

./测试

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

【问题讨论】:

    标签: go time


    【解决方案1】:

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

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

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

    time.Parse() 默认返回具有UTC 区域的time.Time(如果区域信息不是输入和布局的一部分)。

    这也解释了为什么你在 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
    

    【讨论】:

    • 感谢您的解释。我没想到两个具有相同底层 unix 时间戳的日期会输出不同的结果。
    • @serggp 这些不是两个日期,它是同一时刻,然后格式不同。当相同的知识/数据以不同的方式表示时,这很常见:例如two(数字)可以表示为2(十进制)、10(二进制)、two(英语)等。但即使表示不同,它携带相同的有效载荷。
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2019-02-06
    • 2021-11-10
    • 2017-05-07
    • 2021-12-26
    • 1970-01-01
    相关资源
    最近更新 更多