我正在尝试解析时间值(通过电子邮件接收),但我找不到我应该使用的布局。
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)
}
检查 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"
可能的解决方案:
简单地切断多余的区域偏移量,因为它是冗余的(重复的,因为区域偏移量包含两次):
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)
}
和使用它:
data := "Mon, 5 Oct 2015 00:24:08 +0800 (GMT+08:00)"
t, err := Parse(data)
if err != nil {
panic(err)
}
fmt.Println(t)
在Go Playground上试试
重要的注意!
虽然逻辑分析你的输入时间字符串:
Mon, 5 Oct 2015 00:24:08 +0800 (GMT+08:00)
最后一部分"(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)
}
还请注意,如果确实是这种情况(它不是区域缩写,但始终是"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)
在MST和-之间设置一个空格可以解决恐慌。
layout := "Mon, _2 Jan 2006 15:04:05 -0700 (MST -07:00)"
data := "Mon, 5 Oct 2015 00:24:08 +0800 (GMT +08:00)"
这个方法可以工作,但是它并不能真正解决你的问题。
为什么不删除多余的时区部分?您已经定义了+0800。
layout := "Mon, _2 Jan 2006 15:04:05 -0700"
data := "Mon, 5 Oct 2015 00:24:08 +0800"