如何按字符串降序排列包含日期的数组?

时间:2013-08-27 10:18:13

标签: ios iphone objective-c nsdate nsdateformatter

我想按降序排序包含日期字符串的数组,我已尝试过SO答案,但输出错误。

请参阅我的代码如下:

NSArray *dateArray=[NSArray arrayWithObjects:@"01/12/2012",@"01/26/2011",@"02/09/2005",@"02/24/2006",@"03/19/2007",@"07/14/2011",@"08/17/2007",@"10/04/2007",@"10/31/2006",@"12/05/2012",@"12/06/2006",@"12/23/2008",nil];
NSDateFormatter *formatter=[[NSDateFormatter alloc]init];
[formatter setDateFormat:@"MM/DD/YYYY"];
NSMutableArray *tempArr=[[NSMutableArray alloc]init];
for (int i=0; i<[dateArray count]; i++) {

    NSString *dt=[dateArray objectAtIndex:i];
    NSDate *newDt=[formatter dateFromString:dt];
    [tempArr addObject:newDt];
}
NSLog(@"tempArr is %@",tempArr);

我正在获得如下控制台输出:

  

2013-08-27 15:29:50.418样本[3688:c07] tempArr是(       “2011-12-24 18:30:00 +0000”,       “2010-12-18 18:30:00 +0000”,       “2004-12-18 18:30:00 +0000”,       “2005-12-24 18:30:00 +0000”,       “2006-12-23 18:30:00 +0000”,       “2010-12-18 18:30:00 +0000”,       “2006-12-23 18:30:00 +0000”,       “2006-12-23 18:30:00 +0000”,       “2005-12-24 18:30:00 +0000”,       “2011-12-24 18:30:00 +0000”,       “2005-12-24 18:30:00 +0000”,       “2007-12-22 18:30:00 +0000”   )

我不知道为什么“12”会在月份出现,而且日期格式也不像我指定的格式。

3 个答案:

答案 0 :(得分:7)

嗯,首先,你实际上并没有在你的代码中对任何内容进行排序......

你应该这样做......

// create the string array
NSArray *dateArray = @[@"01/12/2012", @"01/26/2011", @"02/09/2005", @"02/24/2006", @"03/19/2007", @"07/14/2011", @"08/17/2007", @"10/04/2007", @"10/31/2006", @"12/05/2012", @"12/06/2006", @"12/23/2008"];

// create the date formatter with the correct format
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM/dd/yyyy"];

NSMutableArray *tempArray = [NSMutableArray array];

// fast enumeration of the array
for (NSString *dateString in dateArray) {
    NSDate *date = [formatter dateFromString:dateString];
    [tempArray addObject:date];
}

// sort the array of dates
[tempArray sortUsingComparator:^NSComparisonResult(NSDate *date1, NSDate *date2) {
    // return date2 compare date1 for descending. Or reverse the call for ascending.
    return [date2 compare:date1];
}];

NSLog(@"%@", tempArray);

编辑进入阵营

NSMutableArray *correctOrderStringArray = [NSMutableArray array];

for (NSDate *date in tempArray) {
    NSString *dateString = [formatter stringFromDate:date];
    [correctOrderStringArray addObject:dateString];
}

NSLog(@"%@", correctOrderStringArray);

另外,请详细了解NSDateNSStringNSDateFormatter。特别是他们如何互相交流。

NSDate是一个时间点。它(并且从不)包含任何格式信息。

NSDateFormatter不包含有关特定日期(即时间点)的任何信息。它用于记录日期并根据您提供的NSDateformat生成字符串。

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html

答案 1 :(得分:0)

尝试

[formatter setDateFormat:@"MM/dd/yyyy"]

而不是第3行中的内容。 这应该为您提供您期望的日期格式。关于排序,我有点困惑。您没有可以排序的代码。您是要尝试排序还是只是格式化日期字符串?

答案 2 :(得分:0)

你必须为自己建立一个合适的比较器:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[formatter setLocale:enUSPOSIXLocale];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[formatter setDateFormat:@"MM/dd/yyyy"];

NSComparator myDateComparator = ^NSComparisonResult(id obj1,
                                                    id obj2) {
    NSDate *date1 = [formatter dateFromString:obj1];
    NSDate *date2 = [formatter dateFromString:obj2];

    return [date2 compare:date1]; // sort in descending order
};

然后通过执行以下操作简单地对数组进行排序:

NSArray *dateArray = @[@"01/12/2012", @"01/26/2011", @"02/09/2005",
                       @"02/24/2006", @"03/19/2007", @"07/14/2011",
                       @"08/17/2007", @"10/04/2007", @"10/31/2006",
                       @"12/05/2012", @"12/06/2006", @"12/23/2008"];

NSArray *sortedArray = [dateArray sortedArrayUsingComparator:myDateComparator];

NSLog(@"Sorted array is %@", sortedArray);

这对字符串(而不是任何已修改的数组)进行排序。你也可以使用字符串操作并将m / d / y转换为y-m-d,但我想对于小数据集这种方法会很好。