我整天都在努力调试一个查询,该查询使用Lists Web服务和GetListItems方法基于Modified字段过滤掉元素,以仅获取自上次检查以来已修改的元素。
这是查询参数:
<Where>
<Gt>
<FieldRef Name="Modified" />
<Value Type="DateTime" IncludeTimeValue="TRUE">2010-11-23T17:0:00Z</Value>
</Gt>
</Where>
我很难弄清楚为什么它什么也没返回,因为列表中的一个元素在此日期之后被明确修改(以UTC指定)。这是因为尽管您在UTC中指定了它(也可以在options参数中强制执行),但Sharepoint会将其与从站点设置中指定的语言环境存储或显示的修改后的时间戳进行字面比较。
我不确定自己是否清楚,所以这里有个例子:
我要查询的网站位于EST语言环境中,今天的最新元素已在12:11:00(即17:12:00Z)进行了修改。
我上次检查的时间是格林尼治标准时间下午4点,因此我的查询参数将包含以下内容:
<Where>
<Gt>
<FieldRef Name="Modified" />
<Value Type="DateTime" IncludeTimeValue="TRUE">2010-11-23T16:00:00Z</Value>
</Gt>
</Where>
而且这将不会返回任何值,因为sharepoint实际上将16:00:00Z与12:11:00进行比较,因此在16:00:00Z之后没有更新。
我通过在查询中放入12:10:00Z来确认这一点,然后我得到了想要的列表元素。将12:12:00Z放进去,结果就没有了。
所以,我想我的问题是,WSS 3.0中的错误,还是我做错了什么?如果是这样,我该如何纠正呢?顺便说一句,我想将存储的时间保存在UTC中,并且无法控制用户如何使用其网站设置。有没有办法使用Web服务检索站点使用的语言环境?
更新:
有关解决方案,请参见Is there a way to get a Sharepoint site's locale with web services?。
最佳答案
我不知道这是否是一个错误,但是我在这里找到了解决方法:
Is there a way to get a Sharepoint site's locale with web services?
当您在站点的语言环境和UTC之间具有偏移量时,只需将偏移量应用于您要过滤的UTC时间,然后将其插入查询节点中即可。
ndQuery.InnerXml = "<Where><Gt><FieldRef Name='Modified' />" +
"<Value Type='DateTime' IncludeTimeValue='TRUE'>" + (last_update + offset).ToString("yyyy-MM-dd") + " " + (last_update + offset).ToString("HH:mm:ss") + "</Value></Gt></Where>";