golang 解析时间格式字符串成time 类型一定要用 time.ParseInLocation 不要用 time.Parse
在docker中将环境变量TZ设置为Asia/Shanghai,将/etc/timezone文件写为Asia/Shanghai,time.Local就表示上海时区。time.Parse()解析时间时间用的是 UTC时区,time.ParseInLocation 用的是指定时区。看如下代码,同一字符串用不同时区解析。time类型比较先后是有差异的。在写入数据库的时候也是,并且gorm打印数据库sql的时候会看到明明sql是指定写入“2025-05-01 00:00:00”,但是用工具查看写入后的数据又是“2025-05-01 08:00:00”。
func main() {
a := "2025-05-01 00:00:00"
b, _ := time.ParseInLocation("2006-01-02 15:04:05", a, time.Local)
c, _ := time.Parse("2006-01-02 15:04:05", a)
fmt.Println(c.Before(b))
fmt.Println(b.Format("2006-01-02 15:04:05"))
fmt.Println(c.Format("2006-01-02 15:04:05"))
fmt.Println(b.Local().Format("2006-01-02 15:04:05"))
fmt.Println(c.Local().Format("2006-01-02 15:04:05"))
}
false
2025-05-01 00:00:00
2025-05-01 00:00:00
2025-05-01 00:00:00
2025-05-01 08:00:00

浙公网安备 33010602011771号