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日期时区问题

广告
将在 10 秒后关闭
bannerAds