使用 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 聊聊, 查看更多联系方式