Этот вопрос уже задавался 3 раза, с разными деталями в каждом вопросе. Давайте соединим все вместе:
- Данные поступают из SharePoint с использованием CAML-запроса.
ProjectLastUpdate
уже является датой TimeTime. (из комментариев здесь ) - Вопрос real состоит в том, как сравнить этот DateTime со строкой в формате ISO8601 в UT C, ie
YYYY-MM-DD-THH:mm:ssZ
. - Или как фильтровать с использованием даты UT C? Это можно сделать в CAML, добавив атрибут
StorageTZ='TRUE'
к значению фильтра.
Сравнение даты
Ответ - преобразовать строку сравнения DateTime, а не DateTime в строку. Как только это будет сделано, мы можем просто использовать otherDate.Equals(spDate)
или otherDate.CompareTo(spDate)
.
Значением SharePoint уже является DateTime, заключенное в объект. DateTime.Equals и DateTime.CompareTo имеют перегрузки, которые работают с упакованным Datetime, поэтому нам даже не нужно приводить к DateTime
.
Мы можем использовать:
var myDate = (DateTime) i["ProjectLastUpdate"];
или просто
var mydate = i["ProjectLastUpdate"];
Что имеет значение , это анализ значения сравнения. Вещи становятся интересными здесь.
DateTime.Parse (string) сама может без проблем проанализировать эту строку. Он вернет время по местному . В моем часовом поясе GMT + 2: 00 этот код:
var otherDate=DateTime.Parse("2020-02-25T00:00:00Z");
Возвращает объект DateTime, для которого Kind
равно Local
и значение 2020-02-25T02:00:00
.
UT, сохраненное в SharePoint C datetime, хотя. Чтобы получить это, нам нужна перегрузка DateTime.Parse , которая принимает параметр DateTimeStyles
. Этот код:
var otherDate=DateTime.Parse("2020-02-25T00:00:00Z",null, DateTimeStyles.RoundtripKind);
Возвращает DateTime, типом которого является UT C и значением 2020-02-25T00:00:00
.
CAML-фильтрация с использованием UT C
Вопрос CAML-запрос сравнения DateTime в UT C спрашивает, как сделать запрос в UT C. По умолчанию SharePoint преобразует сохраненное UT C в местное время, и это условие:
<Gt>
<FieldRef Name='ProjectLastUpdate ' />
<Value IncludeTimeValue='TRUE' Type='DateTime'>2018-06-28T00:00:00Z</Value>
</Gt>
будет работать по местному времени. Для сравнения, используя UT C, нам нужно добавить StorageTZ='TRUE
:
<Gt>
<FieldRef Name='ProjectLastUpdate ' />
<Value IncludeTimeValue='TRUE' `StorageTZ='TRUE` Type='DateTime'>2018-06-28T00:00:00Z</Value>
</Gt>
С другой стороны, если мы заботимся только о date , мы можем просто игнорировать время значение:
<Gt>
<FieldRef Name='ProjectLastUpdate ' />
<Value IncludeTimeValue='FALSE' `StorageTZ='TRUE` Type='DateTime'>2018-06-28T00:00:00Z</Value>
</Gt>