iOS对Time NSString的NSArray进行sorting

我需要sorting一个包含时间NSStringNSArray ,比如,

 NSMutableArray *times = [[NSMutableArray alloc]initWithObjects:@"09:00 AM",@"07:30 AM",@"06:45 PM",@"05:00 PM",@"12:45 AM",@"12:45 PM",@"01:00 AM",@"01:15 PM", nil]; 

我需要的是按照时间顺序排列数组。
有没有办法做这样的事情?

 NSMutableArray *times = [[NSMutableArray alloc]initWithObjects:@"09:00 AM",@"07:30 AM",@"06:45 PM",@"05:00 PM",@"12:45 AM",@"12:45 PM",@"01:00 AM",@"01:15 PM", nil]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"hh:mm a"]; NSArray *sortedTimes = [times sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) { NSDate *date1 = [dateFormatter dateFromString:obj1]; NSDate *date2 = [dateFormatter dateFromString:obj2]; return [date1 compare:date2]; }]; 

优化版本:

 NSMutableArray *times = [[NSMutableArray alloc]initWithObjects:@"09:00 AM",@"07:30 AM",@"06:45 PM",@"05:00 PM",@"12:45 AM",@"12:45 PM",@"01:00 AM",@"01:15 PM", nil]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"hh:mm a"]; NSMutableArray *dates = [NSMutableArray arrayWithCapacity:times.count]; for (NSString *timeString in times) { NSDate *date = [dateFormatter dateFromString:timeString]; [dates addObject:date]; } [dates sortUsingSelector:@selector(compare:)]; NSMutableArray *sortedTimes = [NSMutableArray arrayWithCapacity:dates.count]; for (NSDate *date in dates) { NSString *timeString = [dateFormatter stringFromDate:date]; [sortedTimes addObject:timeString]; } 

你可以试试这个代码:

 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"hh:mm a"]; [times sortUsingComparator:^NSComparisonResult(NSString* obj1, NSString *obj2) { NSDate *firstDate = [formatter dateFromString:obj1]; NSDate *secondDate = [formatter dateFromString:obj2]; return [firstDate compare:secondDate]; }]; 

由于这些是string,它将被记为

01:15,12:25,05:00

而且他们不是NSDate

所以你需要做的是从这些string创build一个具有NSDate的并行数组 ,sorting数组,并提取这些值。


在实施中,我以新手的方式解决了这个问题

 NSMutableArray *times = [[NSMutableArray alloc]initWithObjects:@"09:00 AM",@"07:30 AM",@"06:45 PM",@"05:00 PM",@"12:45 AM",@"12:45 PM",@"01:00 AM",@"01:15 PM", nil]; NSMutableArray *dates=[NSMutableArray new]; NSDateFormatter *dateFormatter=[NSDateFormatter new]; [dateFormatter setDateFormat:@"hh:mm a"]; for (NSString *stringDate in times) { NSDate *date=[dateFormatter dateFromString:stringDate]; [dates addObject:date]; } NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES]; NSArray *descriptors = [NSArray arrayWithObject: descriptor]; NSArray *reverseOrder = [dates sortedArrayUsingDescriptors:descriptors]; [times removeAllObjects]; for (NSDate *date in reverseOrder) { NSString *string=[dateFormatter stringFromDate:date]; [times addObject:string]; } NSLog(@"%@",times); 

对于NSDate比较使用这个:

 + (BOOL)isDate:(NSDate *)date1 smallerThanAnotherDate:(NSDate *)date2 { NSDate* enddate = date1; NSDate* currentdate = date2; NSTimeInterval distanceBetweenDates = [enddate timeIntervalSinceDate:currentdate]; double secondsInMinute = 60; NSInteger secondsBetweenDates = distanceBetweenDates / secondsInMinute; if (secondsBetweenDates == 0) return YES; else if (secondsBetweenDates < 0) return YES; else return NO; } 

所以,如果你不想把你的时间转换成NSDate,那么单独做这个工作对我来说是有用的

 NSArray *sortedTimes = [times sortedArrayUsingSelector:@selector(localizedStandardCompare:)];