2013-07-25 1 views
-1

Я получаю 7:00 и 10:00 как NSStrings из веб-службы. Я конвертировать их в NSDate, используя этот блок кода:Как установить дату для времени NSDate, чтобы сравнить время?

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"hh:mm a"]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"CST"]]; 

    NSString *openDateString = (NSString*)[timeStringsArray2 objectAtIndex:0]; 
    NSString *closeDateString = (NSString*)[timeStringsArray2 objectAtIndex:1]; 

    NSDate *openDate = [dateFormatter dateFromString:openDateString]; 
    NSDate *closeDate = [dateFormatter dateFromString:closeDateString]; 

if ([self timeCompare:openDate until:closeDate]) { 
     NSLog(@"OPEN-timeCompare"); 
    } else { 
     NSLog(@"CLOSED-timeCompare"); 
    } 

Это сравнение метод:

-(BOOL)timeCompare:(NSDate*)date1 until:(NSDate*)date2{ 
    NSDate *date = [NSDate date]; 
    NSLog(@"open:%@ now:%@ close:%@", date1, date, date2); 
    return ([date1 compare:date] == NSOrderedAscending && [date2 compare:date] == NSOrderedDescending); 
} 

Так что, когда я сравниваю эти значения, я сравниваю:

открыт: 2013 -07-26 12:00:00 +0000
сейчас: 2013-07-27 03:50:30 +0000 закрыть: 2013-07-27 03:00:00 +0000 ЗАКРЫТО-timeCompare

Я не уверен, почему, потому что сейчас его фактически 950 вечера, что за 10 минут до 10:00 вечера. Это не должно быть эквивалентно времени, близкому к времени, даже если оно находится в UTC.

+0

Не могли бы вы уточнить, откуда взялись дата1 и дата2? Я не вижу их в вашем коде. –

+0

Возможный дубликат [Почему NSDateFormatter dateFromString возвращает nil?] (Http://stackoverflow.com/questions/17845994/why-does-nsdateformatter-datefromstring-return-nil) –

+0

Не тот же вопрос. Пожалуйста, внимательно прочитайте! – marciokoko

ответ

1

NSDateFormatter по умолчанию 2000 года, когда не поставляется год. Если вы хотите, чтобы ваш openDate и closeDate быть в году 0001 вместо 2000, попробуйте следующее:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
//Add year to expected date format 
[dateFormatter setDateFormat:@"yyyy hh:mm a"]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"CST"]]; 

NSString *openDateString = (NSString*)[timeStringsArray2 objectAtIndex:0]; 
NSString *closeDateString = (NSString*)[timeStringsArray2 objectAtIndex:1]; 

//make new strings with year 0001 + original time 
NSString *adjustedOpenDateString = [NSString stringWithFormat:@"%@ %@", @"0001", openDateString]; 
NSString *adjustedCloseDateString = [NSString stringWithFormat:@"%@ %@", @"0001", closeDateString]; 

NSDate *openDate = [dateFormatter dateFromString:adjustedOpenDateString]; 
NSDate *closeDate = [dateFormatter dateFromString:adjustedCloseDateString]; 

Это должно установить дату форматировщик посмотреть в течение года, и добавить год 0001 струн вы создаете время от времени. К сожалению, я сейчас не в Xcode, поэтому я не могу гарантировать, что нет опечаток!

+0

Спасибо, я заработал до 2013 года как год. Но поскольку я все еще использую 01-01 как день и месяц по умолчанию, я предполагаю, что поэтому тест все еще терпит неудачу. Мне нужно было бы получить текущий день и месяц, чтобы иметь возможность добавлять их, а затем сделать сравнение. Я думаю, что это сделано через NSDateComponents, правильно? – marciokoko

+0

Вот ссылка, которая показывает, как получить NSDate на сегодня в полночь, может быть полезно: http://stackoverflow.com/questions/9040319/how-can-i-get-an-nsdate-object-for- today-at-midnight –

+0

Вы можете использовать NSDateFormatter, чтобы создать текущую дату в форме char, без времени, затем согласовать время char и запустить через NSDateFormatter (с другим форматом). Но в какой-то момент имеет смысл просто декодировать значения часов и минут в начале и конце времени и сравнивать их, а также преобразовывать их в NSDates. –

1

Используйте NSDate сравнить селектор:

if ([date1 compare:date2]==NSOrderedDescending) { 
    // date1 is after date2 
} 

Есть также earlierDate, timeIntervalSinceDate и т.д.

UPDATE: Например сейчас тестируется между 2 датами:

NSDate *now = [NSDate date]; 
    if ([date1 compare:now]==NSOrderedAscending && [date2 compare:now]==NSOrderedDescending) { 
     // now is between the 2 dates 
    } 
+0

Thx, но мне нужно знать, находится ли теперь между date1 и date2, чтобы определить, открыт ли магазин или закрыт. – marciokoko

+0

Я добавил еще один пример, чтобы проверить, находится ли между двумя датами. HTH –

+0

Thx, но он все еще не работает, я добавил журналы дат, сравниваемых. – marciokoko