2011-05-11 105 views
1

我有一个NSArray含日期/时间NSStrings采用以下格式:如何用日期时间值对NSArray进行排序?

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

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

我该如何对NSArray进行排序,以确保最新的日期/时间在最上方?

+0

的NSString。 – jini 2011-05-11 03:58:27

+0

第一个字段是月份。对不起,我应该提到这一点。 – jini 2011-05-11 04:03:50

回答

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"]]; 

已经这样做了,排数组很简单:即正在从Web服务返回

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

哇谢谢Bavarious!伟大的方法。 – jini 2011-05-11 12:27:04

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; 
} 

使用你自己的逻辑来梳理

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); 
+0

请在输入评论时给予一些额外的努力,以便为此进行投票。 – Ishu 2011-05-11 04:14:56

+0

我没有把你的答案投下来,但它看起来像你正在做一些像泡泡排序,但因为它只做一个传递,它不会工作。另外,冒泡排序非常缓慢。 (请注意,由于dateTwo未声明,因此您的代码无法编译。) – ThomasW 2011-05-11 04:53:26

+1

即使在编辑之后,排序代码仍然无法使用。一般来说,你不能以线性时间排序数组。 – 2011-05-11 05:03:57

相关问题