首页 > 解决方案 > 将 MongoDB 中的字符串保存为日期会保存错误的值

问题描述

我正在尝试将 MongoDB 中的字符串保存为日期,但很难存储正确的值。

在 Mongoose 模式中,数据值存储为日期,但是,我将值传递给数据,new Date("MM-dd-YYYY")但是当我在数据库中查找时,值被转换为这种格式ISODate("YYYY-MM-dd-1T21:00:00Z")

如果日期相同,则格式不会打扰我,但是您注意到数据库中的值比我想要的值早一天。

所以而不是2018-09-20is 2018-08-19。我的猜测是默认 UTC 时间不一样或类似,但我怎样才能设置正确的 UTC 时间?

编辑:

var mongoose = require('mongoose')
var dateformat =require('moment');

//Schema
var ReservationSchema =  mongoose.Schema({
name : {
    type:String,
required : true,
},

numberOfGuests : {
    type : Number ,
required : true,}
,
email: {
    type : String,
    required:true,
    },
phone: {
        type : String,
        required:true,
        },
data:{
    type:Date,
    require:true,
},
timetables:{
    type:String,
    require:true,
},
furtherRequests: {
    type : String,
    }

});

var reservvar = module.exports = mongoose.model('Rezervari', ReservationSchema ,'Rezervari');

module.exports.createReservation = function (query,callback){
//query.data = dateformat.utc(query.data).format("MM-DD-YYYY")
reservvar.create(query,callback); 

}
module.exports.getReservations = function (callback){
reservvar.find({},callback); 

}

索引.js 文件:

app.get('/api/reservations',function(req,res) {
Rezervari.getReservations(function(err,reserv){
    if(err){
        throw err;
    }
    var changetime = reserv[1].data;
    console.log(reserv[1].data)
    changetime = dateformat.utc(changetime).format("MM-DD-YYYY") // this one returns the date in desired format but with wrong values as stored in db
    console.log(changetime)
    res.json(reserv);
});
});
app.post('/api/createrezervare', function (req,res) {
const reserv = req.body
const name = reserv.name
const numberofg = reserv.number
const phone = reserv.phone
const email = reserv.email
const data = reserv.date
const timetable = reserv.time
const furtreq = reserv.frequests
Rezervari.createReservation({name:name,numberOfGuests:numberofg,phone:phone,email:email,data:data,timetables:timetable,furtRequests:furtreq},function(err,reserv){
if(err){
    throw err}
res.json({status:true})
})
}) 

标签: javascriptnode.jsmongodbmongoose

解决方案


您正在从 Node.js 插入一个 Javascript 日期对象,并且相同的日期被插入到 MongoDB 中,它被正确插入。

我认为您对日期的内部存储方式以及打印日期的格式感到困惑。

当您在 MongoDB 中检查数据的内容时,它只是以特定格式显示,即 ISO 日期。如果您仔细查看显示的日期,您可以看到一个Z结束,Z 表示“零小时偏移”,也称为“祖鲁时间”(UTC)。

在 Javascript 中,当您在不设置时区的情况下创建 Date 对象时,默认情况下会在您的系统时区中创建它。此外,日期对象不以任何格式存储,也不在 JS 和 MongoDB 中。在 JS 中,日期在内部存储为时间值(自 1970-01-01 以来的毫秒数)。

假设我们在日本,JST 时间(UTC+9):

const d = new Date("09-20-2018");
console.log(d.getTime()); // 1537369200000
console.log(d.toString()); // Thu Sep 20 2018 00:00:00 GMT+0900 (JST)
console.log(d.toISOString()); // 2018-09-19T15:00:00.000Z

首先,我们在包含时区的日期之后打印出毫秒数,最后是 ISO 日期,这与 MongoDB 在 Mongo shell 中用于打印日期的格式几乎相同(无论如何,在 UTC 中)。

因此,new Date("09-20-2018")将在日本时间存储毫秒直到 09-20-2018 00:00。然后,如果你在 MongoDB 中插入该对象,它会在内部存储正确的日期(我不知道 MongoDB 的内部细节,但它可能也在存储毫秒)。

如果你检查 MongoDB,你会看到类似ISODate("2018-09-19T15:00:00Z").


推荐阅读