golangtimeTime.Before

如果使用不当,可能会遇到一个巨大的坑~


Time.Before
TimetimeBeforeTime

具体的定义如下:

func (t Time) Before(u Time) bool
tutruefalse
  • 代码示例
package main

import (
	"fmt"
	"time"
)

func main() {
	t1 := time.Now().Local()
	time.Sleep(3 * time.Second)
	t2 := time.Now().Local()

	fmt.Println(t1.Before(t2))
}
  • 执行结果
true

二、时间字符串的比较

假如有一个时间字符串:

t1 := "2023-07-18 15:20:05"
t1t1

2.1 错误示例

  • 代码示例
package main

import (
	"fmt"
	"time"
)

func main() {
	t1 := "2023-07-18 15:20:05"

	//t1为字符串,需要解析为时间对象
	t1_, _ := time.Parse("2006-01-02 15:04:05", t1)
	fmt.Println("t1 =", t1)
    fmt.Println("t1_ =", t1_)

	now := time.Now().Local()
	now.Format("2006-01-02 15:04:05")
	fmt.Println("now =", now)

	fmt.Println(t1_.Before(now))
}
  • 执行结果
t1 = 2023-07-18 15:20:05
t1_ = 2023-07-18 15:20:05 +0000 UTC
now = 2023-07-18 15:30:30.8035294 +0800 CST
false
t1nowt1_.Before(now)false

这里就是文章开头说的坑...


t1t1_
t1_UTCnowCST

问题的根本原因是因为:

time.ParseUTCtime.Now().Local()UTC

2.2 正确示例

time.ParseInLocationtime.Parse
time.Parsetime.ParseInLocation
  • 代码示例
package main

import (
	"fmt"
	"time"
)

func main() {
	t1 := "2023-07-18 15:20:05"

	//t1为字符串,需要解析为时间对象
    //time.Local:获取本地时区
	t1_, _ := time.ParseInLocation("2006-01-02 15:04:05", t1, time.Local)
	fmt.Println("t1 =", t1)
	fmt.Println("t1_ =", t1_)

	now := time.Now().Local()
	now.Format("2006-01-02 15:04:05")
	fmt.Println("now =", now)

	fmt.Println(t1_.Before(now))
}
  • 执行结果
t1 = 2023-07-18 15:20:05
t1_ = 2023-07-18 15:20:05 +0800 CST
now = 2023-07-18 15:49:49.8141923 +0800 CST
true
time.Localtime.ParseInLocationt1_nowt1_.Before(now)