猿问

为什么围棋时间。格式根据时区返回不同的值?

我以为是围棋时间。格式应根据布局设置时间格式。但似乎它根据时区信息返回不同的值。


package main


import (

    "fmt"

    "time"

)


func main() {


    formats := []string{

        time.RFC3339,

    }

    times := []string{

        "2020-03-08T01:59:50-08:00",

        "2020-03-08T01:59:59-08:00", //daylight saving starts 1 second later

        "2020-03-08T05:59:59-08:00",

    }

    for _, f := range formats {

        for _, t := range times {

            fmt.Printf("Format: %s\n", f)

            t, err := time.Parse(f, t)

            if err != nil {

                panic(err)

            }

            fmt.Printf("unix: %d\n", t.UnixNano())

            fmt.Printf("time: %s\n", t.Format(f))

            t = t.Add(time.Second)

            fmt.Printf("time + 1s: %s\n", t.Format(f))

        }

    }

}

运行输出:


➜ go version

go version go1.15 darwin/amd64

➜ TZ=UTC go run main.go

Format: 2006-01-02T15:04:05Z07:00

unix: 1583661590000000000

time: 2020-03-08T01:59:50-08:00

time + 1s: 2020-03-08T01:59:51-08:00

Format: 2006-01-02T15:04:05Z07:00

unix: 1583661599000000000

time: 2020-03-08T01:59:59-08:00

time + 1s: 2020-03-08T02:00:00-08:00 (a: this is not expected)

unix: 1583675999000000000

time: 2020-03-08T05:59:59-08:00

time + 1s: 2020-03-08T06:00:00-08:00

➜ TZ=America/Los_Angeles go run main.go

Format: 2006-01-02T15:04:05Z07:00

unix: 1583661590000000000

time: 2020-03-08T01:59:50-08:00

time + 1s: 2020-03-08T01:59:51-08:00

Format: 2006-01-02T15:04:05Z07:00 

unix: 1583661599000000000

time: 2020-03-08T01:59:59-08:00

time + 1s: 2020-03-08T03:00:00-07:00 (b: this is expected)

Format: 2006-01-02T15:04:05Z07:00

unix: 1583675999000000000

time: 2020-03-08T05:59:59-08:00

time + 1s: 2020-03-08T06:00:00-08:00 (c: this contradicts with the b)


开心每一天1111
浏览 143回答 1
1回答

守候你守候我

行为已记录在案。的输出只是一个结果,而不是混淆的来源 - 这是:time.Formattime.Parsefunc Parse:使用区域偏移量(如 -0700)解析时间时,如果偏移量对应于当前位置(本地)使用的时区,则 Parse 将在返回的时间中使用该位置和区域。否则,它将时间记录为在制造位置,时间固定在给定的区域偏移处。进一步的说明可以在类型位置下找到:本地表示系统的本地时区。在 Unix 系统上,Local 会查阅 TZ 环境变量以查找要使用的时区。没有 TZ 意味着使用系统默认的 /etc/localtime。TZ=“” 表示使用 UTC。TZ=“foo” 表示在系统时区目录中使用文件 foo。基本上,go的解析器试图从UTC偏移量推断时区。如果解析的 UTC 偏移量与环境变量设置的时区的偏移量匹配,则此时区将在返回的 中设置。在处理日期和时间时,简单性似乎总是结束。TZtime
随时随地看视频慕课网APP

相关分类

Go
我要回答