Golang time.Parse 时区问题引起的时间比对 bug

更新日期: 2025-05-12 阅读次数: 76 字数: 471 分类: golang

使用 golang 开发的大赛报名截止时间功能,发现一个奇怪的 bug,就是截止时间判断不准确。 现象是,截止时间设置的是今天上午十点,但是判断函数只有在下午 18 点时才生效。 我第一反应是大概就是时区问题。

未指定时区前

now := time.Now()
registerStartTime, err := time.Parse("2006-01-02 15:04:05", registerStart)
registerEndTime, err := time.Parse("2006-01-02 15:04:05", registerEnd)

fmt.Println("now: ", now)
fmt.Println("registerStartTime: ", registerStartTime)
fmt.Println("registerEndTime: ", registerEndTime)

输出

now:  2025-05-12 10:08:34.3245287 +0800 CST m=+1.136898201
registerStartTime:  2025-01-07 00:00:00 +0000 UTC
registerEndTime:  2025-05-12 01:59:59 +0000 UTC

会发现 time.Parse 解析出来的时间,是 UTC 时间(Coordinated Universal Time),对应的时区是 0 时区。 那这个时间就不是我预期的北京时间了。所以,时间判断就会出现问题。

指定时区后

location, err := time.LoadLocation("Asia/Shanghai")
registerStartTime, err := time.ParseInLocation("2006-01-02 15:04:05", registerStart, location)
registerEndTime, err := time.ParseInLocation("2006-01-02 15:04:05", registerEnd, location)

输出:

now:  2025-05-12 10:18:59.5470442 +0800 CST m=+16.388423401
registerStartTime:  2025-01-07 00:00:00 +0800 CST
registerEndTime:  2025-05-12 01:59:59 +0800 CST

这个时间就对了。所以 golang 在做时间字符串解析时,一定要注意。

比对时间

// 当前时间在报名开始时间和结束时间之间,可以报名
if now.After(registerStartTime) && now.Before(registerEndTime) {
	return true
}

最后

前一段时间,正好在折腾 Python 的多时区问题 (参见:Python 获取不同时区的当前时间)。这是跟时区干上了。

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式