【问题标题】:Error while using time.Parse when timezone and offset are together使用 time.Parse 时出错,当时区和偏移量在一起时
【发布时间】:2020-11-16 16:59:00
【问题描述】:

我有以下代码:

package main

import (
    "fmt"
    "time"
    "log"
)

func main() {
    date, err := time.Parse("Monday, 2 January 2006 15:04:05 PM MST-07:00" ,"Thursday, 17 August 2020 13:20:00 PM GMT+08:00")
    if err != nil {
      log.Fatal(err.Error())
    }
    fmt.Println(date)
}

它失败并出现以下错误:

2009/11/10 23:00:00 解析时间“2020 年 8 月 17 日星期四 13:20:00 PM GMT+08:00”为“2006 年 1 月 2 日星期一下午 15:04:05 MST-07:00”:不能 将“:00”解析为“-07:00”

但如果我在布局示例和实际字符串中将 MST-07:00 与空格分隔为:“MST -07:00”,则它会成功。

我做错了什么?

【问题讨论】:

    标签: date parsing go time


    【解决方案1】:

    GMT 时间由time.Parse 进行特殊处理。值中 GMT 的带符号偏移量必须在 -23 到 +23 的范围内,不包括零,并且不能包含冒号。布局应该只指定 MST 而没有偏移量。

    例如:

    package main
    
    import (
        "fmt"
        "log"
        "time"
    )
    
    func main() {
        for _, ts := range []string{
            "Thursday, 17 August 2020 13:20:00 PM GMT",
            "Thursday, 17 August 2020 13:20:00 PM GMT+2",
            "Thursday, 17 August 2020 13:20:00 PM GMT-2",
        } {
            date, err := time.Parse("Monday, 2 January 2006 15:04:05 PM MST", ts)
            if err != nil {
                log.Fatal(err.Error())
            }
            fmt.Println(date)
        }
    }
    

    产生输出:

    crow@mac:tp$ ./example
    2020-08-17 13:20:00 +0000 GMT
    2020-08-17 15:20:00 +0200 GMT+2
    2020-08-17 11:20:00 -0200 GMT-2
    

    An issue was raised for this 不久前,结果是(参考包含GMT+10:00 的示例时间字符串):

    GMT 的特殊处理,这是其他事情所需要的,使得 很难知道 +10:00 是否应该被视为一部分 时区或单独放置以匹配布局。

    因此该问题在没有建议更改的情况下关闭。

    【讨论】:

    • 所以,基本上没有办法在不截断其值的情况下转换我的时间戳,删除最后一个 :00?
    • @MatiasBarrios:没有办法使用标准的time.Parse,对。当然,没有什么可以阻止某人编写一个工作方式不同的时间解析函数。
    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2011-09-02
    • 1970-01-01
    相关资源
    最近更新 更多