在Go中获取有效时区列表

时间:2016-10-19 00:15:25

标签: go timezone

我想编写一个方法,使用time.Format()调用接受的公共时区填充Go语言数组,以便在HTML模板中使用(表单选择允许他们阅读并选择他们的时区)。有没有通用的方法来做到这一点?

3 个答案:

答案 0 :(得分:6)

要获取时区列表,您可以使用以下内容:

package main

import (
    "fmt"
    "io/ioutil"
    "strings"
)

var zoneDirs = []string{
    // Update path according to your OS
    "/usr/share/zoneinfo/",
    "/usr/share/lib/zoneinfo/",
    "/usr/lib/locale/TZ/",
}

var zoneDir string

func main() {
    for _, zoneDir = range zoneDirs {
        ReadFile("")
    }
}

func ReadFile(path string) {
    files, _ := ioutil.ReadDir(zoneDir + path)
    for _, f := range files {
        if f.Name() != strings.ToUpper(f.Name()[:1]) + f.Name()[1:] {
            continue
        }
        if f.IsDir() {
            ReadFile(path + "/" + f.Name())
        } else {
            fmt.Println((path + "/" + f.Name())[1:])
        }
    }
}

输出:

Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Asmera
Africa/Bamako
Africa/Bangui
...

答案 1 :(得分:4)

时间pkg使用timezone数据库。

您可以加载如下所示的时区位置:

loc, err := time.LoadLocation("America/Chicago")
if err != nil {
    // handle error
}

t := time.Now().In(loc)

Format功能与设置时区无关,此功能需要一个固定的参考时间,允许您根据需要设置日期格式。看看时间pkg docs

例如:

fmt.Println(t.Format("MST")) // outputs CST

这是一个正在运行的example

答案 2 :(得分:0)

这里是一个示例:https://play.golang.org/p/KFGQiW5A1P-

package main

import (
    "fmt"
    "io/ioutil"
    "strings"
    "unicode"
)

func main() {
    fmt.Println(GetOsTimeZones())
}

func GetOsTimeZones() []string {
    var zones []string
    var zoneDirs = []string{
        // Update path according to your OS
        "/usr/share/zoneinfo/",
        "/usr/share/lib/zoneinfo/",
        "/usr/lib/locale/TZ/",
    }

    for _, zd := range zoneDirs {
        zones = walkTzDir(zd, zones)

        for idx, zone := range zones {
            zones[idx] = strings.ReplaceAll(zone, zd+"/", "")
        }
    }

    return zones
}

func walkTzDir(path string, zones []string) []string {
    fileInfos, err := ioutil.ReadDir(path)
    if err != nil {
        return zones
    }

    isAlpha := func(s string) bool {
        for _, r := range s {
            if !unicode.IsLetter(r) {
                return false
            }
        }
        return true
    }

    for _, info := range fileInfos {
        if info.Name() != strings.ToUpper(info.Name()[:1])+info.Name()[1:] {
            continue
        }

        if !isAlpha(info.Name()[:1]) {
            continue
        }

        newPath := path + "/" + info.Name()

        if info.IsDir() {
            zones = walkTzDir(newPath, zones)
        } else {
            zones = append(zones, newPath)
        }
    }

    return zones
}