Поделиться через


Фильтрация элементов путем сравнения даты и времени

Фильтрация повторяющихся элементов в папке календаря

Чтобы отфильтровать коллекцию элементов встречи, включающих повторяющиеся встречи, необходимо использовать коллекцию Элементы . С помощью свойства Items.IncludeRecurrences можно указать, что метод Items.Find или Items.Restrict должен включать повторяющиеся встречи. Объект Table возвращает только одну строку, представляющую элемент повторяющейся встречи, а не отдельные строки для каждого экземпляра встречи.

Формат даты и времени строк сравнения

Outlook оценивает значения даты и времени согласно параметрам формата времени, краткого и полного форматов даты в приложении "Язык и региональные стандарты" на панели управления Windows. В частности, Outlook оценивает время согласно заданному формату времени без учета секунд. Если вы укажете секунды в строке сравнения даты и времени, фильтр будет работать неправильно.

Несмотря на то что даты и время обычно хранятся в формате даты, для работы фильтров, в которых используются синтаксисы Jet и DAV Searching and Locating (DASL), требуется, чтобы значение даты и времени было преобразовано в строковое представление. В синтаксисе Jet строка сравнения даты и времени должна быть заключена в двойные или одинарные кавычки. В синтаксисе DASL строка сравнения даты и времени должна быть заключена в одинарные кавычки.

Чтобы убедиться, что строка сравнения даты и времени отформатирована так, как ожидается в Microsoft Outlook, используйте функцию Visual Basic для приложений Format (или ее эквивалент на языке программирования). В примере ниже показано, как создать фильтр Jet, чтобы найти все контакты, измененные до 15:30 12 июня 2005 г. по местному времени.

criteria = "[LastModificationTime] < '" _ 
         & Format$("6/12/2005 3:30PM","General Date") & "'"

Часовые пояса, используемые в сравнении

Если явное встроенное свойство ссылается в запросе Jet с его явным строковым именем, сравнение оценивает значение свойства и строку сравнения даты и времени как значения локального времени.

Если в запросе DASL имеется ссылка на свойство по пространству имен, функция сравнения оценивает значение свойства и строку сравнения даты и времени в виде значений времени в формате UTC. Например, указанный ниже запрос DASL выполняется поиск всех контактов, измененных до 15:30 12 июня 2005 г. по времени в формате UTC.

criteria = "@SQL=" & Chr(34) & "DAV:getlastmodified" & Chr(34) _ 
         & " < '" & Format$("6/12/2005 3:30PM","General Date") & "'"

Преобразование времени в формат UTC для запросов DASL

Запросы DASL всегда выполняют сравнение даты и времени в формате UTC, поэтому если вы применяете литерал даты в строке сравнения, то для сравнения вам необходимо использовать его значение в формате UTC. Используйте вспомогательную функцию Row.LocalTimeToUTC или макросы даты и времени Outlook, чтобы упростить преобразование.

LocalTimeToUTC

Одним из способов упростить преобразование местного времени в UTC является использование вспомогательной функции LocalTimeToUTC объекта Row . В следующей строке кода эта вспомогательная функция используется для преобразования значения свойства LastModificationTime (которое представляет собой столбец, используемый по умолчанию во всех объектах Table):

Row.LocalTimeToUTC("LastModificationTime")

Макросы для работы с датой и временем в Outlook

Макросы даты, перечисленные ниже, возвращают строки фильтра, которые сравнивают значение заданного свойства даты и времени с указанной датой в формате UTC; SchemaName — это любое допустимое свойство даты и времени, на которое ссылается пространство имен.

Примечание Макросы даты и времени Outlook можно использовать только в запросах DASL.

Macro Синтаксис Описание
today %today("ИмяСхемы")% Ограничения для элементов со значением свойства SchemaName , равным сегодняшнему значению
tomorrow %tomorrow("ИмяСхемы")% Ограничения для элементов со значением свойства SchemaName , равным будущему
yesterday %yesterday("ИмяСхемы")% Ограничивает элементы со значением свойства SchemaName , равным вчера
next7days %next7days("ИмяСхемы")% Ограничивает для элементов со значением свойства SchemaName , равным следующим 7 дням
last7days %last7days("ИмяСхемы")% Ограничения для элементов со значением свойства SchemaName , равным последним 7 дням
nextweek %nextweek("ИмяСхемы")% Ограничения для элементов со значением свойства SchemaName , равным на следующей неделе
thisweek %thisweek("ИмяСхемы")% Ограничения для элементов со значением свойства SchemaName , равным этой неделе
lastweek %lastweek("ИмяСхемы")% Ограничения для элементов со значением свойства SchemaName , равным значению на прошлой неделе
nextmonth %nextmonth("ИмяСхемы")% Ограничения для элементов со значением свойства SchemaName , равным следующему месяцу
thismonth %thismonth("ИмяСхемы")% Ограничения для элементов со значением свойства SchemaName , равным этому месяцу
lastmonth %lastmonth("ИмяСхемы")% Ограничения для элементов со значением свойства SchemaName , равным значению за прошлый месяц

