在MongoDB中将字符串保存为日期会保存错误的值

时间:2018-09-17 13:27:55

标签: javascript node.js mongodb mongoose

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

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

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

因此,2018-09-20不是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); 

}

Index.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})
})
}) 

1 个答案:

答案 0 :(得分:0)

您正在从Node.js插入Javascript Date对象,并且在MongoDB中插入了相同的Date,它已正确插入。

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

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

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

假设我们在日本,日本时间(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

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

因此,new Date("09-20-2018")将存储截至日本时间2018年9月20日00:00的毫秒数。然后,如果您在MongoDB中插入该对象,则它将在内部存储正确的日期(我不知道MongoDB的内部详细信息,但也许它也存储了毫秒)。

如果您选中MongoDB,将会看到类似ISODate("2018-09-19T15:00:00Z")的内容。