Javascript 返回自午夜创建的文档
我想查找自午夜以来创建的所有文档,而不考虑用户的时区。如果用户在太平洋时间,它应该显示自午夜太平洋以来的所有文档。东部时间也一样 我在东部时间,这对我很有用:Javascript 返回自午夜创建的文档,javascript,mongodb,Javascript,Mongodb,我想查找自午夜以来创建的所有文档,而不考虑用户的时区。如果用户在太平洋时间,它应该显示自午夜太平洋以来的所有文档。东部时间也一样 我在东部时间,这对我很有用: var d = new Date(); var midnight = d.setHours(0,0,0,0); // last midnight var count = Items.find({ username: Meteor.user().username, createdAt: { $gt:
var d = new Date();
var midnight = d.setHours(0,0,0,0); // last midnight
var count = Items.find({
username: Meteor.user().username,
createdAt: { $gt: midnight }
}).count();
但我的客户是CST的,这对他不起作用。相反,它显示了自CST前一天晚上10点或11点以来创建的文档。所以这对我来说似乎是个时区问题 try
setUTCHours(0,0,0,0)代码>。它获取的协调世界时对于每个用户都应该相同。假设这只是客户端问题(所有时间都存储在服务器上的UTC中),则您可以通过执行以下操作获取用户当前时区午夜的UTC调整时间:
var now = new Date();
var midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate());
var midnight_utc = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()));
看这把小提琴:
例如,对于我的当前时区(东部),我获得了以下值:now、midnight和midnight_utc(使用toLocaleString()方法打印日期对象时):
我有类似的要求,所以我使用了以下方法
已创建将datetime映射到\u id的函数
使用该id获取我的数据
我正在使用的函数是
function objectIdWithTimestamp(timestamp){
// Convert string date to Date object (otherwise assume timestamp is a date)
if (typeof(timestamp) == 'string') { timestamp = new Date(timestamp); }
// Convert date object to hex seconds since Unix epoch
var hexSeconds = Math.floor(timestamp/1000).toString(16);
// Create an ObjectId with that hex timestamp
var constructedObjectId = ObjectId(hexSeconds + "0000000000000000");
return constructedObjectId
}
使用它
db.collection.find({_id:{$gte:objectIdWithTimestamp(Y/m/d H:i:s)}})
我建议你试试图书馆,解决时区问题。在执行客户机代码的地方,获取其最后一个午夜时间,将其转换为UTC时间&然后轻松地从MongoDb检索信息。稍等片刻库使用示例,了解更多详细信息
午夜后几分钟
您可以从用户的角度获取午夜后的分钟数。尝试使用它来查询服务器自x分钟前以来的更改
var d = new Date();
console.log(d);
var now = d.getTime();
d.setHours(0,0,0,0);
var midnight = d.getTime();
var minutes_ago = Math.floor((now-midnight) / (60 * 1000));
console.log(minutes_ago);
输出:
Date {Thu Apr 02 2015 16:12:54 GMT-0700 (PDT)}
972
这应该起作用:
var d = new Date();
var midnight = d.setUTCHours(0,0,0,0); // last midnight everywhere
var count = Items.find({
username: Meteor.user().username,
createdAt: { $gt: midnight }
}).count();
您是否尝试过设置(0,0,0,0)代码>?这是客户端代码还是服务器端代码?如果是客户端,则用户的时区无关紧要;服务器的时区才是最重要的。如果是客户端,那么,时间就是different@Kneel-在ZOD之前,我认为它是客户端的,因为用户的两个时区中存储在“Items”中的日期都不同,因此将其标准化为某个偏移量?您是否将“$gt:mignight”更改为相同的标准化?stephenthedev顺便问一句,您是否尝试过设置方法(0,0,0,0);
还没有?也许吧,但除非用户都在GMT,否则他们两个都不会是“午夜”。这不起作用。它在CST上检测到用户的午夜,而此时该本地区域实际上是晚上10点。@RobG你能解释为什么吗?使用建议的方法时存在缺陷,可能会导致错误的结果。你可以使用“编辑”按钮“选择您的答案进行改进。
Date {Thu Apr 02 2015 16:12:54 GMT-0700 (PDT)}
972
var d = new Date();
var midnight = d.setUTCHours(0,0,0,0); // last midnight everywhere
var count = Items.find({
username: Meteor.user().username,
createdAt: { $gt: midnight }
}).count();