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";
}