时区无法在Go 1.13中加载

时间:2019-11-26 05:22:07

标签: go

这个简单的代码:

library(tidyverse)
library(lubridate)
df <-
  structure(list(timestamp = structure(c(1479118194, 1479116870, 
                                         1479113506, 1479113046, 1479112331, 1479111645, 1479111119, 1479110437, 
                                         1479106612, 1479106218, 1479105192), class = c("POSIXct", "POSIXt"
                                         ), tzone = "UTC"), heading = c(44L, 72L, 37L, 34L, 14L, 12L, 
                                                                        15L, 13L, 45L, 14L, 16L), ground.speed1 = c(0.0830056886417697, 
                                                                                                                    0.0362715909791526, 0.373922822992792, 0.00365221791296628, 0.0486211951021842, 
                                                                                                                    0.181217669168713, 0.0550965979273319, 0.154570465194361, 1.55730089114108, 
                                                                                                                    0.259570141800717, 0.00755638734840589)), row.names = c(NA, -11L
                                                                                                                    ), class = "data.frame")

yrs <- 2:-30  # create the yrs to loop over
map_df(yrs,   # repeats the command for each element in yrs
       ~mutate(df, 
               timestamp = timestamp-years(.x), # use .x wherever you would use "i" in a loop
               changes= paste0(.x, "y")))

#>               timestamp heading ground.speed1 changes
#> 1   2015-11-14 10:09:54      44   0.083005689      1y
#> 2   2015-11-14 09:47:50      72   0.036271591      1y
#> 3   2015-11-14 08:51:46      37   0.373922823      1y
#> 4   2015-11-14 08:44:06      34   0.003652218      1y
#> ...

在Go 1.12中工作正常,但是在1.13中,它失败并显示“澳大利亚/墨尔本时区未知”。我确定它可以在某些环境中运行,但是无论出于何种原因,对于我们来说,它在1.13中都已被破坏。恢复到1.12可立即修复。我想知道是否有人在1.13中知道任何问题或原因,尽管发行说明对此作出了保证,但为何仍会失败:“与往常一样,该发行版保留了Go 1的兼容性承诺。我们希望几乎所有Go程序都能继续编译并像以前一样运行。”

4 个答案:

答案 0 :(得分:2)

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

在我们的例子中,将捆绑的zoneinfo.zip文件从golang存储库更新为最新版本解决了该问题。我们先前使用的版本来自提交af3c48096。不知道这是否与您遇到的问题相同,因为目前尚不清楚您是否像我们一样部署该zip文件,但我认为其他任何遇到此问题的人都可以参与。

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

答案 1 :(得分:1)

使用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。

但是如果我放一个空格around

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

它给出了您遇到的错误。

  

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

答案 2 :(得分:0)

如果您正好将Australia/Melbourne传递到time.LoadLocation,则应检查zoneinfo文件。

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

  

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

     

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

答案 3 :(得分:0)

对于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"]