我目前在mongob模型的帮助下将文档存储在mongodb中。按日期查询工作正常,但是当我尝试应用$ hour运算符时,似乎返回ISO时间,而不是本地时间。
当前的命名约定为我提供了一个文件名,其中包含创建文件的时间戳:YYYYMMDDHHMMSS-foo-bar.file
示例:数据库中的导入会导致解析时间戳的以下值:
2014 04 02 07 57 33-foo-bar.file
被解析为ISODate("2014-04-02T05:57:33Z")
。
当我查询找到这个项目时:我创建了这样的新日期对象(日期是假的,只是为了我选择的查询方法):
var begin = new Date(2014, 01, 10, 13, 00, 00);
var end = new Date(2014, 01, 10, 20, 00, 00);
db.pinas.aggregate([{
$project: {
[attributes I need...]
}
, {
$match: {
'start_time': {
$gte: begin, //ISODate
$lt: end //ISODate
}
}
}]);
同样,这些ISOD似乎不存储时区信息,尽管in this post ISODates包含一些内容:请注意尾随+01:00 ISODate("2012-07-14T01:00:00+01:00")
现在我有两个问题/问题:
我在某处读到,在ISODates中返回datetime信息的目的是将“精细工作”转移到应用程序而不是DBMS,这是真的:它在解析ISODatestring的情况下工作,我检索正确的时间(我假设通过了解我的本地设置?如果服务器在另一个时区怎么办?)
当我想使用$hour日期聚合运算符时,我该怎么把它带回当地时间? 当我只返回$ hour时,它是如何工作的?
答案 0 :(得分:1)
从版本3.6开始,您可以添加时区属性以在正确的时间内获取小时:
{ date: <dateExpression>, timezone: <tzExpression> }
例如:
{ $hour: {
date: new Date("August 14, 2011Z"),
timezone: "America/Chicago"
} }
有关详细信息,请参阅$ hour文档 https://docs.mongodb.com/manual/reference/operator/aggregation/hour/
答案 1 :(得分:0)
除了UTC之外,MongoDB不支持任何时间。您需要在其他时区完成任何操作需要在客户端完成,因此您需要将MongoDB提供的$hour
值调整为您自己代码中的本地时间。
请参阅日期的getTimezoneOffset()
方法,并注意夏令时。
不理想,但事情就是这样。