比较日期

时间:2011-12-30 09:05:03

标签: iphone ios ios5

我正在尝试比较日期,但不是比较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);

}

2 个答案:

答案 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这样的反向格式,您将获得“奇怪”的结果。