MongoDB对插入时间的规范调查:MongoDB内的时间以UTC(无时区)和毫秒为单位
首先
当我在Go语言中编写Mongo相关代码时,有人提到了:“在将时间戳存入MongoDB后,值会发生改变”,所以我确认了这个规范。
Mongo的时间行为:time.Time与信息不同。
举一个例子来说明,可以使用time.Time在MongoDB中获取日期和时间,然后将其插入到Mongo中,并进行查找。
package main
import (
"fmt"
"time"
"github.com/globalsign/mgo"
"github.com/globalsign/mgo/bson"
"github.com/google/uuid"
)
type MyDoc struct {
ID uuid.UUID
Time time.Time
}
func main() {
dbname := "sampleDocument"
connection, _ := mgo.Dial("mongodb://localhost/" + dbname)
db := connection.DB(dbname)
//元ネタとなる時刻取得
doc := MyDoc{uuid.New(), time.Now()}
fmt.Printf("data in time.Time:[%v]\n", doc)
//insert
collection := db.C("doc")
collection.Insert(doc)
//中身の確認
var getFromMongo MyDoc
collection.Find(bson.M{"id": doc.ID}).One(&getFromMongo)
fmt.Printf("data in Mongo:[%v]\n", getFromMongo)
}
以上所示为执行结果的样子。
項目time.Time.Now()Mongo精度nanosecondmillisecondタイムゾーンJSTUTC
$ go run main.go
data in time.Time:[{b7350e5d-05d0-429a-9d51-1eb365e71d76 2019-06-25 23:11:36.706508427 +0900 JST m=+0.001236469}]
data in Mongo:[{b7350e5d-05d0-429a-9d51-1eb365e71d76 2019-06-25 14:11:36.706 +0000 UTC}]
确认实际上进入MongoDB的信息后,信息已经消失。这意味着这可能是Mongo本身的特性,虽然可能性很低,但也有可能是与Golang的插入部分相关的Mongo驱动程序的问题。由于信息以ISODate的格式输入,因此可以推测这是Mongo的规范进行转换的原因。
> db.doc.find()
{ "_id" : ObjectId("5d122aa6bf374055deac672e"), "id" : BinData(0,"ugCCZy0ERyWRZRk+V2fxIw=="), "time" : ISODate("2019-06-25T14:07:34.331Z") }
Mongo的时间规范
在Mongo中,数据以一种名为BSON的数据格式进行存储。根据其规格,可以了解以下内容:
如下所示,1. 时区为UTC,2. 数据精度为毫秒。
世界协调时日期时间 – int64是自Unix纪元以来的UTC毫秒数。
请确认MongoDB的日期规范。根据Date()的说明进行查阅。
new Date(“YYYY-mm-ddTHH:MM:ss”) specifies the datetime in the client’s local timezone and returns the ISODate with the specified datetime in UTC.
如果在运行时没有指定时区,则使用计算机的时区来计算并返回UTC时间。
从Behavior中可以看出,同样是以毫秒为单位。
在内部,Date对象以一个带符号的64位整数形式存储,代表自Unix纪元(1970年1月1日)以来的毫秒数。
所以,我们了解到以下是规格要求。
項目time.Time.Now()Mongo精度nanosecondmillisecondタイムゾーンJSTUTC
请参照
BSON规范版本1.1
MongoDB日期()
堆栈溢出:来自MongoDB ISO日期对象丢失的纳秒
解决Mongo的ISO日期时区问题