2

我运行了以下代码。

package main

import (
    "fmt"
    "strconv"
    "time"
)

func main() {
    i, err := strconv.ParseInt("1405544146", 10, 64)
    if err != nil {
        panic(err)
    }
    tm := time.Unix(i, 0).Format(time.RFC3339)
    fmt.Println(tm)
    fmt.Println(time.RFC3339)

}

那么Linux上的结果是

2014-07-16T20:55:46Z
2006-01-02T15:04:05Z07:00

在 macOS 上是

2014-07-17T05:55:46+09:00
2006-01-02T15:04:05Z07:00

它是相同的时间,但格式化的结果是不同的。你知道原因吗?

4

4 回答 4

1

不要妄下结论。检查所有证据。例如,考虑当地时区。

打包时间

import "time" 

函数 Unix

func Unix(sec int64, nsec int64) Time

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


例如,

package main

import (
    "fmt"
    "runtime"
    "strconv"
    "time"
)

func main() {
    i, err := strconv.ParseInt("1405544146", 10, 64)
    if err != nil {
        panic(err)
    }
    t := time.Unix(i, 0)
    fmt.Println(t)
    fmt.Println(t.Format(time.RFC3339))
    fmt.Println(time.RFC3339)
    fmt.Println(runtime.GOOS, runtime.GOARCH, runtime.Version())
}

游乐场: https: //play.golang.org/p/UH6o57YckiV

输出(游乐场):

2014-07-16 20:55:46 +0000 UTC
2014-07-16T20:55:46Z
2006-01-02T15:04:05Z07:00
nacl amd64p32 go1.12

输出(Linux):

2014-07-16 16:55:46 -0400 EDT
2014-07-16T16:55:46-04:00
2006-01-02T15:04:05Z07:00
linux amd64 devel +5b68cb65d3 Thu Mar 28 23:49:52 2019 +0000

不同的时区(UTC 与 EDT)因此格式的日期和时间不同。


在您的示例中,您有2014-07-16T20:55:46Z2014-07-17T05:55:46+09:00,不同的时区因此格式的日期和时间不同。

于 2019-03-29T03:50:46.427 回答
1

2014-07-16T20:55:46Z2014-07-17T05:55:46+09:00不同的区域时间。

time.RFC3339 是常量。https://golang.org/pkg/time/#RFC3339

const (
        // ...
        RFC3339     = "2006-01-02T15:04:05Z07:00"
        RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
        // ...
)

go 使用数字时间或 Z 触发 ISO 8601。

数字时区偏移格式如下:

-0700  ±hhmm
-07:00 ±hh:mm
-07    ±hh

并且用 Z 替换格式中的符号会触发 ISO 8601 打印 Z 的行为,而不是 UTC 区域的偏移量。

Z0700  Z or ±hhmm
Z07:00 Z or ±hh:mm
Z07    Z or ±hh
于 2019-03-29T04:19:02.603 回答
0

两个不同操作系统对相同输入产生不同输出的原因是操作系统的时区配置。Linux 机器上的时区似乎没有设置。

go将尝试从本地操作系统获取时区。如果不可用,则默认为UTC. 如果您想从 MacOS 和 Linux 获得一致的输出 - 确保时区相同。要明确执行此操作,请设置TZ环境变量。这将适用于 Linux 和 MacOS 等。

$ go build -o gotime ./main.go

$ uname -s
Linux
$ TZ=CET ./gotime 
2014-07-16T22:55:46+02:00
2006-01-02T15:04:05Z07:00

$ TZ="" ./gotime 
2014-07-16T20:55:46Z
2006-01-02T15:04:05Z07:00

$ uname -s
Darwin
$ TZ=CET ./gotime
2014-07-16T22:55:46+02:00
2006-01-02T15:04:05Z07:00

$ TZ="" ./gotime
2014-07-16T20:55:46Z
2006-01-02T15:04:05Z07:00
于 2019-03-29T15:41:43.203 回答
0

这个问题是由于 golang 上的时间位置造成的。

Linux golang 的默认时间位置是“UTC”,MacOS golang 是“Local”。(“本地”使用os的时间位置。)

您可以检查时间位置。

fmt.Println(time.Local) // Result of MacOS is "Local"

如果要从 MacOS 中获取“UTC”结果,则应使用“In”函数。

lo, _ := time.LoadLocation("UTC")    
tmUTC := time.Unix(1405544146, 0).In(lo).Format(time.RFC3339)

如果你在 MacOS 上运行代码,你可以得到类似 linux 的结果。

i, err := strconv.ParseInt("1405544146", 10, 64)
if err != nil {
    panic(err)
}
tm := time.Unix(i, 0).Format(time.RFC3339)
fmt.Println(tm)
lo, _ := time.LoadLocation("UTC")
tmUTC := time.Unix(i, 0).In(lo).Format(time.RFC3339)
于 2019-03-30T07:46:38.373 回答