为了账号安全,请及时绑定邮箱和手机立即绑定

如何解析 Mon, 5 Oct 2015 00:24:08 +0800 (GMT+08:00)

如何解析 Mon, 5 Oct 2015 00:24:08 +0800 (GMT+08:00)

Go
吃鸡游戏 2021-11-15 15:06:48
我正在尝试解析时间值(通过电子邮件接收),但我找不到应该使用的布局。package mainimport "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"
查看完整描述

2 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

请阅读重要说明!部分以获得全貌,因为最后一部分包括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)


查看完整回答
反对 回复 2021-11-15
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

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


查看完整回答
反对 回复 2021-11-15
  • 2 回答
  • 0 关注
  • 349 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信