我正在尝试解析时间值(通过电子邮件收到),但我找不到应该使用的布局.
package main
import "fmt"
import "time"
func main() {
layout := "Mon, _2 Jan 2006 15:04:05 -0700 (MST-07:00)"
data := "Mon, 5 Oct 2015 00:24:08 +0800 (GMT+08:00)"
t, err := time.Parse(layout, data)
if err != nil {
panic(err)
}
fmt.Println(t)
}
Run Code Online (Sandbox Code Playgroud)
panic: parsing time "Mon, 5 Oct 2015 00:24:08 +0800 (GMT+08:00)" as "Mon, _2 Jan 2006 15:04:05 -0700 (MST-07:00)": cannot parse ":00)" as "-07:00"
请阅读重要说明!部分得到一个完整的图片作为最后一部分包括GMT不是它看起来(也就是说,它不是区域缩写).
您的输入时间字符串不能与time包一起解析,因为在最后一部分中(GMT+08:00),区域缩写和区域偏移不会与任何额外字符分开.并且由于区域缩写不限于3个字符,因此"+08"也将区域缩写视为区域缩写的一部分,只留下其余部分":00)"以匹配区域偏移,"-07:00"因此出现错误消息:
cannot parse ":00)" as "-07:00"
Run Code Online (Sandbox Code Playgroud)
可能的解决方法:
简单地切断多余的区域偏移,因为它是冗余的(重复,因为区域偏移包括两次):
func Parse(s string) (time.Time, error) {
if len(s) < 7 {
return time.Time{}, errors.New("Too short!")
}
s = s[:len(s)-7]
layout := "Mon, _2 Jan 2006 15:04:05 -0700 (MST"
return time.Parse(layout, s)
}
Run Code Online (Sandbox Code Playgroud)
并使用它:
data := "Mon, 5 Oct 2015 00:24:08 +0800 (GMT+08:00)"
t, err := Parse(data)
if err != nil {
panic(err)
}
fmt.Println(t)
Run Code Online (Sandbox Code Playgroud)
在Go Playground尝试一下.
虽然在逻辑上分析您的输入时间字符串:
Mon, 5 Oct 2015 00:24:08 +0800 (GMT+08:00)
Run Code Online (Sandbox Code Playgroud)
最后一部分"(GMT+08:00)" 并不表示区域缩写(GMT不是+0800而是+0000)!这只是读者的一个帮助文本,解释说+0800是要添加到GMT时区的区域偏移,所以很可能它总是GMT但不是因为时间是在GMT时区中指定的,而是因为它解释了区域偏移意味着要添加到GMT时间的偏移量.因此,它不是时间规范的一部分,不应该被解析.
所以切掉所有的最后一部分并解析它:
func Parse(s string) (time.Time, error) {
if len(s) < 12 {
return time.Time{}, errors.New("Too short!")
}
s = s[:len(s)-12]
layout := "Mon, 2 Jan 2006 15:04:05 -0700"
return time.Parse(layout, s)
}
Run Code Online (Sandbox Code Playgroud)
另请注意,如果确实如此(它不是区域缩写但总是如此"GMT"),则可以通过更改布局以包含静态文本"GMT"而不是区域缩写说明符来解析输入字符串而不截断它"MST":
layout := "Mon, 2 Jan 2006 15:04:05 -0700 (GMT-07:00)"
data := "Mon, 5 Oct 2015 00:24:08 +0800 (GMT+08:00)"
t, err := time.Parse(layout, data)
Run Code Online (Sandbox Code Playgroud)