我试图将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})
})
})
您正在从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")
这样的东西。