NSPredicate 用于多日全天事件
Posted
技术标签:
【中文标题】NSPredicate 用于多日全天事件【英文标题】:NSPredicate for multiday-all day event 【发布时间】:2015-07-16 13:52:13 【问题描述】:在我的数据库中,我有两列,即 startDate 和 endDate,如果用户在 UI 中按下任何日期,例如 2015 年 7 月 16 日,那么它应该获取介于 startDate 和 endDate 之间的所有事件。
之前我写了一个谓词来获取凝视事件:
[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%@ >= %%@ AND %@ < %%@", @"startTime", @"endTime"], date, [date dateForNextDay]]
但如果给定日期不是事件的开始日期,上述查询将不起作用。
示例: 如果我的会议日期为 7/13 - 7/16 并且给定日期是 7/14,那么会议事件应该能够使用谓词获取。我的旧查询仅在 7/13 有效。它应该在给定日期获取该事件 - 7/13、7/14、7/15、7/16
【问题讨论】:
你能澄清一下“获取所有在 startDate 和 endDate 之间的事件”这句话吗?您真的是指“所选日期介于 startDate 和 endDate 之间的所有事件”吗? @danh 如果我的会议日期为 7/13 - 7/16,假设今天是 7/14,那么会议事件应该能够获取谓词。我的旧查询仅在 7/13 有效。它应该在给定日期获取该事件 - 7/13、7/14、7/15、7/16 您能提供 dateForNextDay 代码吗?不应该只是日期,日期吗? NextDay 只是第二天而已.. [dayOffsetComponents setDay:1] 我明白了。你一定读过这篇文章***.com/a/8435736/294949,它处理了午夜结束时间的边缘情况。很好,但我认为您对其中的代码感到困惑,它正在解决“查找范围内的事件”的不同问题,您正在查找包含单个日期的事件。甚至您问题中的语言也有这种混淆(请参阅我的第一条评论)。相应地添加了答案... 【参考方案1】:获取给定日期大于或等于且小于或等于给定日期的事件......
[NSPredicate predicateWithFormat:@"%@ >= startTime AND %@ <= endTime", date, date]
EDIT... 用一个简单的对象对其进行测试确认它可以正常工作....
- (NSArray *)filterArray:(NSArray *)array forDate:(NSDate *)date
NSPredicate *p = [NSPredicate predicateWithFormat:@"%@ >= startTime AND %@ <= endTime", date, date];
return [array filteredArrayUsingPredicate:p];
- (void)testPredicate
NSDictionary *event0 = @ @"startTime":[self dateFromString:@"07/01/2015"], @"endTime":[self dateFromString:@"07/04/2015"] ;
NSDictionary *event1 = @ @"startTime":[self dateFromString:@"07/10/2015"], @"endTime":[self dateFromString:@"07/14/2015"] ;
NSDictionary *event2 = @ @"startTime":[self dateFromString:@"08/02/2015"], @"endTime":[self dateFromString:@"08/09/2015"] ;
NSArray *events = @[event0, event1, event2];
NSDate *july9 = [self dateFromString:@"07/09/2015"];
NSDate *july10 = [self dateFromString:@"07/10/2015"];
NSDate *july11 = [self dateFromString:@"07/11/2015"];
NSDate *july13 = [self dateFromString:@"07/13/2015"];
NSDate *july14 = [self dateFromString:@"07/14/2015"];
NSDate *july15 = [self dateFromString:@"07/15/2015"];
NSLog(@"filtered using 9 should be empty %@", [self filterArray:events forDate:july9]);
NSLog(@"filtered using 10 should hit %@", [self filterArray:events forDate:july10]);
NSLog(@"filtered using 11 should hit %@", [self filterArray:events forDate:july11]);
NSLog(@"filtered using 13 should hit %@", [self filterArray:events forDate:july13]);
NSLog(@"filtered using 14 should hit %@", [self filterArray:events forDate:july14]);
NSLog(@"filtered using 15 should be empty %@", [self filterArray:events forDate:july15]);
- (NSDate *)dateFromString:(NSString *)string
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM/dd/yyyy"];
return [dateFormatter dateFromString:string];
上述情况不需要对午夜情况进行特殊处理,以便按照问题的建议执行(包括最后一个 endTime)。
这会生成以下日志输出,您可以自己确认...
filtered using 9 should be empty ()
filtered using 10 should hit (
endTime = "2015-07-14 07:00:00 +0000";
startTime = "2015-07-10 07:00:00 +0000";
)
filtered using 11 should hit (
endTime = "2015-07-14 07:00:00 +0000";
startTime = "2015-07-10 07:00:00 +0000";
)
filtered using 13 should hit (
endTime = "2015-07-14 07:00:00 +0000";
startTime = "2015-07-10 07:00:00 +0000";
)
filtered using 14 should hit (
endTime = "2015-07-14 07:00:00 +0000";
startTime = "2015-07-10 07:00:00 +0000";
)
filtered using 15 should be empty ()
【讨论】:
此代码还会返回我所有未来的事件,包括给定日期的事件。 @Tariq 请参阅编辑,演示代码在简单测试中按预期工作。也许您的应用在其他地方出错了?【参考方案2】:我不明白你为什么有两个日期:date 和 dateForNextDay。
我认为你应该试试这个: [NSPredicate predicateWithFormat:@"startTime >= %@ && %@
或者像这样切换你的最后一个 %@ 和 %%@ => @"%@ >= %%@ AND %%@
编辑:顺便说一句,正如@danh 所说,您可能只是想使用日期,日期。
Edit2:好的,我回答得太快了,所有条件都是错误的,而 danh 又是对的;) @"startTime
【讨论】:
没有为我工作。它返回所有当前和未来的事件,而不是给定范围内的事件。如果给定日期是 16July,则结果应返回 startDate - endDate 范围内的事件以上是关于NSPredicate 用于多日全天事件的主要内容,如果未能解决你的问题,请参考以下文章
NSPredicate 获取具有 NSDate 日期范围内的日期属性的核心数据对象