【问题标题】:Timezone in mongo querymongo查询中的时区
【发布时间】:2015-09-08 19:56:58
【问题描述】:

我在 mongodb 中插入了 UTC 时间格式的数据。我希望根据时区转换时间。在mongo查询中有没有可能这样做?

【问题讨论】:

  • 发送格式以及您希望提及的格式
  • 我正在搜索日期为 25-06-2015 的记录。我在日期 2015-06-24 24:17:51 有记录 A。查询时,这条记录 A 必须根据时区转换并列出。
  • timeZone 保存在文档中还是您从外部传递了这个?
  • 我在外部传递。
  • BSON 日期格式与时区无关(在内部它是一个 64 位整数,表示自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数)。在特定时区转换为可读格式通常发生在前端。

标签: mongodb timezone


【解决方案1】:

如果您使用的是猫鼬(可能也适用于本机驱动程序):

import moment from 'moment-timezone'; // this is needed to use .tz() method
import mongoMoment from 'mongodb-moment';

// Initalize mongodb-moment so you can use moment() object directly in mongo query
mongoMoment(moment);

// Add timezone to your_date
const date = moment(your_date)
        .tz("Europe/Zagreb");

// Make $gte/$lte queries with date ...

【讨论】:

    【解决方案2】:

    在 mongo 版本 3.6 中添加了时区,mongo doc

    用时区提取日期部分的表达式是

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

    我们可以在获取日期部分时指定时区或偏移量。

    查看我在here发布的答案

    从带有时区America/Chicago的日期获取日期

    { $month: {
        date: new Date(),
        timezone: "America/Chicago"
    } }
    

    或带偏移量

    { $month: {
        date: ISODate(),
        timezone: "-0500"
    } }
    

    【讨论】:

      【解决方案3】:

      如果日期不变且不变,例如像 created_record_date 这样的东西,无论您需要哪个时区数据,您都应该预先计算并保存(作为字符串)以及同一个文档,这样您就不必在运行时运行大量处理,这可能会减慢执行时间。如果您有现有记录,并且希望将各种不同的时区数据与记录一起存储,请考虑运行 Map-Reduct 作业并分别更新文档。 (让我知道您是否需要该代码)。但是,如果可以根据业务逻辑更改此日期字段,那么在运行时计算是明智的。这两种技术都有不同的用例和优缺点。

      -$

      【讨论】:

        【解决方案4】:

        假设您的文档包含ISODate,如下所示:

        db.collection.insert({"date":new Date()})
        

        上面的查询以ISODate 格式插入date 现在您想将此ISODate 转换为给timeZone

        假设您要将上述日期转换为Eastern Daylight Saving Time ( EDT ) epoch time zone conertor,然后将offset 转换为14400 * 1000。首先将ISODate转换为timeStamp,然后再使用substract EDT OffsetintimeStampand then converttimeStamptoISODate`。

        检查以下聚合查询:

        db.collection.aggregate({
          "$project": {
            "timestamp": { //convert ISODate tom timestamp
              "$subtract": [{
                "$divide": [{
                  "$subtract": ["$date", new Date("1970-01-01")]
                }, 1000]
              }, {
                "$mod": [{
                  "$divide": [{
                    "$subtract": ["$date", new Date("1970-01-01")]
                  }, 1000]
                }, 1]
              }]
            }
          }
        }, {
          "$project": {
            "timeZoneTimeStamp": {
              "$subtract": [{ //substract timestamp to given offset if offset will in postive then replace  subtract  to add
                "$multiply": ["$timestamp", 1000]
              }, 14400000]
            }
          }
        }, {
          "$project": {
            "timeZoneTimeStamp": 1, //converted timeZoneTimeStamp if required 
            "_id": 0,
            "newDate": { // newDate is converted timezone ISODate
              "$add": [new Date(0), "$timeZoneTimeStamp"]
            }
          }
        })
        

        注意: 在上述从ISODATEtimeStamp 的查询转换ref. here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-04
          • 2023-02-21
          • 2016-08-07
          • 2022-01-17
          • 2017-05-02
          相关资源
          最近更新 更多