将MongoDB中的字符串保存为日期可以保存错误的值

问题描述 投票:0回答:1

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

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

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

因此,而不是2018-09-202018-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})
})
}) 
javascript node.js mongodb mongoose
1个回答
0
投票

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

我认为你很困惑如何在内部存储日期,以及在打印时如何格式化日期。

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

在Javascript中创建Date对象而不设置时区时,默认情况下会在系统时区中创建。此外,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

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

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

如果你查看MongoDB,你会看到像ISODate("2018-09-19T15:00:00Z")这样的东西。

© www.soinside.com 2019 - 2024. All rights reserved.