0%

时区问题踩坑

今天被时区的问题困扰了好久,踩了不少坑,在此记录一下。

go 中的时区

go 中 time.Now() 取的是系统的时区。

time.parse 默认采用的是 UTC 时间进行解析,UTC 时即世界协调时间。

我们中国使用的北京时间是东八区时间,领先了 UTC 八个小时。

举个例子,现在是北京时间 2021/2/21 15:00:00,用 time.parse 解析得到的时间 2021/2/21 15:00:00 +0:00,而这个解析到的时间对应到北京时间是 2021/2/21 23:00:00 +8:00

time.Now() 取到的系统时间是 2021/2/21 15:00:00 +8:00,这种情况下做时间的比较,是无法得到正确的结果的,同时如果使用 gorm 等事件保存到数据库中,保存的时间也是比正确的时间晚了 8 小时的。

所以应当使用 time.parseInLocation

容器中的时区

使用 docker-compose,可以设置 environment 中的 TZ 设置时区,前提是镜像中安装了 tzdata 这个软件。如果没有,设置时无法生效的。

mysql 中的时区

默认会采用系统时区,可以在 my.cnf 中手动设置默认的时区。