сравнивая дату - PullRequest
       2

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

1 голос
/ 30 декабря 2011

Я пытаюсь сравнить дату, но не сравниваю дату, например, 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 ]

1 голос
/ 30 декабря 2011

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

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

Очевидно, что лучше хранить даты в массиве. Это делает все вычисления даты намного легче. Затем вы можете отфильтровать массив с помощью 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);
    ////////////////////////////////////////
0 голосов
/ 30 декабря 2011

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

Итак, вы должны сделать это так:

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