Golang(Go语言)字符串转时间格式封装以及填坑
先看代码:
package main
import (
"fmt"
"time"
)
func main() {
timeStr := "2021-05-21 00:00:00"
utcTime, _ := time.Parse(time.DateTime, timeStr)
fmt.Println(utcTime)
fmt.Println(utcTime.Local())
}
执行结果:
从这里可以看出,字符串转换为时间的返回值一定是UTC时区的时间,如果再将时间转为本地时间,则会产生时差
所以在这里封装了一个函数,该函数直接返回计算好偏移之后的本地时间
package main
import (
"fmt"
"time"
)
func main() {
timeStr := "2021-05-21 00:00:00"
localTime, _ := StringToLocalTime(timeStr)
fmt.Println(localTime)
fmt.Println(localTime.UTC())
}
// StringToLocalTime 字符串转换为本地时间
func StringToLocalTime(timeStr string) (time.Time, error) {
layouts := []string{
time.Layout,
time.RFC822,
time.RFC822Z,
time.RFC850,
time.RFC1123,
time.RFC1123Z,
time.RFC3339,
time.RFC3339Nano,
time.Kitchen,
time.Stamp,
time.StampMilli,
time.StampMicro,
time.StampNano,
time.DateTime,
time.DateOnly,
time.TimeOnly,
}
utcTime := time.Now()
var err error
for _, layout := range layouts {
utcTime, err = time.Parse(layout, timeStr)
if err == nil {
break
}
}
if err != nil {
return utcTime, err
}
// 传入的字符串转换为时间后一定是UTC时区的
// 需要加上时区的偏移量生成新的UTC时间
// 再将新的UTC时间转换为本地时间的时间
// 获取当前时刻
now := time.Now()
// 通过当前时刻获取时区的名称和偏移量(秒)
_, offset := now.Zone()
// 将偏移量转换为小时数,注意偏移量是以秒为单位的
offsetHours := offset / 3600
offsetHours = -offsetHours
return utcTime.Add(time.Duration(offsetHours) * time.Hour).Local(), nil
}
这样就正常了