如何解析星期一,2015年10月5日00:24:08 +0800(GMT + 08:00)

时间:2015-10-05 07:34:36

标签: time go

我试图解析时间值(通过电子邮件收到),但我无法找到应该使用的布局。

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)
}

Check

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"

2 个答案:

答案 0 :(得分:5)

请阅读重要说明!部分以获取完整的图片,因为包括GMT在内的最后一部分不是它看起来的(也就是说,它不是区域缩写)。< / p>

您的输入时间字符串不能与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)

答案 1 :(得分:-1)

在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"