go语言中的时间转换问题

时间:2018-04-25 12:14:15

标签: go time

我试图通过Go语言了解时间转换的问题。这是代码示例:

MATCH()

它打印以下输出:

package main

import (
    "fmt"
    "time"
)

func unix2Str(ts int64) string {
    const layout = "20060102"
    t := time.Unix(ts, 0)
    return t.Format(layout)
}

func unixTime(ts string) int64 {
    const layout = "20060102"
    t, err := time.Parse(layout, ts)
    if err != nil {
            fmt.Println(err)
            return 0
    }
    return t.Unix()
}
func main() {
    ts1 := "20110320"
    ts2 := "20110321"

    ut1 := unixTime(ts1)
    ut2 := unixTime(ts2)

    fmt.Println(ts1, ut1, unix2Str(ut1))
    fmt.Println(ts2, ut2, unix2Str(ut2))
}

但是,由于我从字符串格式转换为Unix并且反向,我希望字符串格式的日期结果相同。但事实并非如此。实际上,打印的unix时间20110320 1300579200 20110319 20110321 1300665600 20110320 在python中转换为我开始的原始日期,例如

1300579200

这是Go代码中的错误还是我错过了什么?

1 个答案:

答案 0 :(得分:8)

这是因为您的本地时区与UTC之间存在差异。 Parse返回UTC时间,Unix返回当地时间。例如,

package main

import (
    "fmt"
    "time"
)

func unix2Str(ts int64) string {
    const layout = "20060102"
    t := time.Unix(ts, 0)
    fmt.Println(t)
    return t.Format(layout)
}

func unixTime(ts string) int64 {
    const layout = "20060102"
    t, err := time.Parse(layout, ts)
    if err != nil {
        fmt.Println(err)
        return 0
    }
    fmt.Println(t)
    return t.Unix()
}

func main() {
    ts1 := "20110320"
    ts2 := "20110321"

    ut1 := unixTime(ts1)
    ut2 := unixTime(ts2)

    fmt.Println(ts1, ut1, unix2Str(ut1))
    fmt.Println(ts2, ut2, unix2Str(ut2))
}

输出:

2011-03-20 00:00:00 +0000 UTC
2011-03-21 00:00:00 +0000 UTC
2011-03-19 20:00:00 -0400 EDT
20110320 1300579200 20110319
2011-03-20 20:00:00 -0400 EDT
20110321 1300665600 20110320
  

func Parse

func Parse(layout, value string) (Time, error)
     

Parse解析格式化的字符串并返回它的时间值   代表。布局通过显示引用如何定义格式   时间,定义为

Mon Jan 2 15:04:05 -0700 MST 2006
     如果它是值,

将被解释;它就是一个例子   输入格式。然后将对此进行相同的解释   输入字符串。

     

如果没有时区指示符,Parse将返回UTC时间。

  

func Unix

func Unix(sec int64, nsec int64) Time
     

Unix返回对应于给定Unix时间的本地时间秒   自1970年1月1日UTC以来的秒和nsec纳秒。