Summary of golang time issues (usage & frequently asked questions)
1 Usage
1.1 time.Parse()
func main() {
timeStr := "2023-09-26 20:56:23"
allDate, _ := time.Parse("2006-01-02 15:04:05", timeStr)
fmt.Println("全部解析=", allDate)
timeStr = "2023-09-26 20:56:00"
miDate, _ := time.Parse("2006-01-02 15:04:00", timeStr)
fmt.Println("解析到分钟=", miDate)
timeStr = "2023-09-26 20:00:00"
hDate, _ := time.Parse("2006-01-02 15:00:00", timeStr)
fmt.Println("解析到小时=", hDate)
/*
运行结果:
全部解析= 2023-09-26 20:56:23 +0000 UTC
解析到分钟= 2023-09-26 20:56:00 +0000 UTC
解析到小时= 2023-09-26 20:00:00 +0000 UTC
*/
}
1.2 time.ParseInLocation()
func main() {
//带有时区解析
timeStr := "2023-09-26 20:56:23"
date, _ := time.ParseInLocation("2006-01-02 15:04:05", timeStr, time.Local)
//loc, _ := time.LoadLocation("Asia/Shanghai")
//date, _ := time.ParseInLocation("2006-01-02 15:04:05", timeStr, loc)
//结果: 由于time.Local会匹配我们本地时区所以在这里和我们指定时区效果一样
//date= 2023-09-26 20:56:23 +0800 CST
fmt.Println("带有时间区间解析之后, date=", date)
}
1.3 Truncate()、Add()、Sub()
func main() {
timeStr := "2023-09-26 20:56:23"
date, _ := time.ParseInLocation("2006-01-02 15:04:05", timeStr, time.Local)
fmt.Println("before truncate hour, date=", date)
date = date.Truncate(time.Hour)
fmt.Println("after truncate, date=", date)
date = date.Add(time.Duration(-2) * time.Hour)
fmt.Println("sub 2 hour, date=", date)
date = date.Add(time.Hour * 2)
fmt.Println("add 3 hour, date=", date)
/*
before truncate hour, date= 2023-09-26 20:56:23 +0800 CST
after truncate, date= 2023-09-26 20:00:00 +0800 CST
sub 2 hour, date= 2023-09-26 18:00:00 +0800 CST
add 3 hour, date= 2023-09-26 20:00:00 +0800 CST
*/
start, _ := time.Parse("2006-01-02 15:04:05", "2023-09-25 20:56:23")
end, _ := time.Parse("2006-01-02 15:04:05", "2023-09-27 20:56:23")
duration := end.Sub(start)
//相差时间:48h0m0s
fmt.Println("duration=", duration)
}
2 FAQ
2.1 After inserting into the database, the time will automatically +8
Reason: Time zone problem. When operating mssql through
- In golang, it can be solved by specifying the time zone through time.ParseInLocation
func main() {
timeStr := "2023-09-26 20:56:23"
date, _ := time.ParseInLocation("2006-01-02 15:04:05", timeStr, time.Local)
// date= 2023-09-26 20:56:23 +0800 CST
fmt.Println("加载指定时区, date=", date)
//或者手动修复时区,手动修补时间
local := time.FixedZone("CST", 8*3600)
now := time.Now().In(local).Format("2006-01-02 15:04:05")
// 2023-09-26 22:59:09
fmt.Println("now=", now)
}