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

文章目录

    使用 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式