当我使用 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
,选择所需的时区文件,然后将embed
与time.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)