0

NSMutableArrayNSDate입니다. 각 NSDate 개체는 앞으로 24 시간 동안 가장 가까운 반올림 값이 HH : 00 또는 HH : 30입니다. [: 00,03 : 30,04 : 00,04 : 30 ... 3시 (다음 날) 03]24 시간을 30 분 간격으로 나눈 값 - NSDate

지금의 2시 31분 내가 @의 출력을 원하는 말할 수

02:29 그러면 @ [02 : 30,03 : 00, 다음 날 02:30까지].

바로 아래 코드가 있는데 거의 항상 작동하지만 드물게 남은 여분의 시간 (@ [03 : 01,03 : 31)으로 원하는 모든 NSDate 개체의 출력을 얻지는 않습니다. : 04 : 01 ... so]).

어떤 아이디어가 있습니까?

-(NSMutableArray*)TwentyFourHoursFromNowDivicedBy30Mins 
{ 

    NSMutableArray * dateArray = [NSMutableArray array]; 
    NSCalendar * cal = [NSCalendar currentCalendar]; 

    NSDateComponents * plusDays = [NSDateComponents new]; 
    NSDate * now = [self changeTimeValue:[NSDate date]]; 

    for(NSUInteger day = 0; day < 2; day++) 
    { 
     [plusDays setDay:day]; 
     [dateArray addObject:[cal dateByAddingComponents:plusDays toDate:now options:0]]; 
    } 

    NSDate *startDate = [dateArray objectAtIndex:0]; 
    NSDate *endDate = [dateArray objectAtIndex:1]; 
    NSDateComponents *diff = [[NSDateComponents alloc] init]; 
    [diff setMinute:0]; 
    NSCalendar *calz = [NSCalendar currentCalendar]; 
    NSDate *tmp = startDate; 

    NSMutableArray *dates = [NSMutableArray arrayWithObject:tmp]; 

    while ([tmp laterDate:endDate] == endDate) { 
     [diff setMinute:[diff minute] + 30]; 
     tmp = [calz dateByAddingComponents:diff toDate:startDate options:0]; 
     [dates addObject:tmp]; 

    } 


    return dates; 

} 
- (NSDate *)changeTimeValue:(NSDate *)dateValue{ 
    NSDateComponents *time = [[NSCalendar currentCalendar] 
           components:NSHourCalendarUnit | NSMinuteCalendarUnit 
           fromDate:dateValue]; 
    long val = 0; 
    NSDate *newDate = [[NSDate alloc] init]; 
    NSInteger minutes = [time minute]; 
    if(minutes > 0 && minutes < 30) { 
     val = 30 - minutes; NSTimeInterval aTimeInterval = [dateValue 
                  timeIntervalSinceReferenceDate] + 60 * val + minutes; 
     newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; 
     return newDate; 
    } else if(minutes > 30 && minutes < 60) { 
     val = 60 - minutes; 
     NSTimeInterval aTimeInterval = [dateValue timeIntervalSinceReferenceDate] 
     + 60 * val; 
     newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; 
     return newDate; 
    } else { 
     return newDate; 
    } 
} 

답변

0

당신은 당신의 changeTimeValue에 초를 제로화하지 않는, 어떤 경우에는 내가 생각하는 당신은 그것을 overcomplicated했습니다. 그래서 나는 당신이 연속적으로 반올림 문제를 겪고 있다고 의심합니다. 전체 작업을 수행하려면 NSDateComponents을 사용하십시오.

NSCalendar *currentCalendar = [NSCalendar currentCalendar]; 

NSDateComponents *dateComponents = [currentCalendar 
           components:NSHourCalendarUnit | 
             NSMinuteCalendarUnit | 
             NSYearCalendarUnit | 
             NSMonthCalendarUnit | 
             NSDayCalendarUnit 
           fromDate:dateValue]; 

dateComponents.minute += 15; 
dateComponents.minute -= dateComponents.minute%30; 

return [currentCalendar dateFromComponents:dateComponents]; 
+0

thx a tommy :) – yogi