go: 时间比较出错(cst/utc时间)
一,出现错误的代码:
1,代码
func startBackgroundJob() {
ticker := time.NewTicker(1 * time.Minute)
timeStop, _ := time.Parse("2006-01-02 15:04:05", "2025-07-08 09:45:00")
go func() {
for range ticker.C {
// 执行后台任务逻辑
now := time.Now()
// 格式化时间
formattedNow := now.Format("2006-01-02 15:04:05")
formattedStop := timeStop.Format("2006-01-02 15:04:05")
fmt.Println("后台运行:当前时间:",now)
fmt.Println("后台运行:当前时间:",formattedNow)
fmt.Println("后台运行:停止时间:",timeStop)
fmt.Println("后台运行:停止时间:",formattedStop)
//比较时间
if now.After(timeStop) {
fmt.Println("now在stop时间之后了")
}
if now.Before(timeStop) {
fmt.Println("now在stop时间之前")
}
}
}()
}
2, 运行的信息
后台运行:当前时间: 2025-07-08 09:54:24.603435661 +0800 CST m=+60.031323450
后台运行:当前时间: 2025-07-08 09:54:24
后台运行:停止时间: 2025-07-08 09:45:00 +0000 UTC
后台运行:停止时间: 2025-07-08 09:45:00
now在stop时间之前
可以看到上面的输出信息中:
当前时间是cst
time.parse输出的停止时间是utc
二,原因
golang默认采用UTC,即Unix标准时间。而一般情况下,我们存数据库采用的是中国时间,即CST;
UTC和CST一般相差8个小时;
time.Now()输出默认CST时区时间;
time.Parse()默认输出UTC时区时间。
所以在使用time.Format时如果不注意会出现时间对不上相差8个小时的问题。
解决方法如下:
time.Format()将时间格式转为字符串,先用 UTC() 方法将时区转过来,在进行格式转换:
三,解决:
办法1:
统一用utc时间
now := time.Now().UTC()
办法2:
time.parse时指定时区:
用time.ParseInLocation代替
代码:
//定时运行功能,
func startBackgroundJob() {
ticker := time.NewTicker(1 * time.Minute)
local, _ := time.LoadLocation("Asia/Shanghai")
timeStop, _ := time.ParseInLocation("2006-01-02 15:04:05", "2025-07-08 09:45:00", local)
go func() {
for range ticker.C {
// 执行后台任务逻辑
now := time.Now()
// 格式化时间
formattedNow := now.Format("2006-01-02 15:04:05")
//var nowTime := FormattedNow(format string)
formattedStop := timeStop.Format("2006-01-02 15:04:05")
fmt.Println("后台运行:当前时间:",now)
fmt.Println("后台运行:当前时间:",formattedNow)
fmt.Println("后台运行:停止时间:",timeStop)
fmt.Println("后台运行:停止时间:",formattedStop)
//比较时间
if now.After(timeStop) {
fmt.Println("now在stop时间之后了")
}
if now.Before(timeStop) {
fmt.Println("now在stop时间之前")
}
}
}()
}
输出效果:
后台运行:当前时间: 2025-07-08 10:16:05.023681324 +0800 CST m=+60.012715451
后台运行:当前时间: 2025-07-08 10:16:05
后台运行:停止时间: 2025-07-08 09:45:00 +0800 CST
后台运行:停止时间: 2025-07-08 09:45:00
now在stop时间之后了