首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从国家/地区获取时区

如何从国家/地区获取时区
EN

Stack Overflow用户
提问于 2018-07-15 16:01:54
回答 2查看 3.7K关注 0票数 -1

我正在将一个函数从PHP转换为Go。

我想在Go中从国家代码获得时区。它与PHP中的此函数类似

代码语言:javascript
复制
public static array DateTimeZone::listIdentifiers ([ int $what = DateTimeZone::ALL [, string $country = NULL ]] )

在Go中哪些函数有类似的功能?

EN

回答 2

Stack Overflow用户

发布于 2018-07-15 21:46:39

Go标准库没有这样的函数。寻找一个开放源码的Go包,它可以为你做到这一点。或者,因为这是Go,所以自己编写一个简单的Go函数。您必须下载IANA tzdata zone交叉引用文件。

例如,

代码语言:javascript
复制
package main

import (
    "bufio"
    "fmt"
    "os"
    "path/filepath"
    "strings"
    "time"
)

// Download IANA tzdata zone file:
// $ wget https://raw.githubusercontent.com/eggert/tz/master/zone1970.tab -O zone1970.tab

// countryZones returns a map of IANA Time Zone Database (tzdata) zone names
// by ISO 3166 2-character country code: map[country][]zone.
func countryZones(dir string) (map[string][]string, error) {
    fname := filepath.Join(dir, `zone1970.tab`)
    f, err := os.Open(fname)
    if err != nil {
        return nil, err
    }
    defer f.Close()

    countries := make(map[string][]string)
    s := bufio.NewScanner(f)
    for s.Scan() {
        line := s.Text()
        if strings.HasPrefix(line, "#") {
            continue
        }
        n := 3
        fields := strings.SplitN(line, "\t", n+1)
        if len(fields) < n {
            continue
        }
        zone := fields[2]
        for _, country := range strings.Split(fields[0], ",") {
            country = strings.ToUpper(country)
            zones := countries[country]
            zones = append(zones, zone)
            countries[country] = zones
        }
    }
    if err = s.Err(); err != nil {
        return nil, err
    }
    return countries, nil
}

func main() {
    zones, err := countryZones("")
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }

    utc := time.Now().UTC()
    for _, country := range []string{"RU", "CA"} {
        fmt.Println("Country:", country)
        zones := zones[country]
        fmt.Println(utc, "UTC")
        for _, zone := range zones {
            loc, err := time.LoadLocation(zone)
            if err != nil {
                fmt.Fprintln(os.Stderr, err)
                continue
            }
            fmt.Println(utc.In(loc), zone)
        }
    }
}

输出:

代码语言:javascript
复制
$ wget https://raw.githubusercontent.com/eggert/tz/master/zone1970.tab -O zone1970.tab
--2018-07-15 09:44:02--  https://raw.githubusercontent.com/eggert/tz/master/zone1970.tab
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.184.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.184.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 17810 (17K) [text/plain]
Saving to: ‘zone1970.tab’

zone1970.tab             100%[==================================>]  17.39K  --.-KB/s    in 0.03s   

2018-07-15 09:44:02 (582 KB/s) - ‘zone1970.tab’ saved [17810/17810]

