带日期范围的 Evernote 搜索

Evernote search with date range

我的objective是显示在日期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 会话中设置时区。根据您的经验,这是有效的扣除吗?

2) 如果是这样,我在阅读文档后还没有找到这样做的方法。有可能吗?

3) 您会建议另一种方法吗?也许改用 notestore?

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

您现有的搜索语法:created:20150511 -created:20150512 应该 return 在 5 月 11 日之后和 5 月 12 日之前创建的笔记,使用客户端上创建笔记时使用的时间和日期。要强制搜索使用创建笔记的绝对时间而不是 Evernote 客户端报告的创建时间,您必须使用 Z 后缀作为日期时间戳,如以下搜索语法所示,您将 return 仅在 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

在 Evernote 中,你的日期以 UTC 格式保存。

当你进行搜索时,你需要创建一个与你感兴趣的时区相关的 Evernote 搜索语法。在你的情况下,客户端的时区或 iPhone.

获取用户时区:

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

其中 EDAMUser class 具有以下结构:

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

例如我的用户时区是:America/Montreal 美国东部标准时间。

为了获得 5 月 11 日创建的所有笔记,您需要构建此 Evernote 搜索语法:

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

注意最后的...T040000Z。

所以结论是您需要从客户端的角度包含日期 "definition" 否则查询将在 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?

希望对您有所帮助。

鉴于手头的时间限制,我正在部署以下解决方案:

-(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 实例方法来抵消时区差异的 hack。没有真正使用正确的概念。但现在必须这样做。

任何评论都将受到热烈欢迎:)