Сравнивая дату

Я пытаюсь сравнить дату, но не сравнивать дату, например, 31 декабря 2011 года, с 1-01-2012. Я пытался удалить значения на 31 декабря 2011 года и любые другие значения до 1-01-2012. здесь я делаю это: я хочу показать значения на сегодняшнюю дату и в предстоящие даты.

-(void)showcurrentdate
{
    NSDate *objdate=[NSDate date];
NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init];
[dateformatter setDateFormat:@"dd-MM-YYYY"];

NSDate *str1= (NSDate *)[dateformatter stringFromDate:objdate];

NSLog(@"configuregameArray......%d",[configuregameArray count]);

if([configuregameArray count]>=1)
{    
  NSMutableArray* indexarray= [[NSMutableArray alloc]init];  
  for(int k =0; k<[configuregameArray count]; k++)
 {

    NSDate *datefromarray = (NSDate *)[[configuregameArray objectAtIndex:k] objectForKey:@"gd"];  

     NSComparisonResult result = [datefromarray compare:str1];

     switch (result)
     {               

         case NSOrderedAscending:

             NSLog(@"%@ is greater from %@", str1 ,datefromarray);
             indexNumber = [NSString stringWithFormat:@"%d",k];
             [indexarray addObject:indexNumber];
             NSLog(@"indexarray......%@",indexarray);
             break;


         default: 
             NSLog(@"going fine");   
                            break;
     }

 }


    NSMutableIndexSet *discardedItems = [NSMutableIndexSet indexSet];
    for(int i=0; i<[indexarray count]; i++)
    {
       NSInteger removeindex = [[indexarray objectAtIndex:i]intValue];        
       [discardedItems addIndex:removeindex];

     }

    [configuregameArray removeObjectsAtIndexes:discardedItems];
}
NSLog(@"configuregameArray......%@",configuregameArray);

}

2 ответа

Решение

Учитывая, что ваши даты хранятся в виде строк в другом массиве, и вы хотите получить массив строк, отфильтровывая только даты, которые происходят после определенной даты, предпринимаются следующие шаги:

  • Получить дату для фильтрации
  • Зациклить на всех строках
    • Используйте средство форматирования даты, чтобы преобразовать строку в объект даты.
    • Сравните конвертированную дату с датой фильтра
      • Сохраните индекс строки даты, если преобразованная дата происходит после даты фильтра
  • Создайте новый массив строк с индексами, которые вы сохранили, зацикливая все строки.

Очевидно, что было бы лучше хранить даты в массиве. Это делает все вычисления даты намного легче. Затем вы можете отфильтровать массив с помощью NSP-предиката из одной строки вместо множества строк кода. Обычно плохой дизайн хранить объекты в виде строк. Гораздо лучшая практика - хранить объекты как объекты и преобразовывать их в строки при представлении их в пользовательском интерфейсе. Таким образом вы можете изменить способ форматирования объектов, не изменяя способ их хранения, преобразования и использования. Это разделение проблем, когда интерфейс, который заинтересован в отображении дат в виде строк, преобразует даты в строки, в то время как модель, которая занимается датами, использует даты и вообще не заботится о строках.

В любом случае, код для вышеуказанных шагов для фильтрации строк с датами в вашем вопросе будет выглядеть примерно так: Если вы хотите фильтровать, используя сегодняшнюю дату, вы можете использовать [NSDate date]; чтобы получить сегодняшнюю дату как дату, а не строку.

    // Create some sample date strings 
    NSArray *dateStrings = [NSArray arrayWithObjects:@"01-01-2012", @"03-01-2012", @"01-03-2012", @"10-08-2011", @"06-02-2002", @"20-04-1999", @"01-01-2012", @"31-12-2011", @"07-03-2014", @"18-09-3456", @"27-07-1924", nil];

    // The same kind date format as the question
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"dd-MM-YYYY";

    // The date that other dates are filtered using
    NSDate *filterDate = [dateFormatter dateFromString:@"01-01-2012"];

    ///////////// OUTPUT /////////////
    NSLog(@"BEFORE: %@", dateStrings);
    //////////////////////////////////

    // Get the indexes of all dates after the filterDate.
    NSIndexSet *newerDateIndexes = [dateStrings indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
        NSString *dateString = (NSString *)obj; // The string stored in the array
        NSDate *date = [dateFormatter dateFromString:dateString]; // Use the dateFormatter to get a date from the array

        // Add this index to the index set if the date occurs after the filterDate.
        return ([date compare:filterDate] != NSOrderedAscending);
    }];

    // A new array with only the dates after the filterDate
    NSArray *filteredDateString = [dateStrings objectsAtIndexes:newerDateIndexes];

    ///////////// OUTPUT ///////////////////
    NSLog(@"AFTER: %@", filteredDateString);
    ////////////////////////////////////////

Вы не можете просто привести один класс к другому, за исключением того, что они связаны (приведение к супер / подклассу).

Так что вы должны сделать это так:

  • Либо магазин NSDate экземпляры в вашем массиве. Тогда все, что вам нужно сделать, это сравнить даты с вашим objdate, Это было бы лучшим решением.
  • Или превратить каждую строку в дату (используя [dateformatter dateFromString:]) и сравните полученную дату с objdate,
  • Вы не должны сравнивать строковые представления, поскольку вы получите "странные" результаты, если вы не используете обратный формат, такой как YYYY-MM-dd,
Другие вопросы по тегам