2016-11-04 45 views
0

我试图从的MongoDB + JS日期-1

items.push({ 
    date: moment(new Date(day.label)).tz('Europe/Paris').format('YYYY/MM/DD'), 
}); 

day.label添加使用

db.collection('course').insertOne({ 
    date: new Date(item.date) 
}); 

item.date是我的MongoDB的文档内的新日期,就像'14 November 2016'

item.date形成如2016/11/14

在文档中插入工作,但日期没有正确格式化,例如,用于2016/11/14蒙戈插入"date" : ISODate("2016-11-13T23:00:00Z")

每次插入日期被移位-1天

是MongoDB中插入自定义格式化日期的正确方法? 我应该改变momentJs的日期格式吗?

编辑:

日期是因为不同的时区的移动。

+3

巴黎与UTC的时区不同,所以这就是您的区别所在。就我个人而言,我会将日期存储为时间戳,并在读出时将其转换回日期对象 – UnholySheep

+0

是的,我刚刚注意到...我会尝试使用时间戳。谢谢 –

+0

你应该总是告诉解析器你要解析的格式,否则它必须猜测。 – RobG

回答

0

它没有被移动一天,它实际上并没有被移位。

显示的时间偏移了一个小时。如果您注意到,时间在前一天已经变为23:00,而不是在您指定日期的默认午夜。

更重要的是,时间戳中的Z后缀表示时区为UTC,而UTC中的2016-11-13T23:00:00表示与时间戳2016-11-14T00:00:00+01:00相同的时间点。所以datetime正在创建正确,但只是显示在你创建它在不同的时区。

0

Mongo数据库以ISO格式与UTC值存储日期时间。

db.collection('course').insertOne({ 
    date: new Date(item.date) 
}); 

总是尝试使用UTC时间将本地日期显式更改为ISO格式以避免混淆。这样,mongodb就会取这个值并插入到db中。

items.push({ 
    date: moment(new Date(day.label)).tz('Europe/Paris').utc().format() 
}); 

您应该将其解析为从utc返回巴黎时区,然后将其呈现给用户。

时间戳只用于内部mongo db的使用。不适用于应用程序开发。

https://docs.mongodb.com/manual/reference/bson-types/#document-bson-type-timestamp

0

如果你想为所有日期UTC问题妥善解决,商店 日期作为标准的ISO格式如上

// India 
moment().toISOString() // "2016-11-06T06:17:33.520Z" 

// canada 
moment().toISOString() // "2016-11-06T06:19:42.133Z" 

now see the diffrence by convering date from database 

// canada time zone 
moment("2016-11-06T06:19:42.133Z").format() // "2016-11-05T23:19:42-07:00" 

// india time zone 
moment("2016-11-06T06:19:42.133Z").format() //"2016-11-06T11:49:42+05:30" 

看到本地UTC的之探源,所以不必转换日期从任何 时区到其他时区