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时间之后了

 

posted @ 2025-07-19 07:40  刘宏缔的架构森林  阅读(30)  评论(0)    收藏  举报