2013-08-07 4 views
2

Я использую приведенный ниже код, чтобы использовать текущее системное время, чтобы рассказать мне в следующий раз в массиве. Все, что входит в систему, это последнее число в массиве. Я искал, и именно так я оказался там, где я есть, но никогда не смог заставить его работать правильно. БлагодаряКак сравнить текущее системное время с массивом раз

self.array = @[@"00:15", @"01:35, "@"05:30", @"06:10", @"07:05", @"07:55", @"08:45", @"09:35", @"10:40", @"11:25", @"12:20", @"13:10", @"14:05", @"15:00", @"15:45", @"16:40", @"17:30", @"18:20", @"19:20", @"20:10", @"21:00", @"22:05", @"22:55"]; 


NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"HH:mm"]; 
NSDate *formattedCurrentDate = [dateFormat dateFromString:[dateFormat stringFromDate:[NSDate date]]]; 

for(NSString *stringTime in self.array) { 
    NSDate *dateFromString = [dateFormat dateFromString:stringTime]; 
    if([formattedCurrentDate earlierDate:dateFromString]) { 
     self.nextTime.text = stringTime; 
    } 


} 
+0

Пожалуйста, обновите код, чтобы показать @ "01:35", а не @ "01:35," @ "05:30" Ошибка котирования –

ответ

-1

если ваша функция работает отлично. изменение:

for(NSString *stringTime in self.array) { 
    NSDate *dateFromString = [dateFormat dateFromString:stringTime]; 
    if([formattedCurrentDate earlierDate:dateFromString]) { 
     self.nextTime.text = stringTime; 
    } 
} 

к:

for(NSString *stringTime in self.array) { 
    NSDate *dateFromString = [dateFormat dateFromString:stringTime]; 
    if([formattedCurrentDate compare:dateFromString] == NSOrderedAscending) { 
     self.nextTime.text = stringTime; 
     break; 
    } 
} 
+1

Это на самом деле не правильно. '- (NSDate *) earlyDate: (NSDate *) anotherDate' возвращает более ранний« NSDate »между двумя сравниваемыми. 'if ([formattedCurrentDate earlyDate: dateFromString])' будет проверять, является ли верный указатель допустимым указателем (его не 'nil'), который всегда будет в этом случае. Правильный подход - это тот, который я указал в своем решении. –

+0

Использование прерывания не всегда работает, поскольку у него есть время по порядку, если не было времени, чтобы ваше решение не сработало. –

0

Если вы хотите получить более общее решение, которое не зависит от того массива, вы можете использовать код ниже:

NSArray *array = @[@"02:25", @"01:35", @"05:30", @"06:10", @"07:05", @"07:55", @"08:45", @"09:35", @"10:40", @"11:25", @"12:20", @"13:10", @"14:05", @"15:00", @"15:45", @"16:40", @"17:30", @"18:20", @"19:20", @"20:10", @"21:00", @"22:05", @"22:55", @"23:55"]; 

NSDateFormatter *dateFormat = [NSDateFormatter new]; 
[dateFormat setDateFormat:@"HH:mm"]; 

NSDate *formattedCurrentDate = [dateFormat dateFromString:[dateFormat stringFromDate:[NSDate date]]]; 
NSTimeInterval currentInterval = [formattedCurrentDate timeIntervalSince1970]; 
NSTimeInterval smallerInterval = CGFLOAT_MAX; 

for(NSString *stringTime in array) { 
    NSDate *dateFromString = [dateFormat dateFromString:stringTime]; 
    NSTimeInterval dateFromStringInterval = [dateFromString timeIntervalSince1970]; 

    NSTimeInterval actualInterval = (dateFromStringInterval - currentInterval); 

    if(actualInterval > 0 && actualInterval < smallerInterval){ 
     smallerInterval = actualInterval; 
     self.nextTime.text = stringTime; 
    } 
} 

Этот код получает ближайший следующий час текущего часа, независимо от его индекса внутри массива. И не требует больше распределений или какой-либо сортировки массивов, таких как @Sandeep-решения (которые работают).

Объяснение: ФактическийInterval получает разницу в секундах между всеми датами и текущей датой. Эта переменная (которая двойная, фактически) будет только положительной для будущих часов (прошлые часы будут отрицательными).

Итак, все, что делает код, заключается в уменьшении разницы между будущими часами. Это, я думаю, лучшее решение для этого случая.

Надеюсь, это помогло.

+0

Спасибо за помощь. Это работает лучше, но это печатает все после текущего времени. Итак, текущее время - 20:05, оно отпечатывает следующие три на консоли, а затем UILabel получает последний в массиве. Как вы получаете только следующий? Спасибо за помощь –

