所以,我有一系列文件在NoSQL数据库(Couchbase)中存储为纯Json。这些文件包括"创建"包含DateTime值的字段。我通过Elasticsearch执行以下查询,并返回我不希望返回的结果。
查询:
"query":
{
"bool":
{
"must": [
{
"range":
{
"couchbaseDocument.doc.Created":
{
"from":"2014-03-27T00:00:00.0000000",
"to": "2014-03-27T23:59:00.0000000"
}
}
},
{
"term":
{
"couchbaseDocument.meta.expiration": "0"
}
}],
"must_not": [ ],
"should": [ ]
},
from: 0,
size:25000
}
我希望这个查询只能在3/27期间的某个时间返回创建日期的结果。但是,我从3/26获得了一些结果。例如,它返回一个文档,其中包含以下创建的字段:
"Created": "2014-03-26T21:40:26.2856631-04:00"
为什么在结果集中返回此文档?
答案 0 :(得分:3)
您的查询正在搜索GMT时区中的日期/时间(又名UTC;又名祖鲁时间),也就是说它们末尾有一个隐含的+00:00
。
"from" : "2014-03-27T00:00:00.0000000+00:00",
"to" : "2014-03-27T23:59:00.0000000+00:00"
GMT是一个非常标准的时区,用于存储日期/时间,但似乎您的文档存储在不同的时区(它们看起来是EDT后期或AST,Atlantic Time Zone) ,比格林威治标准时间-04:00
还要落后4小时。因此,当它为midnight on March 27, 2014 in GMT
时,它仍为8 PM on March 26, 2014 in AST
(晚上8点是当天的第20小时)。
从本质上讲,当您看到-04:00
时,您需要添加 04:00
到时间,即4小时0分钟。完成后,您可以删除时区标记,因为:
2014-03-26T21:40:26.2856631-04:00
与
相同2014-03-27T01:40:26.2856631+00:00
与
相同2014-03-27T01:40:26.2856631
因为21 + 04 = 25
和一天25
小时是下一个日01
的小时25 - 24 = 01
,因此给出了1天的时间1小时;值得注意的是24 - 24 = 00
,这就是00
代表午夜的原因。
要把它全部带回问题:返回的时间应该在你的结果中,因为关于GMT,它在你的搜索范围内。
作为参考,EST为-05:00
,PST为-08:00
。