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)