2015-06-23 221 views
1

我有在MongoDB中以UTC时间格式插入的数据。我想要根据时区转换时间。在mongo查询中是否有可能这样做?Mongo查询中的时区

+0

送你想提那些 – Aman

+0

我的格式和格式在2015年6月25日搜索记录。我有记录在日期2015-06-24 24:17:51。在查询时,此记录A必须根据时区进行转换并获得列表。 – user3702039

+0

是'timeZone'保存在文档中还是外部传递的? – Yogesh

回答

3

我们考虑您的文档如下包含ISODate

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

上面的查询插入dateISODate格式现在你想这个ISODate转换成给timeZone

假设您想将上述日期转换为Eastern Daylight Saving Time (EDT)epoch time zone conertor然后offset转换为14400 * 1000。首先将ISODate转换为timeStamp,然后使用substract EDT偏移in时间戳and then convert时间戳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"] 
    } 
    } 
}) 

: 在上述查询转换从ISODATEtimeStampref. here

+0

也可以在这里看到类似的答案:http://stackoverflow.com/a/31354088/404699 – steampowered

0

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

- 3.6时区已添加$

0

在蒙戈版本,mongo doc

则表达式来提取日期部分与时区为

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

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

看到我的答案贴here

从最新获取日期与时区America/Chicago

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

或偏移

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