Как установить часть даты для времени NSDate, чтобы сравнить время?

Я получаю 7:00 и 22:00 как NSStrings из веб-сервиса. Я конвертирую их в 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 время ЗАКРЫТОСравнить

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


person marciokoko    schedule 25.07.2013    source источник
comment
Не могли бы вы уточнить, откуда берутся date1 и date2? Я не вижу их в вашем коде.   -  person Craig Siemens    schedule 25.07.2013
comment
возможный дубликат Почему NSDateFormatter dateFromString возвращает ноль?   -  person Hot Licks    schedule 27.07.2013
comment
Это не тот же вопрос. Пожалуйста, прочитайте внимательно!   -  person marciokoko    schedule 29.07.2013


Ответы (2)


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, поэтому не могу гарантировать отсутствие опечаток!

person Jake Spencer    schedule 25.07.2013
comment
Спасибо, я заработал, добавив 2013 год. Но поскольку я все еще использую 01-01 в качестве дня и месяца по умолчанию, я предполагаю, что тест все еще не проходит. Мне нужно было бы получить текущий день и месяц, чтобы иметь возможность добавить их, а затем сравнить. Я думаю, что это делается через NSDateComponents, верно? - person marciokoko; 26.07.2013
comment
Вот ссылка, которая показывает, как получить NSDate на сегодня в полночь, это может быть полезно: stackoverflow.com/questions/9040319/ - person Jake Spencer; 26.07.2013
comment
Вы можете использовать NSDateFormatter, чтобы создать текущую дату в форме char, без времени, затем согласовать с временем char и запустить обратно через NSDateFormatter (с другим форматом). Но в какой-то момент имеет смысл просто декодировать значения часов и минут во времени начала/окончания и сравнивать их с преобразованием их в NSDates. - person Hot Licks; 27.07.2013

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

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

Также есть более ранние даты, timeIntervalSinceDate и т.д.

ОБНОВЛЕНИЕ: Например, сейчас тестирование проводится между двумя датами:

    NSDate *now = [NSDate date];
    if ([date1 compare:now]==NSOrderedAscending && [date2 compare:now]==NSOrderedDescending) {
        // now is between the 2 dates
    }
person Janene Pappas    schedule 25.07.2013
comment
Спасибо, но мне нужно знать, попадает ли сейчас между date1 и date2, чтобы определить, открыт ли магазин или закрыт. - person marciokoko; 26.07.2013
comment
Я добавил еще один пример, чтобы проверить, находится ли сейчас между двумя датами. ХТН - person Janene Pappas; 26.07.2013
comment
Спасибо, но это все еще не работает, я добавил журналы дат, которые я сравниваю. - person marciokoko; 27.07.2013
comment
Вы установили часовые пояса для дат, которые вы проанализировали, но не сейчас. Убедитесь, что даты, которые вы сравниваете, находятся в одной и той же зоне. Пожалуйста, добавьте точный вывод - то, что вы добавили, не соответствует операторам журнала кода, поэтому его сложно отлаживать. - person Janene Pappas; 28.07.2013