mongo查询中的时区

时间:2015-06-23 06:45:38

标签: mongodb timezone

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

4 个答案:

答案 0 :(得分:4)

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

用时区提取日期部分的

表达式是

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

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

请参阅我的回复here

使用时区America/Chicago

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

或带偏移量

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

答案 1 :(得分:3)

请考虑您的文档包含ISODate,如下所示:

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

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

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

检查以下聚合查询:

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"]
    }
  }
})

注意: 在上面的查询转换中,从ISODATE转换为timeStamp ref. here

答案 2 :(得分:0)

如果日期没有改变且不变,例如像created_record_date那样你需要它的时区数据,你应该预先计算并保存(作为String)以及相同的文档,这样你就不必在运行时运行庞大的处理,这可能会减慢执行时间。如果您有现有记录并且想要将各种不同的时区数据与记录一起存储,请考虑运行Map-Reduct作业并单独更新文档。 (如果您需要代码,请告诉我)。但是,如果可以根据业务逻辑更改此日期字段,则可以在运行时进行计算。这两种技术都有不同的用例及其优缺点。

- $

答案 3 :(得分:0)

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

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 ...