在Go中获取有效时区的列表



我想写一个方法,用time.Format()调用接受的常见时区填充Go语言数组,用于HTML模板(表单选择允许他们读取和选择他们的时区)。是否有一种通用的方法来做到这一点?

要获取时区列表,可以使用如下命令:

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
...

示例: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
}

Go的time pkg使用一个时区数据库。

您可以像这样加载时区位置:

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

Format函数与设置时区无关,该函数使用一个固定的参考时间,允许您按照自己的意愿格式化日期。看一下pkg文档的时间。

例如:

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

下面是一个正在运行的例子

相关内容

  • 没有找到相关文章