+0

NSLog - это просто тест, я оставил вам все остальное. Итак, что вы действительно хотите? Только первый раз после текущего времени в массиве? –

+0

Только в следующий раз в массиве. Поэтому в случае, когда ток равен 20:25, в следующий раз в массиве будет 21:00. Это то, что я пытаюсь получить. Спасибо, извините, если это кажется дрянным вопросом. –

1

Ваш код ведет себя так, как должен, вы возвращаете его раньше, чем текущее время, что означает, что каждый раз назначается self.nextTime.text, но вы видите только последнее назначение, которое это последний элемент массива.

Кроме того, ваш , если оператор всегда возвращает true, если выполняется правильно, так что вы всегда получите правду, если вы не предоставите объект, который не является NSDate.

Вот верный способ получить то, что вы хотите , не беспокоясь о заказе вашего массива.

NSArray *array = @[@"16:40", @"05:30", @"06:10", @"07:05", @"07:55", @"08:45", @"09:35", @"10:40", @"11:25", @"12:20", @"13:10", @"14:05", @"15:00", @"15:45", @"16:40", @"17:30", @"18:20", @"19:20", @"20:10", @"21:00", @"22:05", @"22:55", @"23:55", @"01:35"]; 

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"HH:mm"]; 

NSDate *formattedCurrentDate = [dateFormat dateFromString:[dateFormat stringFromDate:[NSDate date]]]; 

NSDate *laterDate; 
NSDate *closestDate; 

for(NSString *stringTime in array) { 
    NSDate *dateFromString = [dateFormat dateFromString:stringTime]; 
    laterDate = [formattedCurrentDate laterDate:dateFromString]; 
    if(![laterDate isEqualToDate:formattedCurrentDate]){ 
     closestDate = [laterDate earlierDate:closestDate]; 
    } 
} 
NSLog(@"Closest Date: %@", [dateFormat stringFromDate:closestDate]); 
+0

Это тоже не правильно. Ваша часть кода, похоже, получает более раннюю дату всего внутри массива, которая в этом случае всегда будет первой «@» 00:15 ». Помимо этого, вы сначала сказали в параграфе fisrt, что код ведет себя точно так, как должен, и во втором абзаце вы сказали, что всегда будут возвращать true. Как это? –

+0

1. Код ведет себя так, как должен, но это не тот результат, который он хочет. 2. Лукас, самая ранняя дата в зависимости от того, во сколько раз вы запустите его, всегда будет 00:15 (самая ранняя дата в массиве), если вы не запустили приложение между 00: 01-00: 14, из которого системная дата будет моложе. –

+0

Ваша вторая точка верна, указатель 'earlyliestDate' всегда будет стоять 00:15, если текущая дата не находится между 00: 01-00: 14, и из-за того, что явно НЕ то, что пользователь хочет в своем вопросе, это неправильно , См. «Я использую приведенный ниже код, чтобы попытаться использовать текущее системное время, чтобы сообщить мне следующий раз в массиве. (...)». Кроме того, у вас все еще есть несогласованность в вашем тексте. Отрицательный мой anwser не сделает это более правильным. –

0
NSArray *array = @[@"23:15", @"01:35", @"05:30", @"06:10", @"07:05", @"07:55", @"08:45", @"09:35", @"10:40", @"11:25", @"12:20", @"13:10", @"14:05", @"15:00", @"15:45", @"16:40", @"17:30", @"18:20", @"19:20", @"20:10", @"21:00", @"22:05", @"22:55", @"23:55"]; 

    NSMutableArray *datesArray = [[NSMutableArray alloc] init]; 

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"HH:mm"]; 

    //Convert all strings to dates 
    for (NSString *str in array) 
    { 

     NSDate *formattedCurrentDate = [dateFormat dateFromString: str]; 

     [datesArray addObject:formattedCurrentDate]; 
    } 

    //Sort dates. 
    NSArray *sortedArray = [datesArray sortedArrayUsingSelector:@selector(compare:)]; 

    NSString *date = [dateFormat stringFromDate:[NSDate date]]; 
    NSDate *formattedTodatDate = [dateFormat dateFromString:date]; 

    //Print the desired date 
    for(NSDate *stringTime in sortedArray) 
    { 
     if([formattedTodatDate compare:stringTime] == NSOrderedAscending) 
     { 
      NSLog(@"Result is %@", [dateFormat stringFromDate:stringTime]); 
      break; 
     } 
    } 

Попробуйте приведенный выше код. Я просто следил за тем, что другие упоминали с датами сортировки.

Смежные вопросы