喂,
我正在开发Core Data应用程序,必须根据日期进行一些过滤。我进行了一些测试,看来在比较NSDates时,Core Data也在比较日期的 time 组件。
我的代码:
- (BOOL)hasSpeakersWithinDateRangeFrom:(NSDate *)startOfRange through:(NSDate *)endOfRange {
NSPredicate* dateRangePredicate = [NSPredicate predicateWithFormat:@"startOn <= %@ && endOn >= %@", startOfRange, endOfRange];
NSSet* speakersWithinDateRange = [self.speakers filteredSetUsingPredicate:dateRangePredicate];
if ([speakersWithinDateRange count] > 0)
return YES;
else
return NO;
}
我有一个“方便”的方法是单行:
- (BOOL)hasSpeakersNow {
return [self hasSpeakersWithinDateRangeFrom:[NSDate date] through:[NSDate date]];
}
当我运行一些基本测试时,它不能按计划运行,而且我可以告诉Core Data正在比较NSDate对象的时间组件和日期。
那么,我怎样才能重写上述内容以忽略时间,只对当天过去敏感呢?
谢谢
答案 0 :(得分:5)
您可能希望熟悉NSDateComponents和NSCalendar。您可能需要做的是从日期中提取组件,并仅使用没有时间组件的日,月和年组件构建新的NSDates。
对于“当前”日,您需要使用今天午夜的日期创建1天范围,并通过将日期添加1天来创建日期。 NSCalendar有一些方法可以帮助你。
这些文档可能有所帮助:
答案 1 :(得分:4)
这与vikingosegundo基本相同,但两种功能都使用相同的方法,我个人更喜欢它供我使用。
- (NSDate *)dateByMovingToBeginningOfDay
{
unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents* parts = [[NSCalendar currentCalendar] components:flags fromDate:self];
[parts setHour:0];
[parts setMinute:0];
[parts setSecond:0];
return [[NSCalendar currentCalendar] dateFromComponents:parts];
}
- (NSDate *)dateByMovingToEndOfDay
{
unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents* parts = [[NSCalendar currentCalendar] components:flags fromDate:self];
[parts setHour:23];
[parts setMinute:59];
[parts setSecond:59];
return [[NSCalendar currentCalendar] dateFromComponents:parts];
}
答案 2 :(得分:2)
将startDate设置为时间0:00:00,将endDate设置为23:59:59
NSDate *startDate = [NSDate date]; //Now
startDate= [date dateAtMidnight]; //today at 0:00
NSDate *endDate = [NSDate date];
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:@"gregorian"];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:1];
[comps setSecond:-1]
endDate = [cal dateByAddingComponents:comps toDate:endDate options:0];//today 23:59:59
修改
此解决方案使用由Three20提供的NSDate-Category NSDateAdditions.h(我不知道它未在Cocoa中定义)
- (NSDate*)dateAtMidnight {
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-d-M";
NSString* formattedTime = [formatter stringFromDate:self];
NSDate* date = [formatter dateFromString:formattedTime];
[formatter release];
return date;
}