🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 4.2 时区 # 不同国家(有时甚至是同一个国家内的不同地区)使用不同的时区。对于要输入和输出时间的程序来说,必须对系统所处的时区加以考虑。Go 语言使用 `Location` 来表示地区相关的时区,一个 Location 可能表示多个时区。 `time` 包提供了 Location 的两个实例:`Local` 和 `UTC`。`Local` 代表当前系统本地时区;`UTC` 代表通用协调时间,也就是零时区。`time` 包默认(为显示提供时区)使用 `UTC` 时区。 ## Local 是如何做到表示本地时区的? 时区信息既浩繁又多变,Unix 系统以标准格式存于文件中,这些文件位于 /usr/share/zoneinfo,而本地时区可以通过 /etc/localtime 获取,这是一个符号链接,指向 /usr/share/zoneinfo 中某一个时区。比如我本地电脑指向的是:/usr/share/zoneinfo/Asia/Shanghai。 因此,在初始化 Local 时,通过读取 /etc/localtime 可以获取到系统本地时区。 当然,如果设置了环境变量 `TZ`,则会优先使用它。 相关代码: ``` tz, ok := syscall.Getenv("TZ") switch { case !ok: z, err := loadZoneFile("", "/etc/localtime") if err == nil { localLoc = *z localLoc.name = "Local" return } case tz != "" && tz != "UTC": if z, err := loadLocation(tz); err == nil { localLoc = *z return } } ``` ## 获得特定时区的实例 函数 `LoadLocation` 可以根据名称获取特定时区的实例。函数声明如下: `func LoadLocation(name string) (*Location, error)` 如果 name 是""或"UTC",返回UTC;如果 name 是"Local",返回Local;否则 name 应该是IANA时区数据库里有记录的地点名(该数据库记录了地点和对应的时区),如"America/New_York"。 LoadLocation 函数需要的时区数据库可能不是所有系统都提供,特别是非Unix系统。此时 `LoadLocation` 会查找环境变量 ZONEINFO 指定目录或解压该变量指定的zip文件(如果有该环境变量);然后查找Unix系统的惯例时区数据安装位置,最后查找 `$GOROOT/lib/time/zoneinfo.zip`。 可以在 Unix 系统下的 /usr/share/zoneinfo 中找到所有的名称。 ## 总结 通常,我们使用 `time.Local` 即可,偶尔可能会需要使用 `UTC`。在解析时间时,心中一定记得有时区这么回事。当你发现时间出现莫名的情况时,很可能是因为时区的问题,特别是当时间相差 8 小时时。 # 导航 # - 上一节:[主要类型概述](04.1.md) - 下一节:[Time类型详解](04.3.md)