2010-05-10 2 views
3

У меня есть строковое представление времени, например «11:13 утра». Это было создано с использованием метода NSDateFormatter и метода stringFromDate :.Какой лучший/простой способ сравнить два раза в Objective-C?

Я хотел бы сравнить это время с текущим временем, но когда я использую метод dateFromString: для перевода строки обратно в дату, добавляются год, месяц и день - чего я не хочу. Мне просто нужно знать, есть ли сейчас < или> время, сохраненное в строке.

Что будет лучшим способом справиться с этим? Заранее спасибо за вашу помощь.

ответ

9

Вместо использования строкового представления используйте NSDate, который вы получили от сборщика. Вы можете конвертировать этот час/мин/сек с помощью NSDateComponents, а затем конвертировать [NSDate date] в NSDateComponents. Сравните часы/минуты/секунды двух наборов компонентов.

EDIT - используйте функцию полезности для таких вещей, которая преобразует компоненты hr/min/sec из NSDate в секундомер (в секундах с полуночи).

Вы можете использовать два значения времени суток, так как они обе секунды с полуночи. Простые целые числа можно легко сравнивать, хранить и манипулировать. Вам не нужно постоянно использовать NSDate.

//---------------------------------------------------------------------------- 
// extracts hour/minutes/seconds from NSDate, converts to seconds since midnight 
//---------------------------------------------------------------------------- 
unsigned secondOfTheDay(NSDate* time) 
{ 
    NSCalendar* curCalendar = [NSCalendar currentCalendar]; 
    const unsigned units = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; 
    NSDateComponents* comps = [curCalendar components:units fromDate:time]; 
    int hour = [comps hour]; 
    int min = [comps minute]; 
    int sec = [comps second]; 

    return ((hour * 60) + min) * 60 + sec; 
} 
+0

Это похоже на самый логичный способ сделать это. – Chuck

+0

Да, это оказалось решением (хотя другие, упомянутые здесь, вероятно, тоже работали). Я закончил тем, что добавил еще один атрибут к объекту Core Data, чтобы сохранить дату в качестве экземпляра NSDate, а затем разложить его на компоненты и сравнить с компонентами, полученными с текущей даты. Работает как шарм, но код прикольный. Слава богу за сложение кода. – Andy

0

Если строка изначально была создана из NSDate, то вы хотите использовать эту оригинальную NSDate для сравнения с [NSDate date] использования NSDate «s compare: метода (или каким-то варианта, такими как earlierDate: или laterDate:).

+0

У меня нет оригинального экземпляра NSDate; Я создаю строку даты из значения выбора даты, затем сохраняю строку, потому что все, о чем я забочусь, это значение времени. Когда мой пользователь нажимает кнопку, мне нужно проверить текущее значение времени на значение времени сохраненной строки и выяснить, какой из них является более ранним/более поздним/текущим. Теперь я думаю, что мне нужно использовать что-то вроде метода DateFromComponents :: NSCalendar и передать значения времени для создания соответствующих объектов NSData, а затем запустить метод compare. – Andy

+0

@ Andy, что случилось с 'NSDate * selectedDate = [myDatePicker date];'? –

+0

Я думаю, что большая часть моей проблемы связана с тем, что я использую выбранную дату для двух принципиально разных вещей: один, чтобы записать время для сравнения с другим временем в более позднюю дату и два, чтобы отобразить выбранное значение пользователь в пользовательском интерфейсе после выбора времени. Я попробую пару этих предложений, и я немного отчитаюсь о выигрышном решении. – Andy

4

Если я правильно понял проблему, вы используете метод dateFromString:NSDateFormatter. Это дает вам правильное время, но с датой по умолчанию от 1 января 1970 года, что бесполезно сравнивать с текущей датой/временем.

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

NSDate *now = [NSDate date]; 

NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease]; 
[formatter setDateFormat:@"hh:mm a"]; 
[formatter setDefaultDate:now]; 

NSDate *theDate = [formatter dateFromString:@"11:13 AM"]; 
NSComparisonResult theResult = [theDate compare:now]; 
2

Можно ли использовать форматирование строк, которое вы использовали для создания строки? Итак, предположим, что вы создали строку, как это:

NSDateFormatter *formatter = [[[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"HH:mm a"]; 
NSString *dateAsString = [formatter stringFromDate:[NSDate date]]; 

Вы можете получить NSDate так:

NSDateFormatter *formatter = [[[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"HH:mm a"]; 
NSDate *date = [formatter dateFromString:dateAsString]; 

На следующий день, месяц, год и информация о временной зоне не будет храниться, но вы У меня есть объект NSDate со значениями 1/1/1970 и GMT для смещения часового пояса.

На этом этапе вы можете использовать сравнение: (которое обычно зарезервировано для операций сортировки) или методы laterDate: или earlyDate:.

Будьте осторожны с использованием NSDateFormatter, так как вы можете столкнуться с проблемами интернационализации.

Если вам нужно добавить информацию о текущей дате на дату, которую вы получаете с dateFromString :, например, день месяца и год, вам нужно использовать метод dateByAddingComponents для NSCalendar: toDate: options: method.

0

Вы должны использовать 24-часовой основе NSDateFormatter и сравнивать как строки ("09.00"> "08:00 вечера", но "9:00" < "20:00"). Но в общем случае право работать с экземплярами NSDate вместо строк

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