我在mongodb中以UTC时间格式插入数据。我想根据时区转换时间。有没有可能在mongo查询中这样做?
答案 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 ...