缺少呼叫 Time.In 的位置



当我使用 beego/orm 来操作 postgresql 数据库时,会出现这样的错误"调用 Time.In 时缺少位置"。

代码示例

type dataTest struct {
    Id      int         `pk:"auto"`
    Data    time.Time   `orm:"auto_now;type(timestamp);null"`
}
local, _ := time.LoadLocation("UTC")
test_time, err := time.ParseInLocation("2006-01-02 15:04:05", "1111-01-25 14:27:07", local)
orm.DefaultTimeLoc = time.UTC
o,err := orm.NewOrmWithDB("postgres","default",db)
temp := new(dataTest)
temp.Id = 1
temp.Data = test_time
o.Update(temp)

对于 docker (构建多阶段(

构建后安装 tzdata

RUN apk --no-cache add tzdata

可用时区列表,请参阅:https://golang.org/src/time/zoneinfo_abbrs_windows.go

loc, _ := time.LoadLocation("America/Bogota")
now := time.Now().In(loc)

问题

操作系统:视窗。

当我将可执行文件分发到其他计算机时,他们在运行它时遇到以下问题。

时间:缺少呼叫 Time.In 的位置

但是,在我自己的计算机上调试代码时没有问题。

后来,我发现问题是由time.LoadLocation函数引起的,该函数引用了runtime.GOROOT/lib/time/zoneinfo/zoneinfo.zip gorootZoneSource(runtime.GOROOT((( gorootZoneSource.因此,如果其他计算机上的runtime.GOROOT与开发人员的不同甚至不存在,则会引起问题。

溶液

解压缩%GOROOT%/lib/time/zoneinfo/zoneinfo.zip,选择所需的时区文件,然后将embedtime.LoadLocationFromTZData一起使用以获取该区域的数据。

package main
import (
    "embed"
    "time"
)
//go:embed zoneInfo
var zoneInfoFS embed.FS // get it from GOROOT/lib/time/zoneInfo.zip
func getLocation(name string) (loc *time.Location) {
    bs, err := zoneInfoFS.ReadFile("zoneInfo/" + name)
    if err != nil {
        panic(err)
    }
    loc, err = time.LoadLocationFromTZData(name, bs)
    if err != nil {
        panic(err)
    }
    return loc
}
func main() {
    locTW := getLocation("Asia/Taipei")
    locJPN := getLocation("Asia/Tokyo")
}

目录结构

-📜main.go
- 📂zoneInfo
  - 📂Asia
      - 📜Taipei
      - 📜Tokyo
  - ...

这应该有效:

type dataTest struct {
    Id      int         `pk:"auto"`
    Data    time.Time   `orm:"auto_now;type(timestamp);null"`
}
test_time, err := time.ParseInLocation("2006-01-02 15:04:05", "1111-01-25 14:27:07", time.UTC)
orm.DefaultTimeLoc = time.UTC
o,err := orm.NewOrmWithDB("postgres","default",db)
temp := new(dataTest)
temp.Id = 1
temp.Data = test_time
o.Update(temp)

相关内容