2015-08-15 103 views
0

我存储一个变量到MySQL数据库的VARCHAR(255)这样的字段类型:为什么我不能将已经RFC3339字符串解析回RFC3339字符串?

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

伟大的工程,并显示了这样的:

pic1

然后当我需要从数据库中得到它我这样做:

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语句中使用我遇到错误?

回答

2

它看起来像你的数据库驱动程序返回的格式不在RFC3339中的时间。而不是使用使用

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

一个重要的事情要记住

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

尝试的是,数据库本身不会存储原始字符串所有,RFC3339或以其他方式。它有自己的内部时间表示,当你查询它时,你得到的价值取决于该数据库如何向你反复表达。在这种情况下,它选择了一种有点不同的格式,其中上面粘贴的格式字符串(以“2006-01-02 ...”开头的格式字符串)应该可以修复。是的,在Go中,日期格式字符串看起来像日期本身。