使用mongo $ hour检索本地时间信息

时间:2014-04-11 10:15:49

标签: node.js mongodb mongoose mongodb-query aggregation-framework

我目前在mongob模型的帮助下将文档存储在mongodb中。按日期查询工作正常,但是当我尝试应用$ hour运算符时,似乎返回ISO时间,而不是本地时间。

当前的命名约定为我提供了一个文件名,其中包含创建文件的时间戳:YYYYMMDDHHMMSS-foo-bar.file

示例:数据库中的导入会导致解析时间戳的以下值: 2014 04 02 07 57 33-foo-bar.file被解析为ISODate("2014-04-02T05:57:33Z")

当我查询找到这个项目时:我创建了这样的新日期对象(日期是假的,只是为了我选择的查询方法):

var begin = new Date(2014, 01, 10, 13, 00, 00);
var end = new Date(2014, 01, 10, 20, 00, 00);

db.pinas.aggregate([{
    $project: {
        [attributes I need...]
    }
, {
    $match: {
        'start_time': {
            $gte: begin, //ISODate
            $lt: end //ISODate
        }
    }
}]);

同样,这些ISOD似乎不存储时区信息,尽管in this post ISODates包含一些内容:请注意尾随+01:00 ISODate("2012-07-14T01:00:00+01:00")

现在我有两个问题/问题:

我在某处读到,在ISODates中返回datetime信息的目的是将“精细工作”转移到应用程序而不是DBMS,这是真的:它在解析ISODatestring的情况下工作,我检索正确的时间(我假设通过了解我的本地设置?如果服务器在另一个时区怎么办?)

当我想使用$hour日期聚合运算符时,我该怎么把它带回当地时间? 当我只返回$ hour时,它是如何工作的?

2 个答案:

答案 0 :(得分:1)

从版本3.6开始,您可以添加时区属性以在正确的时间内获取小时:

{ date: <dateExpression>, timezone: <tzExpression> }

例如:

{ $hour: {
    date: new Date("August 14, 2011Z"),
    timezone: "America/Chicago"
} }

有关详细信息,请参阅$ hour文档 https://docs.mongodb.com/manual/reference/operator/aggregation/hour/

答案 1 :(得分:0)

除了UTC之外,MongoDB不支持任何时间。您需要在其他时区完成任何操作需要在客户端完成,因此您需要将MongoDB提供的$hour值调整为您自己代码中的本地时间。

请参阅日期的getTimezoneOffset()方法,并注意夏令时。

不理想,但事情就是这样。