golang时区问题

现象

一个更新程序,打上的时间tag跟当前时间不一致,相差8小时。

原因

golang使用了UTC时间。
我的golang代码运行容器,容器中没有设置时区,所以使用的是UTC时间。

解决

尝试在golang中加入全局的时区设置,但是没有成功。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func main() {
// 加载东八区时区
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Println("Error loading location:", err)
return
}

// 获取当前时间并转换为东八区时区
currentTime := time.Now().In(loc)

// 格式化时间
fmt.Println(currentTime.Format(time.DateTime))
}

会报错 Error loading location: unknown time zone Asia/Shanghai

经过排查,是依赖的镜像alpine:3.18中没有时区文件。
如果需要使用golang中的loadLocation,需要更换镜像。

最后使用debian:bullseye-slim镜像,并在init中,设置时区为Asia/Shanghai,问题解决。

总结

如果不想在dockerfile中安装tzdata设置默认时区,只能在程序启动时手工指定时区。