Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 返回自午夜创建的文档_Javascript_Mongodb - Fatal编程技术网

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();