= %@ AND endDate %@", -6ren">
gpt4 book ai didi

iphone - NSPredicate - 用于查找特定日期范围内发生的事件

转载 作者:行者123 更新时间:2023-12-03 19:26:17 28 4
gpt4 key购买 nike

这有点复杂

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"startDate >= %@ AND endDate <= %@", startDay,endDay];

我正在构建一个日历应用程序,我需要从核心数据存储中提取特定日期发生的事件。但是,事件可能会在与我尝试显示的日期不同的日期开始/结束,例如

我的日期范围(开始 = 2011-12-02 00:00:00 到结束 = 2011-12-02 23:59:59)

一个事件(开始 = 2011-12-01 23:00:00 到结束 = 2011-12-02 05:00:00)

如何编写谓词来确定该事件是否属于该日期范围。请记住,事件可能会在该日期范围之前和之后开始。

谢谢!

最佳答案

以下是构建谓词以检索给定日期发生的非重复事件的方法(重复事件需要额外处理):

- (NSPredicate *) predicateToRetrieveEventsForDate:(NSDate *)aDate {

// start by retrieving day, weekday, month and year components for the given day
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *todayComponents = [gregorian components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:aDate];
NSInteger theDay = [todayComponents day];
NSInteger theMonth = [todayComponents month];
NSInteger theYear = [todayComponents year];

// now build a NSDate object for the input date using these components
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay:theDay];
[components setMonth:theMonth];
[components setYear:theYear];
NSDate *thisDate = [gregorian dateFromComponents:components];
[components release];

// build a NSDate object for aDate next day
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
[offsetComponents setDay:1];
NSDate *nextDate = [gregorian dateByAddingComponents:offsetComponents toDate:thisDate options:0];
[offsetComponents release];

[gregorian release];


// build the predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"startDate < %@ && endDate > %@", nextDate, thisDate];

return predicate;

}

该谓词几乎等于@Tony 提出的谓词,只是它不检查相等性。这就是原因。假设您有一个事件从 12 月 8 日 23:00 开始,到 12 月 9 日 00:00 结束。如果您检查结束日期为 >= 而不是 > 给定日期的事件,您的应用程序将在 12 月 8 日和 9 日报告该事件,这显然是错误的。尝试将这样的事件添加到 iCal 和 Google 日历中,您将看到该事件仅出现在 12 月 8 日。实际上,您不应该假设给定的一天在 23:59:59 结束(尽管这当然是true):您需要将午夜视为给定日期的最后一秒(关于事件的结束)。另请注意,这不会阻止事件在午夜开始。

关于iphone - NSPredicate - 用于查找特定日期范围内发生的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8364495/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com