Учитывая, что ваши даты хранятся в виде строк в другом массиве, и вы хотите получить массив строк, отфильтровывая только даты, которые происходят после определенной даты, предпримут следующие шаги:
- Получить дату для фильтрации с
- Зациклить на всех строках
- Используйте средство форматирования даты для преобразования строки в объект даты.
- Сравните конвертированную дату с датой фильтра
- Сохранить индекс строки даты, если преобразованная дата происходит после даты фильтра
- Создайте новый массив строк с индексами, которые вы сохранили, зацикливая все строки.
Очевидно, что лучше хранить даты в массиве. Это делает все вычисления даты намного легче. Затем вы можете отфильтровать массив с помощью 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);
////////////////////////////////////////