2014-04-13 2 views
3

특정 날짜가 지난 7 일 (지난주의 기간 내에 있음)을 감지하려고합니다. 나는 그 일을하는 방법을 찾았지만 tableview (채팅 컨트롤러)에서 내 성능을 먹고있다.iOS가 지난 주 내에 날짜가 있는지 감지합니다.

코드는 아래에 게시되며 더 잘 수행 될 수 있다는 것을 알고 있지만 아이디어가 부족합니다. 누군가 더 나은 접근법을 가지고 있습니까? 감사!

코드 :

NSDate *date = [[_messages objectAtIndex:indexPath.row] date]; 
NSString *lastMessageDateString = [[[NVDate alloc] initUsingDate:date] stringValueWithFormat:@"dd/MM/yy"]; 
NSString *todayDateString = [[[NVDate alloc] initUsingToday] stringValueWithFormat:@"dd/MM/yy"]; 
NSString *yesterdayDateString = [[[[NVDate alloc] initUsingToday] previousDay] stringValueWithFormat:@"dd/MM/yy"]; 
NSString *earlier2DaysDateString = [[[[NVDate alloc] initUsingToday] previousDays:2] stringValueWithFormat:@"dd/MM/yy"]; 
NSString *earlier3DaysDateString = [[[[NVDate alloc] initUsingToday] previousDays:3] stringValueWithFormat:@"dd/MM/yy"]; 
NSString *earlier4DaysDateString = [[[[NVDate alloc] initUsingToday] previousDays:4] stringValueWithFormat:@"dd/MM/yy"]; 
NSString *earlier5DaysDateString = [[[[NVDate alloc] initUsingToday] previousDays:5] stringValueWithFormat:@"dd/MM/yy"]; 
NSString *earlier6DaysDateString = [[[[NVDate alloc] initUsingToday] previousDays:6] stringValueWithFormat:@"dd/MM/yy"]; 
NSString *earlier7DaysDateString = [[[[NVDate alloc] initUsingToday] previousDays:7] stringValueWithFormat:@"dd/MM/yy"]; 
//return the time of the message since it is today 
if ([lastMessageDateString isEqualToString:todayDateString]) { 
    return [SAD.myE.timeFormat stringFromDate:date]; 
} 
//return the string "yesterday" of the message since it is yesterday 
else if ([lastMessageDateString isEqualToString:yesterdayDateString]) { 
    return @"Yesterday"; 
} 
//return the string of the actual day of the message since it is within last 7 days 
else if ([lastMessageDateString isEqualToString:earlier2DaysDateString] || 
     [lastMessageDateString isEqualToString:earlier3DaysDateString] || 
     [lastMessageDateString isEqualToString:earlier4DaysDateString] || 
     [lastMessageDateString isEqualToString:earlier5DaysDateString] || 
     [lastMessageDateString isEqualToString:earlier6DaysDateString] || 
     [lastMessageDateString isEqualToString:earlier7DaysDateString]) { 
    return [SAD.myE.dayFormat stringFromDate:date]; 
} 
//return the string date since the message is olf 
else { 
    return [SAD.myE.dateFormat stringFromDate:date]; 
} 

편집 덕분에 나는이 솔루션을 구현하기 위해 자신의 솔루션을 사용하는 것을 시도했다 @vikingosegundo합니다. 그는 그때 이후로 나는 지금 시도하고 구현하기가 더 쉬워 진 범주를 만들었습니다. 그냥 궁금 사람을위한 :

- (NSString *)stringForDate:(NSDate *)date { 
NSDate *now = [NSDate date]; // now 
NSDate *today; 
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit // beginning of this day 
           startDate:&today // save it here 
           interval:NULL 
            forDate:now]; 

NSDateComponents *comp = [[NSDateComponents alloc] init]; 
comp.day = 0; 
NSDate * theDayToday = [[NSCalendar currentCalendar] dateByAddingComponents:comp toDate:today options:0]; 
if ([date compare:theDayToday] == NSOrderedDescending) { 
    return @"today"; 
} 

comp.day = -1; 
NSDate * yesterday = [[NSCalendar currentCalendar] dateByAddingComponents:comp toDate:today options:0]; 
if ([date compare:yesterday] == NSOrderedDescending) { 
    return @"yesterday"; 
} 

