查询字符串"已接收"日期往后推迟一天
本文关键字:quot 推迟 一天 日期 字符串 查询 | 更新日期: 2023-09-27 18:14:45
外部进程将消息发送到Exchange邮箱。然后,我有一个Exchange Web Services (EWS) 2.0应用程序来获取这些电子邮件消息以进行后续处理。EWS应用程序被设计为获取在当前日期收到的消息,例如AQS术语中的"received:today"
。然而,这些消息永远不会被检索到——没有一个返回到FindItems
方法的ItemView
:
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
// sharedMailbox is a FolderId type set to a valid well-known location not reproduced here
FindItemsResults<Item> findResults = service.FindItems(sharedMailbox,"(subject:flotsam) AND (received:today)", new ItemView(20));
很有趣,将此日期更改为"received:yesterday"最终捕获了所需的消息,但是检查每条消息的显式接收日期不是昨天,而是今天:
Console.WriteLine(item.DateTimeReceived.ToLocalTime());
Console.WriteLine(item.DateTimeReceived.ToUniversalTime());
10/24/2016 1:05:38 AM
10/24/2016 6:05:38 AM
我怀疑常量的翻译中有一个奇怪的地方,并选择提供明确的日期。然而,以"received:MM/DD/YYYY"
形式明确定义接收日期(而不是"今天"或"昨天")显示了相同的结果:
FindItemsResults<Item> findResults = service.FindItems(sharedMailbox,"(subject:flotsam) AND (received:10/23/2016)", new ItemView(20));
虽然日期是昨天,但此代码确实获取了今天检索的消息,即10/24/2016 (而不是 10/23/2016)。代码指定今天,其中应该获取所需的消息,实际上获取了没有消息:
FindItemsResults<Item> findResults = service.FindItems(sharedMailbox,"(subject:flotsam) AND (received:10/24/2016)", new ItemView(20));
实际上,显式日期的行为与'received:yesterday'和'received:today'查询字符串值完全相同,因此这意味着这些常量只是被映射到我硬编码的值。
然后我怀疑时区差异,或UTC转换差异,但我们的本地时区落后于 UTC,这意味着指定"received:today"实际上应该在获取收到的消息....今天工作。
我不知道或理解为什么我们在收到的消息中看到这种一天的差异。我错误地处理了消息日期解释的哪个方面?
EDIT:根据评论中的建议,我修改了FindItems
调用以使用SearchFilter
对象,使用DateTime
值Now
减去一天(实际上,值24小时来自DateTime.Now)。这创建了一个跨越10/23/2016的日期时间值,并检索了今天收到的消息。所以我不能确定过滤器真的找到了消息,因为它们是在10/24收到的,或者因为搜索日期范围包括昨天(这导致其他搜索工作):
SearchFilter sf = new SearchFilter.IsGreaterThan(ItemSchema.DateTimeReceived, new DateTime.Now.AddDays(-1));
从中得到提示,我修改了过滤器,使用没有显式时间元素的DateTime
:
SearchFilter sf = new SearchFilter.IsGreaterThan(ItemSchema.DateTimeReceived, new DateTime(2016,10,24));
此搜索过滤器工作,返回今天收到的两个消息。这往往表明"今天"answers"昨天"关键字在语义上存在一些问题或不确定性。
如果可能的话,我更愿意找到一个基于aqs的解决方案,或者至少找到一个更好的理解为什么querystring值不像预期的那样工作。
如果在Exchange中使用AQS,则允许在具有日期值和相对日期关键字的搜索查询中使用关系运算符。
虽然很奇怪,但下面的表达式的工作方式与您期望的相对日期关键字"today"的工作方式一致:
昨天>
节选自"如何:在Exchange中使用EWS执行AQS搜索"
"日期值类型还可以与大于或小于之类的关系操作符进行比较,或者使用范围操作符将其指定为范围…例如:received:>11/30/2013, sent:>=昨天,received:12/1/2013。今天都是有效的查询字符串。"