javascript - 将 MongoDB 中的字符串保存为日期会保存错误的值
问题描述
我正在尝试将 MongoDB 中的字符串保存为日期,但很难存储正确的值。
在 Mongoose 模式中,数据值存储为日期,但是,我将值传递给数据,new Date("MM-dd-YYYY")
但是当我在数据库中查找时,值被转换为这种格式ISODate("YYYY-MM-dd-1T21:00:00Z")
如果日期相同,则格式不会打扰我,但是您注意到数据库中的值比我想要的值早一天。
所以而不是2018-09-20
is 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})
})
})
解决方案
您正在从 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")
.
推荐阅读
- parquet - Synapse 专用池与分区 PARQUET
- google-bigquery - BigQuery - 为什么时间旅行(FOR SYSTEM_TIME AS OF)不适用于视图?
- javascript - 为什么我的 Javascript 输入验证不想运行?
- c - 为其他变量分配值时,C struct 变量被覆盖
- mysql - 如何删除 MySQL 中的所有过程和函数
- c - 我们如何将文件描述符限制为始终小于 1024?
- c# - Azure Functions .NET 6.0 EFCore Dependyinjection、IdentityDbContext 在 FunctionStartup 中出错
- node.js - 使用带有 React(导入)的 nodeJS 文件(module.exports)的 Webpack 配置?
- angular - @Input 的默认值导致测试问题 - 角度,抽象类
- mysql - MYSQL,Prestashop,如何遍历所有 id_products?