数据存储正在对时间字段进行四舍五入处理。

huangapple go评论123阅读模式
英文:

Time field being rounded by datastore

问题

当将时间值保存到数据存储中时,似乎会丢失一些精度。但是,保存到内存缓存中的时间值不会出现这种情况。

以下代码通常返回以下结果:

  1. 2014-09-29 21:38:45.5991137 +0100 BST
  2. 2014-09-29 21:38:45.599113 +0100 BST
  3. 2014-09-29 21:38:45.5991137 +0100 BST

为什么会发生这种情况?我能否防止这种情况发生?或者我是否存在一些基本误解?

谢谢。

  1. import (
  2. "appengine/aetest"
  3. "appengine/datastore"
  4. "appengine/memcache"
  5. "log"
  6. "os"
  7. "testing"
  8. "time"
  9. )
  10. func TestTimeDiff(t *testing.T) {
  11. logger := log.New(os.Stderr, "", 0)
  12. c, _ := aetest.NewContext(&aetest.Options{"", true})
  13. defer c.Close()
  14. type MyType struct {
  15. Time time.Time
  16. }
  17. value1 := MyType{time.Now()} // create value1
  18. k := datastore.NewKey(c, "MyType", "mykey", 0, nil)
  19. datastore.Put(c, k, &value1) // persist value1 to datastore
  20. var value2 MyType
  21. datastore.Get(c, k, &value2) // create value2 as value1 retrieved from datastore
  22. item := &memcache.Item{
  23. Key: "MC_MYTYPE",
  24. Object: value1,
  25. }
  26. memcache.Gob.Set(c, item) // persist value1 to memcache
  27. var value3 MyType
  28. memcache.Gob.Get(c, "MC_MYTYPE", &value3) // create value3 as value1 retrieved from memcache
  29. logger.Println("1) " + value1.Time.String())
  30. logger.Println("2) " + value2.Time.String())
  31. logger.Println("3) " + value3.Time.String())
  32. }
英文:

A Time value when saved to the datastore appears to lose some accuracy. The same does not happen for Time values saved to memcache.

The code below typically returns the following:

  1. 1) 2014-09-29 21:38:45.5991137 +0100 BST
  2. 2) 2014-09-29 21:38:45.599113 +0100 BST
  3. 3) 2014-09-29 21:38:45.5991137 +0100 BST

Why does this happen, and can I prevent it? Or do I have some fundamental misunderstanding?

Thanks.

  1. import (
  2. "appengine/aetest"
  3. "appengine/datastore"
  4. "appengine/memcache"
  5. "log"
  6. "os"
  7. "testing"
  8. "time"
  9. )
  10. func TestTimeDiff(t *testing.T) {
  11. logger := log.New(os.Stderr, "", 0)
  12. c, _ := aetest.NewContext(&aetest.Options{"", true})
  13. defer c.Close()
  14. type MyType struct {
  15. Time time.Time
  16. }
  17. value1 := MyType{time.Now()} // create value1
  18. k := datastore.NewKey(c, "MyType", "mykey", 0, nil)
  19. datastore.Put(c, k, &value1) // persist value1 to datastore
  20. var value2 MyType
  21. datastore.Get(c, k, &value2) // create value2 as value1 retrieved from datastore
  22. item := &memcache.Item{
  23. Key: "MC_MYTYPE",
  24. Object: value1,
  25. }
  26. memcache.Gob.Set(c, item) // persist value1 to memcache
  27. var value3 MyType
  28. memcache.Gob.Get(c, "MC_MYTYPE", &value3) // create value3 as value1 retrieved from memcache
  29. logger.Println("1) " + value1.Time.String())
  30. logger.Println("2) " + value2.Time.String())
  31. logger.Println("3) " + value3.Time.String())
  32. }

答案1

得分: 2

App Engine Datastore 以微秒精度存储时间

Go的time.Time类型具有纳秒精度。存储到Memcache的gob使用了这个完整的精度。

英文:

The App Engine Datastore stores times with with microsecond precision.

The Go time.Time type has nanosecond precision. The gob stored to Memcache uses this full precision.

huangapple
  • 本文由 发表于 2014年9月30日 04:49:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/26108626.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定