【问题标题】:How come I cannot parse an already RFC3339 string back to a RFC3339 string?为什么我不能将已经 RFC3339 字符串解析回 RFC3339 字符串?
【发布时间】:2015-08-15 04:02:37
【问题描述】:

我将一个变量存储到 MySQL 数据库中,字段类型为 VARCHAR(255),如下所示:

ts, err := time.Parse(time.RFC3339, nonce[0:20])

效果很好,显示如下:

然后当我需要从数据库中获取它时,我会这样做:

rows, err := db.Query("SELECT nonce, time FROM noncestore WHERE endpoint=?", endpoint)

        var sTimeStamp, nonceHolder string
        for rows.Next() {
                err = rows.Scan(&nonceHolder, &sTimeStamp)
                errCheck(err)

Gives error//>> timeStamp, err := time.Parse(time.RFC3339, sTimeStamp)
                errCheck(err)

                if timeStamp == ts && nonceHolder == s {
                        return errors.New("Nonce already used")
                }

                if now.Sub(timeStamp) < *maxNonceAge {
                        _, err := db.Query("INSERT INTO noncestore SET nonce=?, time=?, endpoint=?", nonceHolder, sTimeStamp, endpoint)
                        errCheck(err)
                }
        }

上面提到的那行给了我这个错误:

2015/08/14 21:56:18 http: panic serving [::1]:49663: Failed: parsing time "2015-08-15 03:56:00" as "2006-01-02T15:04:05Z07:00": cannot parse " 03:56:00" as "T"

为什么它能够将其转换为RFC3339 并将其存储在数据库中,但是当需要获取它并将其格式化回RFC3339 以便我可以在我的 if 语句中使用时,我得到一个错误?

【问题讨论】:

    标签: mysql go rfc3339


    【解决方案1】:

    您的数据库驱动程序似乎以 RFC3339 中没有的格式返回时间。而不是使用

    timeStamp, err := time.Parse(time.RFC3339, sTimeStamp)
    

    尝试使用

    timeStamp, err := time.Parse("2006-01-02 15:04:05", sTimeStamp)
    

    要记住的重要一点是,数据库本身根本不会存储原始字符串,RFC3339 或其他。它有自己的时间内部表示,当您查询它时,您获得的值取决于该数据库希望如何将其重新分配给您。在这种情况下,它选择了一种稍微不同的格式,我在上面粘贴的格式字符串(以“2006-01-02...”开头的格式字符串)应该可以解决这个问题。是的,在 Go 中,日期格式字符串看起来就像日期本身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 2020-10-27
      相关资源
      最近更新 更多