golangtimeTime.Before如果使用不当,可能会遇到一个巨大的坑~
Time.BeforeTimetimeBeforeTime具体的定义如下:
func (t Time) Before(u Time) booltutruefalse- 代码示例
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"t1t12.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
falset1nowt1_.Before(now)false这里就是文章开头说的坑...
t1t1_t1_UTCnowCST问题的根本原因是因为:
time.ParseUTCtime.Now().Local()UTC2.2 正确示例
time.ParseInLocationtime.Parsetime.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
truetime.Localtime.ParseInLocationt1_nowt1_.Before(now)