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