Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSDate筛选案例_Ios_Nsdate - Fatal编程技术网

Ios NSDate筛选案例

Ios NSDate筛选案例,ios,nsdate,Ios,Nsdate,我正在使用瞬态属性在表视图部分中分发核心数据对象。 transient属性称为sectionIdentifier,它是根据名为todoDueDate的属性定义的。 我需要以一种方式过滤对象,所有对象都必须包含在以下组中,且仅包含在一个组中: 1. sectionIdentier = 0, **OVERDUE** , todoDueDate < today 2. sectionIdentier = 1, **TODAY** , todoDueDate = today 3. sectionId

我正在使用
瞬态属性
表视图部分中分发
核心数据对象
transient属性
称为sectionIdentifier,它是根据名为todoDueDate的属性定义的。 我需要以一种方式过滤对象,所有对象都必须包含在以下组中,且仅包含在一个组中:

1. sectionIdentier = 0, **OVERDUE** , todoDueDate < today
2. sectionIdentier = 1, **TODAY** , todoDueDate = today
3. sectionIdentier = 2, **TOMORROW** , todoDueDate >today AND todoDueDate= = tomorrow
4. sectionIdentier = 3, **UPCOMING** , todoDueDate > today AND todoDueDate!=tomorrow

这是我的更新代码:

-(NSString *)sectionIdentifier{

    [self willAccessValueForKey:@"sectionIdentifier"];
    NSString *tmp = [self primitiveValueForKey:@"sectionIdentifier"];
    [self didAccessValueForKey:@"sectionIdentifier"];

    if (!tmp){
        NSDate *today = [NSDate date];
        NSDate *date = self.todoDueDate;
        NSCalendar *calendar;
        NSInteger daysAfterToday = [calendar components:NSDayCalendarUnit
                                               fromDate:today toDate:date options:0].day;
       // NSString *section;
        if (daysAfterToday < 0) {
            tmp  = @"0";
        } else if (daysAfterToday == 0) {
            tmp = @"1";
        } else if (daysAfterToday == 1) {
            tmp = @"2";
        } else {
            tmp = @"3";
        }


        NSLog(@"TODAY = %@", today);
        NSLog(@"DATE = %@", date);
        NSLog(@"DAYS AFTER TODAY = %ld",(long)daysAfterToday);

        NSLog(@"Tmp= %@",tmp);

        [self setPrimitiveValue:tmp forKey:@"sectionIdentifier"];

    }
    return tmp;

}

稍微重新调整代码,您可以使用消息
dateOnly
只返回日期,不返回时间组件(将所有这些代码放在
NSDate
类别中):

这将在今天返回给您:

+(NSDate *)today {
  return [[NSDate now] dateOnly];
}
那么,鉴于此:

-(NSDate *)addDays:(NSInteger)days {
  NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
  [offsetComponents setDay:days];
  return [[NSDate calendar] dateByAddingComponents:offsetComponents toDate:self options:0];
}
你可以在明天:

+(NSDate *)tomorrow {
  return [[NSDate today] addDays:1];
}
因此,您可以使用
[NSDate today]
[NSDate tomory]
简化代码

另外,请记住将时间组件从
到oduedate

NSDate *date = [self.todoDueDate dateOnly];
NSDate *todayDate = [NSDate today];
NSDate *tomorrowDate = [NSDate tomorrow];
您的逻辑可以简化:

  • sectionIdentier=0,过期,todoDueDate<今天
  • sectionIdentier=1,今天,todoDueDate=今天
  • sectionIdentier=2,明天,todoDueDate=明天
  • sectionIdentier=3,即将推出,todoDueDate>明天
  • 代码:

    if ([date compare:todayDate] == NSOrderedAscending) {
      tmp = @"0";//OVERDUE
    }
    else if ([date isEqualToDate:todayDate])  {
      tmp = @"1";//TODAY
    }
    else if ([date isEqualToDate:tomorrowDate])  {
      tmp = @"2";//TOMORROW
    }
    else if ([date compare:tomorrowDate] == NSOrderedDescending)  {
      tmp = @"3";//UPCOMING
    }
    

    只需让日历计算从今天到到期日的天数,并检查该数字:

            NSInteger daysAfterToday = [calendar components:NSDayCalendarUnit
                fromDate:today toDate:date options:0].day;
            NSString *section;
            if (daysAfterToday < 0) {
                section = @"0";
            } else if (daysAfterToday == 0) {
                section = @"1";
            } else if (daysAfterToday == 1) {
                section = @"2";
            } else {
                section = @"3";
            }
    
    NSInteger daysAfterToday=[日历组件:nsdayscalendarUnit
    fromDate:toDate:date选项:0]。天;
    NSString*节;
    如果(daysAfterToday<0){
    节=@“0”;
    }else if(daysAfterToday==0){
    第=@“1”节;
    }else if(daysAfterToday==1){
    第=@“2”节;
    }否则{
    第=@“3”节;
    }
    
    谢谢你,我会试试你的建议,但我需要你的帮助来区分明天和明天,而不是明天。我也会考虑接受你的回答,但是RoMayOffo的答案对我来说更好。无论如何,谢谢你。我也会尝试你的建议,似乎更容易实现,只需要12条代码行。非常聪明。我已经包含了应该按四个可能的组排序的对象,但在启动应用程序后,所有对象都包含在组1中…您需要提供更多详细信息。请尝试记录
    今天
    日期
    ,以及
    后天
    @robmayoff,我已更新了我的问题并将记录结果放在那里。请尝试将日历时区设置为
    [NSTimeZone localTimeZone]
    。另外,尝试将每个日期的时间部分标准化为中午。
    NSDate *date = [self.todoDueDate dateOnly];
    NSDate *todayDate = [NSDate today];
    NSDate *tomorrowDate = [NSDate tomorrow];
    
    if ([date compare:todayDate] == NSOrderedAscending) {
      tmp = @"0";//OVERDUE
    }
    else if ([date isEqualToDate:todayDate])  {
      tmp = @"1";//TODAY
    }
    else if ([date isEqualToDate:tomorrowDate])  {
      tmp = @"2";//TOMORROW
    }
    else if ([date compare:tomorrowDate] == NSOrderedDescending)  {
      tmp = @"3";//UPCOMING
    }
    
            NSInteger daysAfterToday = [calendar components:NSDayCalendarUnit
                fromDate:today toDate:date options:0].day;
            NSString *section;
            if (daysAfterToday < 0) {
                section = @"0";
            } else if (daysAfterToday == 0) {
                section = @"1";
            } else if (daysAfterToday == 1) {
                section = @"2";
            } else {
                section = @"3";
            }