为了账号安全,请及时绑定邮箱和手机立即绑定

Go 1.13 中时区无法加载

Go 1.13 中时区无法加载

Go
繁星点点滴滴 2023-08-07 14:55:16
这个简单的代码:tzloc, err := time.LoadLocation(service.Settings.TimezoneName)if err != nil {    panic(err)}在 Go 1.12 中工作得很好,但在 1.13 中,它因“未知时区澳大利亚/墨尔本”而失败。我确信它在某些环境下可以工作,但无论出于何种原因,它在 1.13 中就被破坏了。它通过恢复到 1.12 立即得到修复。我想知道是否有人知道 1.13 中的任何问题或原因,尽管发行说明中有这样的保证:“一如既往,该版本保持了 Go 1 的兼容性承诺。我们期望几乎所有 Go 程序都能继续编译和运行像以前一样跑。”
查看完整描述

5 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

对于 docker,解决方案是添加 tzdata 或等效包。这解决了使用 go 1.13 时的问题

http://pouzek.si/blog/go-loadlocation-docker/

FROM gliderlabs/alpine:3.3


RUN apk add --no-cache tzdata


COPY out/go-loadlocation-docker /go-loadlocation-docker


ENTRYPOINT ["/go-loadlocation-docker"]


查看完整回答
反对 回复 2023-08-07
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

这发生在我们身上,我们将zoneinfo.zip文件与我们的程序捆绑在一起,因为我们需要在 Windows 服务器上运行它。我们将 ZONEINFO 环境变量设置为 .zip 文件的路径,然后调用time.LoadLocation("America/Chicago"). 在 1.12 版本中这很好。我们升级到1.13版本,遇到了“系统找不到指定的路径”的问题。当调用 LoadLocation 时。

在我们的例子中,将 golang 存储库中的捆绑文件更新zoneinfo.zip到最新版本解决了该问题。我们之前使用的版本来自 commit af3c48096。不确定这是否与您遇到的问题相同,因为不清楚您是否像我们一样部署该 zip 文件,但我想我会为遇到该问题的其他人提供帮助。

注意:这仅影响未安装 Go 版本 1.13 的情况 - 当我在本地运行它时,一切都很好,因为它回退到 $GOROOT 文件夹中的版本(这是安装 1.13 时更新的版本)。该错误发生在未安装 Go 的 Windows 计算机上,如果我删除了 $GOROOT\lib\time\zoneinfo.zip 文件,也会发生在本地。


查看完整回答
反对 回复 2023-08-07
?
手掌心

TA贡献1942条经验 获得超3个赞

如果您准确地传递Australia/Melbournetime.LoadLocation,那么您应该检查 zoneinfo 文件。

https://golang.org/pkg/time/#LoadLocation

该名称被视为与 IANA 时区数据库中的文件相对应的位置名称。

LoadLocation 所需的时区数据库可能并不存在于所有系统上,尤其是非 Unix 系统。LoadLocation 查找由 ZONEINFO 环境变量命名的目录或未压缩的 zip 文件(如果有),然后查找 Unix 系统上的已知安装位置,最后查找 $GOROOT/lib/time/zoneinfo.zip。


查看完整回答
反对 回复 2023-08-07
?
守候你守候我

TA贡献1802条经验 获得超10个赞

导入time/tzdata将导致时区信息嵌入到程序中。因此,如果时间包在系统上找不到 tzdata 文件,它将使用此嵌入信息。

请记住,根据文档:

导入此包将使程序大小增加约 450 KB。

示例代码可能是这样的:

package main


import (

    "fmt"

    "time"

    _ "time/tzdata"

)


func main() {

    tzloc, err := time.LoadLocation("Australia/Melbourne")

    if err != nil {

        panic(err)

    }

    fmt.Println(location)

}


查看完整回答
反对 回复 2023-08-07
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

使用 中的硬编码时区字符串进行测试time.LoadLocation。我怀疑你的变量中可能有空格TimezoneName。


否则,LoadLocation 可以按照 Go1.13 中的预期正常工作。


package main


import (

    "fmt"

    "time"

)


func main() {

    location, err := time.LoadLocation("Australia/Melbourne")

    if err != nil {

        panic(err)

    }


    timeInUTC := time.Date(2018, 8, 30, 12, 0, 0, 0, time.UTC)

    fmt.Println(timeInUTC.In(location))

}

上面的代码2018-08-30 22:00:00 +1000 AEST作为 Go Playground的输出给出。Go Playground 使用 go 1.13。

但如果我在周围留一个空格

location, err := time.LoadLocation("Australia/Melbourne ")
if err != nil {
     panic(err)
}

它给出了您遇到的错误。

恐慌:未知时区 澳大利亚/墨尔本


查看完整回答
反对 回复 2023-08-07
  • 5 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信