Поиск Evernote с диапазоном дат

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

Я создаю запрос 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?


person iamdavidlam    schedule 12.05.2015    source источник


Ответы (3)


В 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;

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

Чтобы получить все заметки, созданные 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 new]] можно найти здесь: Как создать удобные диапазоны дат на основе заданной NSDate?

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

person Ciprian Rarau    schedule 13.05.2015

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

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

created:20150511T000000Z -created:20150512T000000Z

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

person matthewayne    schedule 12.05.2015
comment
Поиск created:20150511T000000Z -created:20150512T000000Z вернет заметки 11 числа, но по времени UTC. Например, если клиент находится в EST (пасхальное время) в 23:00 UTC, для него/нее это будет 3:00 следующего дня. Таким образом, у клиента создастся впечатление, что запрос возвращает записи за два разных дня. Смотрите мой ответ ниже для получения дополнительных объяснений. Спасибо. - person Ciprian Rarau; 14.05.2015

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

-(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 для secondFromGMT, чтобы компенсировать разницу в часовых поясах. На самом деле не использует правильные понятия. но это должно было бы сделать сейчас.

Любые комментарии будут тепло приветствоваться :)

person iamdavidlam    schedule 15.05.2015
comment
Привет, я обновил свой ответ и изменил ваш код, чтобы он работал на текущий день. Пожалуйста, дайте мне знать, если это поможет. Спасибо. Киприан. - person Ciprian Rarau; 19.05.2015