我将变量存储到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中使用声明我收到错误?
答案 0 :(得分:2)
看起来您的数据库驱动程序返回的格式不在RFC3339中。而不是使用
timeStamp, err := time.Parse(time.RFC3339, sTimeStamp)
尝试使用
timeStamp, err := time.Parse("2006-01-02 15:04:05", sTimeStamp)
要记住的一件重要事情是数据库本身根本不会存储原始字符串,RFC3339或其他。它有自己的内部时间表示,当你查询它时,你得到的值取决于数据库希望如何重复它给你。在这种情况下,它选择了一种稍微不同的格式,我上面粘贴的格式字符串(以&#34; 2006-01-02 ......&#34;开头的格式字符串)应该固定。是的,在Go中,日期格式字符串看起来像日期本身。