核心数据 - 使用NSDates进行预测

时间:2010-07-12 20:50:20

标签: iphone core-data

喂,

我正在开发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对象的时间组件和日期。

那么,我怎样才能重写上述内容以忽略时间,只对当天过去敏感呢?

谢谢

3 个答案:

答案 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;
}