【问题标题】:Parse time zone into a Location struct in Go在 Go 中将时区解析为 Location 结构
【发布时间】:2018-03-03 13:59:20
【问题描述】:

给定一个时区,例如 EDT 或 CEST,有没有办法获得 time.Location 引用以将其与 func (t Time) In(loc *Location) Time 一起使用?

可以初始化位置,例如CEST 与 time.LoadLocation("Europe/Berlin") 但如何对实际时区表示法做同样的事情?

鉴于@Svip 非常有见地的评论,是否有任何明智的方法来返回代表位置列表?那是为了WET 返回例如[Europe/London, Atlantik/Reykjavík]。所有其他 WET 位置将遵循与这两个位置之一相同的时区安排。

【问题讨论】:

  • 这是有问题的。假设我输入“WET”,西欧时间,那么结果应该是什么?伦敦?但是,虽然英国、爱尔兰和葡萄牙遵守夏令时,但同样在 WET 中的冰岛却没有。因此,如果冰岛开发人员使用 WET 来记录时间,则导致伦敦会出现问题。 MST 也有同样的问题,因为亚利桑那州的大部分地区不遵守夏令时。
  • 很公平。相应地改变我的问题。任何进一步的见解?
  • 这些时区缩写are ambiguous,这就是标准库中不支持它们的原因。例如,IST 可以表示任何爱尔兰/印度/以色列标准时间。
  • 这张地图在树中(未共享):golang.org/src/time/zoneinfo_abbrs_windows.go,由golang.org/src/time/genzabbrs.go生成

标签: go timezone


【解决方案1】:

可以选择解析给定位置的时间。 (https://golang.org/pkg/time/#LoadLocation)

type CustomTime struct {
    time.Time
}

const ctLayout = "Jan 2, 2006 at 3:04pm (MST)"

func (ct *CustomTime) UnmarshalJSON(b []byte) (err error) {
    s := strings.Trim(string(b), "\"")
    if s == "null" {
        ct.Time = time.Time{}
        return
    }
    location, err := time.LoadLocation("Local")
    if err != nil {
        return err
    }
    ct.Time, err = time.ParseInLocation(ctLayout, s, location)
    return err
}

【讨论】:

  • 如果您提供的时间与运行此代码的机器的本地时区相对应,它会正常工作吗?
【解决方案2】:

有一个包github.com/tkuchiki/go-timezone 提供区域缩写和位置之间的映射。见其timezones.go

但是,正如评论者还指出的那样,缩写的时区名称是模棱两可的,最好完全避免使用此类名称进行用户输入。正如其他问题(Why doesn't Go's time.Parse() parse the timezone identifier?How to properly parse timezone codes)中提到的,在解析时间时,Go 正确解析缩写时区,当它与机器运行代码的本地时区和 UTC 时区匹配时。根据我的经验,所有其他人都没有正确解析。

【讨论】:

猜你喜欢
  • 2018-04-17
  • 1970-01-01
  • 2016-03-05
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-19
相关资源
最近更新 更多