comp.day = -7;  // lets go 7 days back from today 
NSDate * oneWeekBefore = [[NSCalendar currentCalendar] dateByAddingComponents:comp toDate:today options:0]; 
if ([date compare:oneWeekBefore] == NSOrderedDescending) { 
    return @"within 7 days"; 
} else { 
return @"before 7 days"; 
} 
} 
+0

지난 주에 지난 7 일을 의미하거나 지난 주를 일요일에서 일요일 또는 일요일로 토요일로 변경합니까? – vikingosegundo

+0

7 일전에 (또는 나는 weeknumber를 비교할 것입니다. 그러나 두 개의 날짜가 7 일 안에 있지만 2 주일이 지나면 작동하지 않습니다.) –

+0

ok, 이해하는 한, 나는 대답했습니다. 오늘은 지난 7 일 동안 포함 되었습니까? 나는 그렇게 생각하지 않았다. – vikingosegundo

답변

5
-(BOOL) dayOccuredDuringLast7Days 
{ 

    NSDate *now = [NSDate date]; // now 
    NSDate *today; 
    [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit // beginning of this day 
            startDate:&today // save it here 
            interval:NULL 
             forDate:now]; 

    NSDateComponents *comp = [[NSDateComponents alloc] init]; 
    comp.day = -7;  // lets go 7 days back from today 
    NSDate * oneWeekBefore = [[NSCalendar currentCalendar] dateByAddingComponents:comp 
                      toDate:today 
                      options:0]; 


    if ([self compare: oneWeekBefore] == NSOrderedDescending) { 

     if ([self compare:today] == NSOrderedAscending) { // or now? 
      return YES; 
     } 
    } 
    return NO; 
} 

지난 7 일 어제위한 완벽한 명령 줄 예. NSDate의 카테고리로

#import <Foundation/Foundation.h> 



@interface NSDate (ExtendedComparions) 
-(BOOL) dayOccuredDuringLast7Days; 
-(BOOL) dayWasYesterday; 
@end 

@implementation NSDate (ExtendedComparions) 


-(BOOL) _occuredDaysBeforeToday:(NSUInteger) nDaysBefore 
{ 
    NSDate *now = [NSDate date]; // now 
    NSDate *today; 
    [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit // beginning of this day 
            startDate:&today // save it here 
            interval:NULL 
             forDate:now]; 

    NSDateComponents *comp = [[NSDateComponents alloc] init]; 
    comp.day = -nDaysBefore;  // lets go N days back from today 
    NSDate * before = [[NSCalendar currentCalendar] dateByAddingComponents:comp 
                    toDate:today 
                    options:0]; 
    if ([self compare: before] == NSOrderedDescending) { 
     if ([self compare:today] == NSOrderedAscending) { 
      return YES; 
     } 
    } 
    return NO; 
} 


-(BOOL) dayOccuredDuringLast7Days 
{ 
    return [self _occuredDaysBeforeToday:7]; 
} 

-(BOOL) dayWasYesterday 
{ 
    return [self _occuredDaysBeforeToday:1]; 
} 


@end 



int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     NSDate *now =[NSDate date]; 
     NSDate *twoDaysBefore = [[NSCalendar currentCalendar] dateByAddingComponents:(
                         { 
                          NSDateComponents *comps = [[NSDateComponents alloc] init]; 
                          comps.day = -2; 
                          comps; 
                         }) 
                       toDate:now 
                      options:0]; 

     if ([twoDaysBefore dayOccuredDuringLast7Days]) { 
      NSLog(@"last week"); 
     } else { 
      NSLog(@"not last week"); 
     } 

     if ([twoDaysBefore dayWasYesterday]) { 
      NSLog(@"yesteday"); 
     } else { 
      NSLog(@"not yesterday"); 
     } 


    } 
    return 0; 
} 
+0

을 (를) 사용하십시오. 나는 1) 오늘 2) 어제 3) 7 일전까지 남은 일 4) 7 일 전에 확인하려고 노력하고있다. 나는 너의 대답으로 노력하고 놀 것이다. 당신은 또한 그것에게 기회를 줄 것을 환영합니다 :) ... ... 감사합니다! –

+0

이 코드 또는 각 경우를 적용 ​​할 수 있습니다. – vikingosegundo

+0

정확히 각 비교에 대한 광고가 변경됩니다. 편집에서 작동하는 최종 코드를 게시 할 것입니다 ... 5 분 :) –

관련 문제