Это ошибка в запросах веб-служб WSS3.0? - PullRequest
3 голосов
/ 23 ноября 2010

Я весь день пытался отладить запрос, отфильтровывающий элемент на основе поля Modified, с помощью веб-службы Lists и метода GetListItems, чтобы получить только элементы, измененные с момента последней проверки.

Вот параметр запроса:

<Where>
  <Gt>
    <FieldRef Name="Modified" /> 
    <Value Type="DateTime" IncludeTimeValue="TRUE">2010-11-23T17:0:00Z</Value> 
  </Gt>
</Where>

У меня были проблемы с выяснением, почему это ничего не вернуло, поскольку один элемент в списке был явно изменен после этой даты, указанной в UTC. Это связано с тем, что, хотя вы указываете его в формате UTC (также применяется в параметре параметров), Sharepoint сравнивает его буквально с измененными временными метками, которые хранятся или отображаются с локалью, указанной в настройках сайта.

Я не уверен, что я ясен, так что вот пример:
Сайт, который я запрашиваю, находится в локали EST, и последний элемент был изменен сегодня в 12:11:00, то есть 17: 12: 00Z.

В последний раз я проверял наличие обновлений в 16:00 по Гринвичу, поэтому мой параметр запроса будет содержать следующее:

<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 и не могу контролировать, что пользователи делают с настройками своих сайтов. Есть ли способ получить языковой стандарт, используемый сайтом, с помощью веб-служб?


Обновление: См. Есть ли способ получить локаль сайта Sharepoint с помощью веб-служб? для решения.

1 Ответ

1 голос
/ 25 ноября 2010

Я не знаю, является ли это ошибкой, но я нашел обходной путь здесь:
Есть ли способ получить локаль сайта Sharepoint с помощью веб-служб?

когдау вас есть смещение между локалью сайта и 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>";
...