Пример, в котором показано преобразование в формат UTC

В следующем примере кода показаны три строки фильтра, которые возвращают все сообщения, полученные сегодня, и применяется один из фильтров к Items.Restrict и Application.AdvancedSearch. Сначала он использует PropertyAccessor.LocalTimeToUTC для преобразования текущей даты в строки дат в формате UTC. Первый фильтр использует макрос Outlook (сегодня) для получения строки фильтра, которая сравнивает свойство ReceivedTime с текущей датой в формате UTC. Второй и третий макросы ссылаются на свойство ReceivedTime по двум различным пространствам имен.

В завершение в примере кода к элементам в папке "Входящие" дважды применяется третий фильтр: первый раз с использованием элемента Items.Restrict и второй раз с использованием элемента Application.AdvancedSearch. Далее в примере кода выполняется печать количества элементов в папке "Входящие" и количества элементов, возвращенных при каждом применении фильтра.

Public blnSearchComp As Boolean 
 
Sub TestDASLDateComparison() 
    Dim strFilter As String 
    Dim colItems As Outlook.Items 
    Dim colRestrict As Outlook.Items 
    Dim oSearch As Outlook.Search 
    Dim oResults As Outlook.Results 
    Dim datStartUTC As Date 
    Dim datEndUTC As Date 
    Dim oMail As MailItem 
    Dim oPA As PropertyAccessor 
    Const SchemaPropTag As String = _ 
    "https://schemas.microsoft.com/mapi/proptag/" 
 
    'Get items from Inbox 
    Set colItems = _ 
    Application.Session.GetDefaultFolder(olFolderInbox).Items 
     
    'This code is a workaround to get today's date 
    'as UTC for DASL date comparison 
    Set oMail = Application.CreateItem(olMailItem) 
    Set oPA = oMail.PropertyAccessor 
    datStartUTC = oPA.LocalTimeToUTC(Date) 
    datEndUTC = oPA.LocalTimeToUTC(DateAdd("d", 1, Date)) 
     
    'All three filters shown below will return the same results 
    'This filter uses DASL date macro for today 
    strFilter = "%today(" _ 
    & AddQuotes("urn:schemas:httpmail:datereceived") & ")%" 
     
    'This filter uses urn:schemas:httpmail namespace 
    strFilter = AddQuotes("urn:schemas:httpmail:datereceived") _ 
    & " > '" & datStartUTC & "' AND " _ 
    & AddQuotes("urn:schemas:httpmail:datereceived") _ 
    & " < '" & datEndUTC & "'" 
 
    'This filter uses https://schemas.microsoft.com/mapi/proptag 
    strFilter = AddQuotes(SchemaPropTag & "0x0E060040") _ 
    & " > '" & datStartUTC & "' AND " _ 
    & AddQuotes(SchemaPropTag & "0x0E060040") _ 
    & " < '" & datEndUTC & "'" 
 
    'Count of items in Inbox 
    Debug.Print (colItems.Count) 
 
    'This call succeeds with @SQL prefix 
    Set colRestrict = colItems.Restrict("@SQL=" & strFilter) 
    'Get count of restricted items 
    Debug.Print (colRestrict.Count) 
 
    Set oSearch = Application.AdvancedSearch("Inbox", strFilter, False) 
    While blnSearchComp = False 
        DoEvents 
    Wend      
 
    'Get count from Search object 
    Set oResults = oSearch.Results 
    Debug.Print (oResults.Count) 
End Sub 
 
Public Function AddQuotes(ByVal SchemaName As String) As String 
    On Error Resume Next 
    AddQuotes = Chr(34) & SchemaName & Chr(34) 
End Function 
 
 
Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search) 
    MsgBox "The AdvancedSearchComplete Event fired" 
    blnSearchComp = True 
End Sub

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.