我整天都在努力调试使用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?。
答案 0 :(得分:1)
我不知道这是不是一个错误,但我在这里找到了一个解决方法:
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>";