golang的time包关于时区的一个坑

先看如下这段代码

func main() {
	nowTime1 := time.Now()
	nowTime2,_ := time.Parse("2006-01-02 15:04:05",time.Now().Add(-7*time.Hour).Format("2006-01-02 15:04:05"))
	if nowTime1.Before(nowTime2){
		fmt.Println("1")
	} else {
		fmt.Println("2")
	}
}

nowTime2往前挪了7个小时,那么应该是在nowTime前面,程序应该输出2。

如果你运行一下这段程序,你会发现输出的是1。

原因很简单,就是时区的问题。

time.Now()返回是的带有+8时区的,但是Parse()函数默认会变成0时区,我们-7个小时当然无法抵消+8了。

解决的方法也很简单,不使用Parse(),而是使用ParseInLocation(),改进后代码如下

func main() {
	nowTime1 := time.Now()
	nowTime2,_ := time.ParseInLocation("2006-01-02 15:04:05",time.Now().Add(-7*time.Hour).Format("2006-01-02 15:04:05"),time.Local)
	if nowTime1.Before(nowTime2){
		fmt.Println("1")
	} else {
		fmt.Println("2")
	}
}

此时程序就会输出2了

发表评论

邮箱地址不会被公开。 必填项已用*标注