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;

Например моята потребителска часова зона е: Америка/Монреал и така нататък 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 new]] може да бъде намерен тук: Как мога да генерирам удобни периоди от време въз основа на дадена NSDate?

Надявам се това да помогне.

person Ciprian Rarau    schedule 13.05.2015

Изглежда, че това може да е проблем с часовата зона. Фактът, че се появяват бележки от предишния ден, може да се обясни с факта, че извършваното от вас търсене проверява часа, отчетен от клиента (обикновено местната часова зона на клиента), а не UTC или друго добре дефинирано време зона.

Вашата съществуваща граматика за търсене: created:20150511 -created:20150512 трябва да връща бележки, създадени след 11 май и преди 12 май, като използва часа и датата на клиента, който е бил използван при създаването на бележката. За да принудите търсенето да използва абсолютно време за създаване на бележка, а не създаденото време, отчетено от клиента на Evernote, трябва да използвате Z postfix към клеймото за дата-час, както се вижда в следната граматика на търсенето, която ще върне създадените бележки само на 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

person matthewayne    schedule 12.05.2015
comment
Търсенето created:20150511T000000Z -created:20150512T000000Z ще върне бележки на 11-ти, но в UTC време. Например, ако клиентът е на EST (Великденско време) 23:00 UTC за него/нея ще бъде 3 сутринта на следващия ден. Така клиентът ще има впечатлението, че заявката връща бележки от два различни дни. Вижте моя отговор по-долу за повече обяснения. Благодаря. - 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 на secondsFromGMT за компенсиране на разликата в часовата зона. Всъщност не използва правилните концепции. но трябва да го направя засега.

Всякакви коментари ще бъдат горещо приветствани :)

person iamdavidlam    schedule 15.05.2015
comment
Здравейте, актуализирах отговора си и промених кода ви, така че да работи за текущия ден. Моля, уведомете ме, ако помогне. Мерси. Киприан. - person Ciprian Rarau; 19.05.2015