【问题标题】:time.Location() returns as "Local" even if /etc/localtime is correct即使 /etc/localtime 正确,time.Location() 也会返回“Local”
【发布时间】:2020-03-14 09:11:09
【问题描述】:

我想检索系统的时区位置

t = time.Now()
tzLoc = t.Location().String()

tzLoc 返回为"Local"

我已经检查了time 包源代码。根据源代码,如果未设置TZ,则引用/etc/localtime

TZ 环境变量没有设置,下面是我系统上的/etc/localtime

lrwxrwxrwx. 1 root root 38 Jan 16 06:33 /etc/localtime -> ../usr/share/zoneinfo/America/New_York

理想情况下,time 包应该返回 America/New_York,但它仍然返回为 Local

我应该怎么做才能将时区位置设为America/New_York

【问题讨论】:

    标签: go time timezone


    【解决方案1】:

    Golang 的行为是正确的,在更改 TZ 环境变量后,您应该能够看到您期望的结果。我已经在 Golang docker 容器中运行它并打印出America/Los_Angeles。请在您的终端中重新定义您的时区,如下例所示:

     ~$: export TZ=America/Los_Angeles
    

    这也是一个 Docker 实现:

    Dockerfile:

    FROM golang:1.13.8-alpine3.11
    
    RUN apk update
    
    ENV GO111MODULE=on
    
    WORKDIR /app
    
    ENV TZ=America/Los_Angeles
    

    您可以按照以下方式构建 dockerfile 并运行它:

    ~$: docker build -t stackquestion:1.0 .
    ~$: docker run --rm -it stackquestion:1.0 sh
    

    timezone.go

    import (
        "fmt"
        "time"
    )
    
    func main() {
        tzLoc := time.Now().Location().String()
        fmt.Println(tzLoc)
    
    }
    

    当你运行代码时,你应该得到:

    /app # go run timezone.go 
    America/Los_Angeles
    

    【讨论】:

    • 如果设置了 TZ,那么 golang 本身会给出正确的结果,不是吗?如果没有设置 TZ 怎么办??
    • 如果未设置 TZ,请考虑设置它或从/etc/localtime 读取符号链接。
    • 似乎有误会,Golang在TZ未设置时使用/etc/localtime,即使你将/usr/share/zoneinfo/America/New_York复制到/etc/localtime,甚至将/etc/timezone设置为@987654335 @你仍然会得到Local,除非TZ被定义。请阅读官方文档:golang.org/src/time/zoneinfo.go Line 67
    猜你喜欢
    • 2012-01-20
    • 2016-05-28
    • 2017-05-08
    • 2020-07-24
    • 2017-12-13
    • 1970-01-01
    • 2014-11-17
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多