如何使用日期时间值对NSArray进行排序?

时间:2011-05-11 03:46:22

标签: iphone ios nsarray

我有一个NSArray,其中包含以下格式的日期/时间NSStrings

2/2/2011 2:46:39 PM
2/4/2011 11:59:47 AM
…

其中日期表示为月/日/年。

如何对此NSArray进行排序以确保最新的日期/时间位于顶部?

3 个答案:

答案 0 :(得分:3)

当您处理日期时,请使用NSDate代替NSString。此外,考虑时区很重要 - Web服务是否提供UTC或其他时区的日期?

您应该首先将字符串数组转换为日期数组。否则,无论何时用于比较,您都会将字符串转换为日期,并且将会有比字符串数更多的比较。

例如:

NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"MM/DD/YYYY hh:mm:ss a"];

NSMutableArray *dateArray = [NSMutableArray array];
for (NSString *dateString in array) {
    NSDate *date = [formatter dateFromString:dateString];
    if (date) [dateArray addObject:date];
    // If the date is nil, the string wasn't a valid date.
    // You could add some error reporting in that case.
}

这会将array(一个NSStrings数组)转换为dateArray,这是一个NSDates的可变数组。日期格式化程序使用系统时区。如果要使用UTC作为时区:

NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"MM/DD/YYYY hh:mm:ss a"];
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];

完成后,对数组进行排序是微不足道的:

[dateArray sortUsingSelector:@selector(compare:)];

答案 1 :(得分:0)

使用方法compare比较两个日期

样本NSDate比较,

NSDate *dateOne = [NSDate dateWithString:@"2008-12-04 03:00:00 +0900"];
NSDate *dateTwo = [NSDate dateWithString:@"2008-12-04 04:00:00 +0900"];

switch ([dateOne compare:dateTwo]){
case NSOrderedAscending:
NSLog(@”NSOrderedAscending”);
break;
case NSOrderedSame:
NSLog(@”NSOrderedSame”);
break;
case NSOrderedDescending:
NSLog(@”NSOrderedDescending”);
break;
}

使用您自己的逻辑进行排序

答案 2 :(得分:0)

使用此

    NSMutableArray *mutArr=[yourArray mutableCopy];//convert your NSArray into mutable array
    NSDateFormatter *df=[[[NSDateFormatter alloc] init] autorealese];
    [df setDateFormat:@"MM/DD/YYYY hh:mm:ss a"];
    NSDate *compareDate;
NSInteger index;
for(int i=0;i<[mutArray count];i++)
{
    index=i;
    compareDate=[df dateFromString:[mutArray objectAtIndex:i]];
    NSDate *compareDateSecond;
    for(int j=i+1;j<counter;j++)
    {
        compareDateSecond=[df dateFromString:[mutArr objectAtIndex:j]];
        NSComparisonResult result = [compareDate compare:compareDateSecond];
       if(result == NSOrderedAscending)
       {
           compareDate=compareDateSecond;
           index=j;
       }
    }
    if(i!=index)
      [mutArr exchangeObjectAtIndex:i withObjectAtIndex:index];
}
    }

NSLog(@"%@",mutArr);