$ go run zones.go
Country: RU
2018-07-15 17:40:03.09524872 +0000 UTC UTC
2018-07-15 19:40:03.09524872 +0200 EET Europe/Kaliningrad
2018-07-15 20:40:03.09524872 +0300 MSK Europe/Moscow
2018-07-15 20:40:03.09524872 +0300 MSK Europe/Simferopol
2018-07-15 20:40:03.09524872 +0300 +03 Europe/Volgograd
2018-07-15 20:40:03.09524872 +0300 +03 Europe/Kirov
2018-07-15 21:40:03.09524872 +0400 +04 Europe/Astrakhan
2018-07-15 21:40:03.09524872 +0400 +04 Europe/Saratov
2018-07-15 21:40:03.09524872 +0400 +04 Europe/Ulyanovsk
2018-07-15 21:40:03.09524872 +0400 +04 Europe/Samara
2018-07-15 22:40:03.09524872 +0500 +05 Asia/Yekaterinburg
2018-07-15 23:40:03.09524872 +0600 +06 Asia/Omsk
2018-07-16 00:40:03.09524872 +0700 +07 Asia/Novosibirsk
2018-07-16 00:40:03.09524872 +0700 +07 Asia/Barnaul
2018-07-16 00:40:03.09524872 +0700 +07 Asia/Tomsk
2018-07-16 00:40:03.09524872 +0700 +07 Asia/Novokuznetsk
2018-07-16 00:40:03.09524872 +0700 +07 Asia/Krasnoyarsk
2018-07-16 01:40:03.09524872 +0800 +08 Asia/Irkutsk
2018-07-16 02:40:03.09524872 +0900 +09 Asia/Chita
2018-07-16 02:40:03.09524872 +0900 +09 Asia/Yakutsk
2018-07-16 02:40:03.09524872 +0900 +09 Asia/Khandyga
2018-07-16 03:40:03.09524872 +1000 +10 Asia/Vladivostok
2018-07-16 03:40:03.09524872 +1000 +10 Asia/Ust-Nera
2018-07-16 04:40:03.09524872 +1100 +11 Asia/Magadan
2018-07-16 04:40:03.09524872 +1100 +11 Asia/Sakhalin
2018-07-16 04:40:03.09524872 +1100 +11 Asia/Srednekolymsk
2018-07-16 05:40:03.09524872 +1200 +12 Asia/Kamchatka
2018-07-16 05:40:03.09524872 +1200 +12 Asia/Anadyr
Country: CA
2018-07-15 17:40:03.09524872 +0000 UTC UTC
2018-07-15 15:10:03.09524872 -0230 NDT America/St_Johns
2018-07-15 14:40:03.09524872 -0300 ADT America/Halifax
2018-07-15 14:40:03.09524872 -0300 ADT America/Glace_Bay
2018-07-15 14:40:03.09524872 -0300 ADT America/Moncton
2018-07-15 14:40:03.09524872 -0300 ADT America/Goose_Bay
2018-07-15 13:40:03.09524872 -0400 AST America/Blanc-Sablon
2018-07-15 13:40:03.09524872 -0400 EDT America/Toronto
2018-07-15 13:40:03.09524872 -0400 EDT America/Nipigon
2018-07-15 13:40:03.09524872 -0400 EDT America/Thunder_Bay
2018-07-15 13:40:03.09524872 -0400 EDT America/Iqaluit
2018-07-15 13:40:03.09524872 -0400 EDT America/Pangnirtung
2018-07-15 12:40:03.09524872 -0500 EST America/Atikokan
2018-07-15 12:40:03.09524872 -0500 CDT America/Winnipeg
2018-07-15 12:40:03.09524872 -0500 CDT America/Rainy_River
2018-07-15 12:40:03.09524872 -0500 CDT America/Resolute
2018-07-15 12:40:03.09524872 -0500 CDT America/Rankin_Inlet
2018-07-15 11:40:03.09524872 -0600 CST America/Regina
2018-07-15 11:40:03.09524872 -0600 CST America/Swift_Current
2018-07-15 11:40:03.09524872 -0600 MDT America/Edmonton
2018-07-15 11:40:03.09524872 -0600 MDT America/Cambridge_Bay
2018-07-15 11:40:03.09524872 -0600 MDT America/Yellowknife
2018-07-15 11:40:03.09524872 -0600 MDT America/Inuvik
2018-07-15 10:40:03.09524872 -0700 MST America/Creston
2018-07-15 10:40:03.09524872 -0700 MST America/Dawson_Creek
2018-07-15 10:40:03.09524872 -0700 MST America/Fort_Nelson
2018-07-15 10:40:03.09524872 -0700 PDT America/Vancouver
2018-07-15 10:40:03.09524872 -0700 PDT America/Whitehorse
2018-07-15 10:40:03.09524872 -0700 PDT America/Dawson
$ 
票数 3
EN

Stack Overflow用户

发布于 2018-07-15 17:33:51

可从time.LoadLocation()example访问时区

代码语言:javascript
复制
package main

import (
    "fmt"
    "time"
    "log"
)

func main() {
    var ParisLocation, err = time.LoadLocation("Europe/Paris")
    if(err != nil) {
        log.Fatal(err)
    }

    fmt.Println(ParisLocation)
}

正如在golang/go issue 21881中看到的,它不能在Windows上工作,因为默认情况下没有包含$GOROOT/lib/time/zoneinfo.zip,因此需要像4d63.com/tz这样的项目。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51346476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档