Mongodb mongo查询中的时区

Mongodb mongo查询中的时区,mongodb,timezone,Mongodb,Timezone,我在mongodb中插入了UTC时间格式的数据。我希望根据时区转换计时。在mongo查询中是否有这样做的可能性 >请考虑您的文档包含“代码> ISODATE < /代码>如下: db.collection.insert({"date":new Date()}) 上面的查询以ISODate格式插入date,现在您希望将此ISODate转换为give时区 假设您要将上述日期转换为东部夏令时(EDT),然后将偏移量转换为14400*1000。首先将ISODate转换为timeStamp,然后在tim

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

>请考虑您的文档包含“代码> ISODATE < /代码>如下:

db.collection.insert({"date":new Date()})
上面的查询以
ISODate
格式插入
date
,现在您希望将此
ISODate
转换为give
时区

假设您要将上述日期转换为东部夏令时(EDT)
,然后将偏移量转换为
14400*1000
。首先将
ISODate
转换为
timeStamp
,然后在
timeStamp
中使用
substract
EDT Offset
,然后再次将
timeStamp
转换为
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

的转换,如果日期没有更改且保持不变,例如,类似于created\u record\u date,那么无论您需要哪个时区数据,您都应该预先计算并保存(作为字符串)与同一文档一起使用,这样您就不必在运行时运行庞大的处理,这可能会降低执行时间。如果您有现有记录,并且希望将各种不同的时区数据与记录一起存储,请考虑运行Map Reduce作业并分别更新文档。(如果需要密码,请告诉我)。但是,如果可以根据业务逻辑更改此日期字段,那么在运行时进行计算是明智的。这两种技术都有其不同的用例和优缺点


-$

在mongo版本3.6中添加了时区

用于提取带有时区的日期部分的表达式为

{ date: <dateExpression>, timezone: <tzExpression> }
还是有偏移量

{ $month: {
    date: ISODate(),
    timezone: "-0500"
} }
如果您使用的是mongoose(可能也适用于本机驱动程序):


发送格式以及您想要的格式。thoseI正在搜索2015年6月25日的记录。我有一张日期为2015-06-24 24:17:51的记录。查询时,此记录A必须根据时区进行转换并列出。是
时区
保存在文档中,还是您在外部传递了此记录?我在外部传递了此记录。BSON日期格式为时区不可知格式(内部为64位整数,表示自1970年1月1日00:00:00 UTC以来的毫秒数)。在特定时区转换为可读格式通常发生在前端。
{ $month: {
    date: ISODate(),
    timezone: "-0500"
} }
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 ...