2015-05-12 1 views
1

Моя цель состоит в том, чтобы отобразить все записи, созданные на дату A, B, дата даты C и т.д.поиска Evernote с диапазоном дат

Я строит Evernote запрос как таковой:

//for all notes created on 2015 May 11 
ENNoteSearch *searchMayEleven = [ENNoteSearch noteSearchWithSearchString: @"created:20150511 -created:20150512"]; 

[[ENSession sharedSession] findNotesWithSearch:searchMayEleven 
inNotebook:nil 
orScope:ENSessionSearchScopeAll 
sortOrder:ENSessionSortOrderRecentlyCreated 
maxResults:100 
completion:^(NSArray *findNotesResults, NSError *findNotesError) { 
//completion block 
}]]; 

Мои результаты , однако, получить заметки, которые создаются 12 мая, а также 11 мая.

1) Я выводю, что мне нужно установить часовой пояс на моей сессии Evernote. Основываясь на вашем опыте, действительно ли это вычет?

2) Если это так, я не смог найти способ сделать это после прочтения документации. Возможно ли это?

3) Вы бы посоветовали альтернативный подход? Возможно, вместо этого вместо этого нужно использовать notestore?

ответ

2

в Evernote даты хранятся в формате UTC.

Когда вы делаете поиск, вам нужно создать грамматику поиска Evernote, которая касается интересующего вас часового пояса. В вашем случае часовой пояс клиента или iPhone.

Чтобы получить часовой пояс пользователя:

ENSession * session = [ENSession sharedSession]; 
EDAMUser * user = session.user; 

где класс EDAMUser имеет такую ​​структуру:

@interface EDAMUser : FATObject 
@property (nonatomic, strong) NSNumber * id; // EDAMUserID 
@property (nonatomic, strong) NSString * username; 
... 
@property (nonatomic, strong) NSString * timezone; 

Например мой часовой пояс пользователя является: Америка/Монреаль так далее EST.

Для того, чтобы получить все записи, созданные 11 мая, нужно, чтобы построить эту поисковую грамматику Evernote:

@"created:20150511T040000Z -created:20150512T040000Z" 

уведомление о ... T040000Z в конце.

Итак, сделайте вывод, что вам нужно включить «определение» даты с точки зрения клиента, иначе запрос будет работать в UTC.

Вот пример того, как строить Evernote поиска грамматики для текущего дня:

-(NSString *)buildQueryStringForDate: (NSDate *)date { 
    NSDateFormatter * formatter = [NSDateFormatter new]; 
    [formatter setDateFormat:@"yyyyMMdd'T'HHmmss'Z'"]; 
    formatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; 
    formatter.locale = [NSLocale systemLocale]; 

    DateRange * dateRange = [DateRange rangeForDayContainingDate:[NSDate new]]; 
    return [NSString stringWithFormat:@"created:%@ -created:%@", [formatter stringFromDate:dateRange.startDate], [formatter stringFromDate:dateRange.endDate]]; 
} 

Код [DateRange rangeForDayContainingDate: [NSDate новый]] можно найти здесь: How can I generate convenient date ranges based on a given NSDate?

Надеюсь, это поможет.

1

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

Ваша существующая грамматика поиска: created:20150511 -created:20150512 должна возвращать заметки, созданные после 11 мая и до 12 мая, используя время и дату на клиенте, которые использовались при создании заметки. Чтобы заставить поиск использовать абсолютное время для создания заметки, а не созданного времени, о котором сообщает клиент Evernote, вы должны использовать постфикс Z для отметки даты и времени, как показано в следующей грамматике поиска, в которой вы будете возвращать созданные заметки только на 15 мая 2015 UTC:

created:20150511T000000Z -created:20150512T000000Z

Источники
https://dev.evernote.com/doc/articles/search_grammar.php https://dev.evernote.com/doc/reference/Types.html#Struct_Note

+0

Поиск создано: 20150511T000000Z -created: 20150512T000000Z возвратит ноты на 11, но по времени UTC. Например, если клиент находится на EST (Пасха) 11:00 по UTC для него, он будет на 3 часа на следующий день. Таким образом, у клиента будет впечатление, что запрос возвращает заметки из двух разных дней. См. Мой ответ ниже для получения дополнительных пояснений. Благодарю. –

0

Учитывая ограничение времени на руках, я развернув следующее решение:

-(NSString *)buildQueryStringForDate: (NSDate *)date { 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    NSDate *dateAfter = [date dateByAddingDays:1]; 

    NSTimeZone *currentTimeZone = [NSTimeZone localTimeZone]; 
    [dateFormat setDateFormat: @"'created:'YYYYMMdd'T'HHmmss"]; 
    [dateFormat setTimeZone:currentTimeZone]; 

    NSString *searchString = [NSString stringWithFormat: @"%@ -%@", [dateFormat stringFromDate:[date dateByAddingTimeInterval: currentTimeZone.secondsFromGMT]], [dateFormat stringFromDate:[dateAfter dateByAddingTimeInterval: currentTimeZone.secondsFromGMT]]]; 
    NSLog(@"%@",searchString); 
    return searchString; 
} 

В общем, это хак с помощью NSDate метода экземпляра secondsFromGMT, чтобы компенсировать разницу в часовой пояс. Не использует правильные понятия. но теперь это нужно сделать.

Все комментарии будут тепло встречены :)

+0

Привет, я обновил свой ответ и изменил ваш код, чтобы он работал на текущий день. Пожалуйста, дайте мне знать, если это поможет. Спасибо. Киприан. –