2013-08-27 2 views
-2

Я хочу, чтобы сравнить две даты и сделать что-то, когда один меньше или равно, чем другой, я пытался сделать это таким образом:IOS: Сравните два меньше или равны NSDates

if ([self.system.systemInbetriebnahme compare:date] == NSOrderedDescending) 
     return nil; 

Но это снимает дело когда они равны, есть ли способ сравнить даты с >=?

Спасибо

Более подробная информации: У меня есть дата, взятая из массива двойного размера, и у меня есть дата, хранящаяся в основных данных (с помощью выбора даты), и я пройти через петлю, чтобы сравнить две даты с правилом: Дата в массиве должна быть больше или равна даты ввода, хранящейся в базе данных.

Последнее редактирование:

  • импортировать файл CSV, который после разбора и форматирования дает мне две строки (одна для числового значения и один для даты). Здесь меня интересуют даты.

  • хранить все это в массив и сохранить после проверки непротиворечивости данных в этой функции:

    for (NSArray * row in array) { 
    
    
    // Handle import if there are at least two rows 
    
    
    if (row.count > 1) { 
    
          dispatch_sync(dispatch_get_main_queue(), ^{ 
           // Try to import value,date formatted row 
           double value = [row[0] doubleValue]; 
           NSDate * date = [dateFormatter dateFromString:row[1]]; 
           //else { 
    
            // Try to import date,value row 
    
            if (date && value != 0.0) { 
             [self addReading:value forDate:date]; 
            } 
    
  • В здесь я вызвать функцию addreading, чтобы проверить на наличие ошибок для некоторых правил и, если все okey, тогда я сохраняю контекст managedObject.

    if ([installationdatum compare:date] != NSOrderedAscending) 
           { 
           UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil 
           message:@"installation date is bigger than data" 
                        delegate: nil 
                     cancelButtonTitle:@"OK" 
                     otherButtonTitles:nil] 
    
            [alert show]; 
            return nil; 
    
    
    
           } else 
           { //Do nothing 
    
           } 
    
  • Одно правило для меня, чтобы получить первый элемент строки в массиве и сравнить его дату с входом хранится уже в базе данных, которая является self.system.systemInbetriebnahme

  • После всего этого я перечисляю все Полученный массив в Tableview, хотя значение соответствия NSOrderedSame никогда не показывается, если оно равно self.system.systemInbetriebnahme

+2

Вы можете получить тысячи ссылку на то же самое, почему бы вам не искать SO перед тем размещение вопросов? –

+0

, потому что он не отвечает на вопрос о симуляторе сравнения дат> =. –

+0

, пожалуйста, посмотрите на редактирование –

ответ

11

Просто проверьте, не возрастающий порядок.

if ([self.system.systemInbetriebnahme compare:date] != NSOrderedAscending) 
     return nil; 
+0

, что не имеет возрастающего порядка, подразумеваемого в логическом выражении? –

+3

В нем подразумевается либо «NSOrderedDescending», либо «NSOrderedSame» –

+0

. Существует только три допустимых значения для перечисления - «NSOrderedAscending», «NSOrderedDescending» или «NSOrderedSame». Таким образом, не восходящий означает, что он тот же или нисходящий. –

0

Я думаю, это поможет вам. do something when one is less or equal than the other as you вид другой случай.

switch ([self.system.systemInbetriebnahme compare: date]) { 
case NSOrderedAscending: 
    // system date earlier then date 
    break; 
case NSOrderedSame: 
    // Same 
    break; 
case NSOrderedDescending: 
    // system date later then date 
    break; 
} 
+0

Я действительно думал, что это будет ответ, но он по-прежнему удаляет значение, когда дело NSOrderedSame истинно. –

12

Простой ...

if ([date1 compare:date2] == NSOrderedDescending) { 
    NSLog(@"date1 is later than date2");   

} else if ([date1 compare:date2] == NSOrderedAscending) { 
    NSLog(@"date1 is earlier than date2"); 

} else { 
    NSLog(@"dates are the same"); 

} 
+1

Копирование и вставка из [ответа другого человека] (http://stackoverflow.com/a/5965106/400056) без атрибуции. Пожалуйста, не делайте этого. – DarkDust

+0

@DarkDust: Да, он был скопирован в мой код (проект) перед этим вопросом. Позже я искал ссылку, я так не понял. Я скопировал из моего кода n, добавленного здесь. –

+1

Спасибо, что разделили это. – swiftBoy

1

Ну> = просто означает, что они есть!<, так что вы можете проверить

if ([self.system.systemInbetriebnahme compare:date] != NSOrderedAscending) 
+0

то, что вы написали, подразумевает: == NSOrderedDescending, который не учитывает, когда обе даты могут быть равны. –

+1

Это не значит, что. Вам не хватает третьего случая, 'NSOrderedSame'. Этот ответ делает то, что вы хотите –

+0

Я думал, что это будет, но он все равно не учитывает случай, когда NSOrderedSame истинно :( –

1

Вы можете либо проверить, если результат равен как NSOrderedDescending и NSOrderedSame:

NSComparisonResult comparisonResult = [self.system.systemInbetriebnahme compare:date] 
if (comparisonResult == NSOrderedDescending || comparisonResult == NSOrderedSame) 
     return nil; 

Или просто не соответствует один вариант слева:

NSComparisonResult comparisonResult = [self.system.systemInbetriebnahme compare:date] 
if (comparisonResult != NSOrderedAscending) 
     return nil; 

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

3
NSDate *toDay = [[NSDate alloc]init]; 

NSLog(@"%@",toDay); 

NSLog(@"%@",yourSecondDate); 

if ([toDay timeIntervalSinceDate:yourSecondDate] < 30.0f) 
{ 
    NSLog(@"Do Something"); 
} 
+0

Спасибо. Временной интервал работал хорошо для моего сценария. –

0

нет прямой Comparision как> =, но вы можете сделать это, как этот

NSComparisonResult compareStart = [date1 compare: selectedDate]; // date1 is 6/6/2011 00:00 
NSComparisonResult compareEnd = [date2 compare: selectedDate]; // date2 is 9/6/2011 00:00 

if ((compareStart == NSOrderedAscending) || (compareStart == NSOrderedSame) 
&& (compareEnd == NSOrderedDescending)) 
{ 
// date is in the right range 
} 

или просто сравнить

if ((compareStart == NSOrderedAscending)) 
{ 
// date is in the right range 
} 
0

К ком [являются два NSDate, это:

[[date1 earlierDate:date2] isEqualToDate: date1] 

возвращение YES, если дата1 раньше даты2.

EDIT

если вы хотите date1> = date2 (позже или равно) использовать это условие:

([[date1 laterDate:date2] isEqualToDate: date1] || [date2 isEqualToDate:date1]) 
+0

Но с минимальным поиском в документации Apple вам не придется публиковать такой вопрос ... – zbMax

+0

Я спрашиваю конкретно о> = для NSDates. В нем не было упоминания о приложении или результатах, полученных в результате поиска stackoverflow, поэтому я хотел спросить здесь. Спасибо. –

+0

Я отредактировал свой ответ – zbMax

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