Go语言time.Parse解析时区偏移报错:cannot parse "800" as " -700" 问题排查咨询
解决Go语言time.Parse解析时区字符串的错误
嘿,我一眼就看出问题出在哪了!你碰到的解析错误确实是layout字符串的时区格式写错了。
Go的time.Parse函数对格式字符串的要求特别严格,必须完全对应它的参考时间模板Mon Jan 2 15:04:05 MST 2006。你现在用的时区格式是-700,但这个格式和你要解析的-800不兼容——因为参考时间里的数字时区格式是四位带前导零的-0700(对应UTC-07:00),而不是三位的-700。
看报错信息cannot parse "800" as " -700"就能明白:Go在解析时,把你拼接的-800拆成了空格后的-和800,但你的layout里时区部分是-700,它期望匹配的是-加三位数字,但因为格式定义不符合Go的规范,导致解析逻辑混乱,没法正确识别整个时区字符串。
给你两种修复方案,选哪种都可以:
方案一:使用四位数字时区格式
把layout里的时区部分改成-0700,同时拼接的时区字符串改成带前导零的-0800:
package main import ( "fmt" "log" "time" ) func main() { layout := "1/02/2006 15:04:05 -0700" cellContent := "7/28/2021 22:45:34" t, err := time.Parse(layout, fmt.Sprintf("%s %s", cellContent, "-0800")) if err == nil { fmt.Println(t.String()) } else { log.Fatal(err) } }
方案二:使用带冒号的时区格式
如果你更习惯-08:00这种写法,就把layout改成带冒号的时区格式,对应的拼接字符串也用-08:00:
package main import ( "fmt" "log" "time" ) func main() { layout := "1/02/2006 15:04:05 -07:00" cellContent := "7/28/2021 22:45:34" t, err := time.Parse(layout, fmt.Sprintf("%s %s", cellContent, "-08:00")) if err == nil { fmt.Println(t.String()) } else { log.Fatal(err) } }
另外提一句,解析后的time.Time对象会带有你指定的UTC-08:00时区信息,如果之后需要转成其他时区(比如UTC),直接用t.In(time.UTC)就可以啦。
内容的提问来源于stack exchange,提问作者Al Pacifico
相关产品推荐
相关产品推荐

