【问题标题】:Retrieve local time info with mongo $hour使用 mongo $hour 检索本地时间信息
【发布时间】:2014-05-25 10:38:57
【问题描述】:

我目前在 mongoose 模型的帮助下将文档存储在 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
        }
    }
}]);

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

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

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

当我想使用 $hour 日期聚合运算符时,我应该如何将其恢复为本地时间? 当我只返回 $hour 时它是如何工作的?

【问题讨论】:

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


    【解决方案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/

    【讨论】:

      【解决方案2】:

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

      查看日期的getTimezoneOffset() 方法,并注意夏令时。

      不理想,但就是这样。

      【讨论】:

      • 这就是我害怕的。谢谢!
      • 明确地说,MongoDB 使用标准的 UNIX 纪元来存储它的时间值。 Epoch 始终采用 UTC,显示偏移量应在客户端处理。
      猜你喜欢
      • 2022-11-27
      • 2018-08-19
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 2021-09-08
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多