2014-09-01 93 views
2

我正在使用Go运行时将Appengine数据存储中的实体存储在添加它们的时间顺序中;将时间戳存储在密钥中我使用time.Time.String()方法格式化时间戳,并将字符串版本存储为密钥。Golang - 时间戳在格式化和存储后丢失一年

重新取得时间上检索我使用time.Parse:

time.Parse("2006-01-02 15:04:05.000000000 +0000 UTC", the_timestamp) 

的单元测试此功能独立的应用程序(使用CMDLINE - goapp测试)我的测试中检索整个时间戳没有问题。

但是当我导入包这样到AppEngine应用程序并对其进行测试(使用CMDLINE - goapp服务)的时间戳存储与设置它的年字段设置为“0000”

+0

为什么不使用MarshalJSON()或MarshalText()函数? String()函数供人类使用:它不一定是数据序列化的良好格式。 – dyoo 2014-09-01 16:18:46

回答

3

当你的时间转换为保存到数据存储之前的字符串,在时间结束时多余的0被删除。 所以,

2009-11-10 23:00:00.12300000 +0000 UTC 

转换成

2009-11-10 23:00:00.123 +0000 UTC 

现在,当您从数据存储检索和使用解析函数,它尝试匹配高达小数点后8位数字。因此错误。

因此,在将时间转换为字符串时,您需要格式化字符串以避免丢失0。

const layout = "2006-01-02 15:04:05.000000000 +0000 UTC" 
t := time.Now() 
tFormat := t.Format(layout) 

http://play.golang.org/p/elr28mfMo8

+0

但是... http://play.golang.org/p/sGsswD1PSU:“'2006-01-02 15:04:05.000000000 +0000 UTC'”会工作(即使“2006-01-02 15: 04:05.000000000 0000 UTC“不会:'+0000 UTC'与'0000 UTC') – VonC 2014-09-01 11:49:44

+0

我想我发现了这个问题。将时间转换为字符串时,时间末尾的额外0将被截断。因此解析失败。 http://play.golang.org/p/Fyiqf9v3GJ ...现在更新答案。 – ntsh 2014-09-01 12:19:33