使用日期范围进行Evernote搜索

时间:2015-05-12 16:50:57

标签: ios 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
}]];

然而,我的结果会提取5月12日和5月11日创建的笔记。

1)我推断我必须在我的Evernote Session中设置一个时区。根据您的经验,这是一个有效的演绎吗?

2)如果是这样,我在阅读完文档后仍未能找到办法。它甚至可能吗?

3)你会建议另一种方法吗?也许使用notestore而不是?

3 个答案:

答案 0 :(得分: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。

为了获得5月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]]的代码可以在这里找到:How can I generate convenient date ranges based on a given NSDate?

我希望这会有所帮助。

答案 1 :(得分:1)

听起来这可能是时区问题。前一天的笔记正在浮出水面的事实可以解释为您正在执行的搜索检查客户端报告的时间(通常是客户端的本地时区)而不是UTC或任何明确定义的时间区。

您现有的搜索语法:created:20150511 -created:20150512应该返回在5月11日之后和5月12日之前创建的注释,利用创建注释时使用的客户端上的时间和日期。要强制搜索使用创建注释的绝对时间而不是Evernote客户端报告的创建时间,您必须使用Z后缀到日期时间戳,如下面的搜索语法中所示,您将返回创建的注释仅限2015年5月15日UTC:

created:20150511T000000Z -created:20150512T000000Z

源头
https://dev.evernote.com/doc/articles/search_grammar.php https://dev.evernote.com/doc/reference/Types.html#Struct_Note

答案 2 :(得分: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;
}

总之,使用secondsFromGMT的NSDate实例方法来抵消时区差异是一种破解。没有真正使用正确的概念。但现在必须这样做。

欢迎任何评论:)