我正在尝试比较日期,但不是比较31-dec-2011和1-01-2012之间的日期。我试图删除31-dec-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);
}
答案 0 :(得分:1)
鉴于您将日期存储为另一个数组中的字符串,并且您希望最终得到一个字符串数组,过滤掉特定日期之后发生的日期将采取以下步骤:
显然,在数组中存储日期会更好。这使得所有日期计算变得更加容易。然后你可以使用一行NSPredicate而不是多行代码来过滤数组。将对象存储为字符串通常是一种糟糕的设计。更好的做法是将对象存储为对象,并在用户界面中呈现它们时将它们转换为字符串。这是您可以更改对象的格式,而无需更改它们的存储,转换和使用方式。这是一个关注点的分离,其中关注将日期显示为字符串的接口将日期转换为字符串,而关注日期的模型使用日期并且根本不关心字符串。
无论如何,在您的问题中过滤日期字符串的上述步骤的代码如下所示。如果您想使用今天的日期过滤,可以使用[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);
////////////////////////////////////////
答案 1 :(得分:0)
你不能简单地将一个类转换为另一个类,除非它们是相关的(转换为超级/子类)。
所以你应该这样做:
NSDate
个实例。然后,您只需将日期与objdate
进行比较即可。那将是最好的解决方案。[dateformatter dateFromString:]
)并将结果日期与objdate
进行比较。YYYY-MM-dd
这样的反向格式,您将获得“奇怪”的结果。