【问题标题】:How to set the Zone of a Go time value when knowing the UTC time and time offset?知道 UTC 时间和时间偏移时如何设置 Go 时间值的区域?
【发布时间】:2017-09-15 18:46:53
【问题描述】:

我有一个 UTC 时间和一个以秒为单位的时间偏移量,需要返回相应的 Go 时间值。

使用 time.Unix() 函数实例化 UTC 时间值很简单。但是要设置 Zone,我需要确定 time.Location。

知道 UTC 时间和时间偏移后,如何找到 time.Location?

【问题讨论】:

    标签: go timezone


    【解决方案1】:

    如果没有在时区数据库中查找的实际条目,您将无法知道该时间的真实位置。如果您只想使用偏移量,可以使用time.FixedZone 创建一个固定位置

    edt := time.FixedZone("EDT", -60*60*4)
    t, _ := time.ParseInLocation("02 Jan 06 15:04", "15 Sep 17 14:55", edt)
    fmt.Println(t)
    
    // 2017-09-15 14:55:00 -0400 EDT
    

    您可以选择指定一个不存在的区域名称,或者根本不指定,只要您使用的输出格式不需要。

    minus4 := time.FixedZone("", -60*60*4)
    t, _ = time.ParseInLocation("02 Jan 06 15:04", "15 Sep 17 14:55", minus4)
    fmt.Println(t.Format(time.RFC3339))
    
    // 2017-09-15T14:55:00-04:00
    

    【讨论】:

    • 好建议。问题是我不知道时区名称。
    • 具体来说,真正的时区条目包括诸如夏令时/夏季时间的遵守和时间表等详细信息,而这些信息不包含在简单的 UTC 偏移量中。
    • @chmike:如果您不知道实际的时区名称,那么您只能猜测,或者完全忽略它。我只以“EDT”为例,它不是实时时区。
    • @Adrian 你是对的。如果在某个时间段内它们的时​​间偏移量相同,则具有偏移量的 UTC 时间可以匹配多个位置。会有歧义。因此,FixedZone 是最好的解决方案,因此仍然可以生成 ISO 8601 时间格式或没有区域名称的等效格式。
    • 区域名称仅用于旧时间表示(RFC822,Unix 时间)。最近的时间表示仅使用时间偏移量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 2016-09-05
    • 1970-01-01
    • 2015-11-25
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多