2012-04-26 3 views
0

У меня есть объект Person. и этот объект человека имеет следующие атрибуты;Проверка даты между диапазоном дат - Логическая проблема - BEGINNER

Name 
StartDate 
EndDate 

Я спасаю это Person объекты в массиве. Этот массив может содержать более 100 человеческих объектов. Все перечисленные атрибуты - это строки.

Ниже приведен пример объектов человека в этом массиве;

John, Tue Feb 22, Thr Mar 30 
Jack, Wed Mar 09, Fri Apr 21 
Jack, Thu Mar 19, Fri Dec 20 
Jack, Tue Jan 08, Fri Apr 26 etc.. 

Теперь мне нужно будет поставить дату, скажем, например, Wed 29 Mar, и мне нужно проверить, если он находится в диапазоне StartDate и EndDate в массиве объекта лиц. У меня есть псевдокод для сценария.

Дата, которую я собираюсь проверить на StartDate и EndDate, также являются строками.

Псевдо-код:

if Startdate >= providedDate && EndDate <= providedDate { 

// Add to an Array 


else 

//Do not add to an array 

В виду того что StartData, EndDate и ProvidedDate все строки, как я могу проверить, если его больше или меньше, чем предоставленному дату?

Примечание: Мне нужен такой подход, который не использует NSPredicate

+0

Что случилось с 'NSPredicate'?(Я не спрашиваю об этом, потому что я думаю, что вы * должны использовать его, просто это кажется любопытным ограничением.) –

+0

Вам нужно проанализировать строки даты, чтобы превратить их в нечто, что можно разумно сравнить. 'NSDateFormatter', вероятно, является инструментом для этого. –

+0

Я пробовал NSPredicates, и это не сработало для меня. http://stackoverflow.com/questions/10307902/writing-a-simple-nspredicate-logic-issue/10314802#10314802. Поэтому я пытаюсь использовать этот подход, который выглядит многообещающим. – shajem

ответ

1

Для того, для сравнения значений вам нужны сопоставимые значения. Вы можете использовать объекты NSDate, вы можете указать даты в сортируемую символьно-числовую форму (например, 20120425), или вы можете использовать пользовательские объекты, которые реализуют свои собственные методы compare:options:.

Или вы можете написать отдельный метод compareString:string1 toString:string2 и использовать строки, как они есть у вас.

Вам просто нужно решить, что вы хотите сделать.

1

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

Если это так, я бы просто разделил его на 3 строки - день недели, месяц, день. Тебе не нужен день недели.

У вас нет года, поэтому вы не можете делать никаких логических замечаний ... Я предполагаю, что это все в том же году. (Вы могли бы сделать что-то безумное, как рассчитать, «который в последний год делал этот день в этот день недели», но давайте ...)

Свяжите каждый месяц с целым числом. Скажем, используя хэш-карту. Как и в Months.put («Январь», 1) и т. Д.

Получить номер из каждой даты - просто преобразовать из строки в целое.

Тогда логика для того, что-то до или после даты является (если -1 myMonth это раньше, 0 они одинаковы, и 1 является myMonth после)

if (Months.get(myMonth) < Months.get(providedMonth)) return -1 
else if (Months.get(myMonth) > Months.get(providedMonth)) return 1 
else 
    if (myDate < providedDate) return -1; 
    else if (myDate > providedDate) return 1; 
    else return 0; 
+0

Я думал, что будет простой способ сделать это: S – shajem

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