2014-06-22 101 views
0

我有一个数组,它有一组时间戳(作为字符串),它们按排序顺序。我只想再次对它们进行排序,看看是否返回了相同的列表(原因是我将处理进一步的时间戳存储,并需要对它们进行排序)。这里是我的日期数组,其中时间戳基本上是字符串:sortedArrayUsingComparator返回不正确的结果

(
"Jun 18, 2014 12:00:00 AM", 
"Jun 18, 2014 12:15:00 AM", 
"Jun 18, 2014 12:30:00 AM", 
"Jun 18, 2014 12:45:00 AM", 
"Jun 18, 2014 1:00:00 AM", 
"Jun 18, 2014 1:15:00 AM", 
"Jun 18, 2014 1:30:00 AM", 
"Jun 18, 2014 1:45:00 AM", 
"Jun 18, 2014 2:00:00 AM", 
"Jun 18, 2014 2:15:00 AM", 
"Jun 18, 2014 2:30:00 AM", 
"Jun 18, 2014 2:45:00 AM", 
"Jun 18, 2014 3:00:00 AM", 
"Jun 18, 2014 3:15:00 AM", 
"Jun 18, 2014 3:30:00 AM", 
"Jun 18, 2014 4:15:00 AM", 
"Jun 18, 2014 4:30:00 AM", 
"Jun 18, 2014 4:45:00 AM", 
"Jun 18, 2014 5:15:00 AM", 
"Jun 18, 2014 5:30:00 AM", 
"Jun 18, 2014 5:45:00 AM", 
"Jun 18, 2014 6:00:00 AM", 
"Jun 18, 2014 6:15:00 AM", 
"Jun 18, 2014 6:30:00 AM", 
"Jun 18, 2014 6:45:00 AM", 
"Jun 18, 2014 7:00:00 AM", 
"Jun 18, 2014 7:15:00 AM", 
"Jun 18, 2014 7:30:00 AM", 
"Jun 18, 2014 7:45:00 AM", 
"Jun 18, 2014 8:00:00 AM", 
"Jun 18, 2014 8:15:00 AM", 
"Jun 18, 2014 8:30:00 AM", 
"Jun 18, 2014 8:45:00 AM", 
"Jun 18, 2014 9:00:00 AM", 
"Jun 18, 2014 9:15:00 AM", 
"Jun 18, 2014 10:00:00 AM", 
"Jun 18, 2014 10:15:00 AM", 
"Jun 18, 2014 10:30:00 AM", 
"Jun 18, 2014 10:45:00 AM", 
"Jun 18, 2014 11:15:00 AM", 
"Jun 18, 2014 11:30:00 AM", 
"Jun 18, 2014 11:45:00 AM", 
"Jun 18, 2014 12:00:00 PM", 
"Jun 18, 2014 12:15:00 PM", 
"Jun 18, 2014 12:30:00 PM", 
"Jun 18, 2014 12:45:00 PM", 
"Jun 18, 2014 1:00:00 PM", 
"Jun 18, 2014 1:15:00 PM", 
"Jun 18, 2014 1:30:00 PM", 
"Jun 18, 2014 2:00:00 PM", 
"Jun 18, 2014 2:15:00 PM", 
"Jun 18, 2014 2:30:00 PM", 
"Jun 18, 2014 2:45:00 PM", 
"Jun 18, 2014 3:00:00 PM", 
"Jun 18, 2014 3:15:00 PM", 
"Jun 18, 2014 3:45:00 PM", 
"Jun 18, 2014 4:00:00 PM", 
"Jun 18, 2014 4:15:00 PM", 
"Jun 18, 2014 4:45:00 PM", 
"Jun 18, 2014 5:15:00 PM", 
"Jun 18, 2014 5:30:00 PM", 
"Jun 18, 2014 6:00:00 PM", 
"Jun 18, 2014 6:15:00 PM", 
"Jun 18, 2014 7:00:00 PM", 
"Jun 18, 2014 7:15:00 PM", 
"Jun 18, 2014 7:30:00 PM", 
"Jun 18, 2014 8:00:00 PM", 
"Jun 18, 2014 8:15:00 PM", 
"Jun 18, 2014 8:30:00 PM", 
"Jun 18, 2014 9:15:00 PM", 
"Jun 18, 2014 9:30:00 PM", 
"Jun 18, 2014 9:45:00 PM", 
"Jun 18, 2014 10:15:00 PM", 
"Jun 18, 2014 10:30:00 PM", 
"Jun 18, 2014 11:15:00 PM", 
"Jun 18, 2014 11:30:00 PM", 
"Jun 18, 2014 11:45:00 PM" 
) 

上面的数组是在排序的时间戳。现在,如果我按升序对它们重新排序,他们应该给我同样的结果,但我得到的结果是失序的。我只是不明白,为什么我看到这样的现象: 这是我得到的输出:

sorted dates = (
"Jun 18, 2014 12:00:00 AM", 
"Jun 18, 2014 1:00:00 AM", 
"Jun 18, 2014 2:00:00 AM", 
"Jun 18, 2014 3:00:00 AM", 
"Jun 18, 2014 6:00:00 AM", 
"Jun 18, 2014 7:00:00 AM", 
"Jun 18, 2014 8:00:00 AM", 
"Jun 18, 2014 9:00:00 AM", 
"Jun 18, 2014 10:00:00 AM", 
"Jun 18, 2014 12:15:00 AM", 
"Jun 18, 2014 1:15:00 AM", 
"Jun 18, 2014 2:15:00 AM", 
"Jun 18, 2014 3:15:00 AM", 
"Jun 18, 2014 4:15:00 AM", 
"Jun 18, 2014 5:15:00 AM", 
"Jun 18, 2014 6:15:00 AM", 
"Jun 18, 2014 7:15:00 AM", 
"Jun 18, 2014 8:15:00 AM", 
"Jun 18, 2014 9:15:00 AM", 
"Jun 18, 2014 10:15:00 AM", 
"Jun 18, 2014 11:15:00 AM", 
"Jun 18, 2014 12:30:00 AM", 
"Jun 18, 2014 1:30:00 AM", 
"Jun 18, 2014 2:30:00 AM", 
"Jun 18, 2014 3:30:00 AM", 
"Jun 18, 2014 4:30:00 AM", 
"Jun 18, 2014 5:30:00 AM", 
"Jun 18, 2014 6:30:00 AM", 
"Jun 18, 2014 7:30:00 AM", 
"Jun 18, 2014 8:30:00 AM", 
"Jun 18, 2014 10:30:00 AM", 
"Jun 18, 2014 11:30:00 AM", 
"Jun 18, 2014 12:45:00 AM", 
"Jun 18, 2014 1:45:00 AM", 
"Jun 18, 2014 2:45:00 AM", 
"Jun 18, 2014 4:45:00 AM", 
"Jun 18, 2014 5:45:00 AM", 
"Jun 18, 2014 6:45:00 AM", 
"Jun 18, 2014 7:45:00 AM", 
"Jun 18, 2014 8:45:00 AM", 
"Jun 18, 2014 10:45:00 AM", 
"Jun 18, 2014 11:45:00 AM", 
"Jun 18, 2014 12:00:00 PM", 
"Jun 18, 2014 1:00:00 PM", 
"Jun 18, 2014 2:00:00 PM", 
"Jun 18, 2014 3:00:00 PM", 
"Jun 18, 2014 4:00:00 PM", 
"Jun 18, 2014 6:00:00 PM", 
"Jun 18, 2014 7:00:00 PM", 
"Jun 18, 2014 8:00:00 PM", 
"Jun 18, 2014 12:15:00 PM", 
"Jun 18, 2014 1:15:00 PM", 
"Jun 18, 2014 2:15:00 PM", 
"Jun 18, 2014 3:15:00 PM", 
"Jun 18, 2014 4:15:00 PM", 
"Jun 18, 2014 5:15:00 PM", 
"Jun 18, 2014 6:15:00 PM", 
"Jun 18, 2014 7:15:00 PM", 
"Jun 18, 2014 8:15:00 PM", 
"Jun 18, 2014 9:15:00 PM", 
"Jun 18, 2014 10:15:00 PM", 
"Jun 18, 2014 11:15:00 PM", 
"Jun 18, 2014 12:30:00 PM", 
"Jun 18, 2014 1:30:00 PM", 
"Jun 18, 2014 2:30:00 PM", 
"Jun 18, 2014 5:30:00 PM", 
"Jun 18, 2014 7:30:00 PM", 
"Jun 18, 2014 8:30:00 PM", 
"Jun 18, 2014 9:30:00 PM", 
"Jun 18, 2014 10:30:00 PM", 
"Jun 18, 2014 11:30:00 PM", 
"Jun 18, 2014 12:45:00 PM", 
"Jun 18, 2014 2:45:00 PM", 
"Jun 18, 2014 3:45:00 PM", 
"Jun 18, 2014 4:45:00 PM", 
"Jun 18, 2014 9:45:00 PM", 
"Jun 18, 2014 11:45:00 PM" 
) 

例如,为什么会“2014年6月18日上午12点15分00秒”,显示“2014年6月18日1:00:00 AM”之后?我只是没有得到这部分!

这里是我的代码:

-(void)sortDates { 
NSDateFormatter *dateFormatter; 

dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MMM dd, yyyy HH:mm:ss a"]; 

NSLog(@"%@", xAxisDataWithDate); 
NSArray *sortedTimes = [xAxisDataWithDate sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) 
{ 
    NSDate *date1 = [dateFormatter dateFromString:obj1]; 
    NSDate *date2 = [dateFormatter dateFromString:obj2]; 
    return [date1 compare:date2]; 
}]; 
NSLog(@"sorted dates = %@", sortedTimes); 
} 

我还写了一个示例程序包含这些日期的一个子集,它似乎给我错误的结果时1:00:00 AM。是数组中存在的( 1:00:00 AM。应该被存储之后12:00:00 AM):

-(void)sortDates { 
NSDateFormatter *dateFormatter; 

dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MMM dd, yyyy HH:mm:ss a"]; 

NSMutableArray *times = [[NSMutableArray alloc]initWithObjects:@"Jun 19, 2014 11:45:00 PM", @"Jun 18, 2014 1:00:00 AM", @"Jun 18, 2014 12:15:00 AM",@"Jun 18, 2014 12:00:00 AM", nil]; 
NSArray *sortedTimes = [times sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) 
{ 
    NSDate *date1 = [dateFormatter dateFromString:obj1]; 
    NSDate *date2 = [dateFormatter dateFromString:obj2]; 
    return [date1 compare:date2]; 
}]; 
NSLog(@"sorted dates = %@", sortedTimes); 
} 

输出:

sorted dates = (
"Jun 18, 2014 1:00:00 AM", 
"Jun 18, 2014 12:00:00 AM", 
"Jun 18, 2014 12:15:00 AM", 
"Jun 19, 2014 11:45:00 PM" 
) 

我无法弄清楚为什么我失序的结果w.r.t NSMutableArray * xAxisDataWithDate和w.r.t NSMutableArray *次!请在这方面帮助我!赞赏。

+0

由于您在AM/PM中使用1-12,因此您应该使用“hh”作为小时。 “HH”是0-23。另外,一定要将日期格式的语言环境设置为某种标准语言环境(可能是'[[NSLocale alloc] initWithLocaleIdentifier:@“en_US”]'),而不是让它接收系统区域设置,因为这会变化。所有这些说,你应该使用日期对象来开始,而不是字符串。 –

+0

此外,请尝试记录您的格式化程序给出的两个字符串的'NSDate'对象,这些对象最终会相对于彼此错误地进行排序。看看它是如何解释这些字符串的。 –

+0

谢谢你肯。这对我有用!非常感谢您的帮助。 – Rahul

回答

0

你似乎有一个错误的格式,时间显示为12小时格式,更改格式MMM dd, yyyy hh:mm:ss alowercase "h"

"Jun 18, 2014 12:00:00 AM", 
"Jun 18, 2014 12:15:00 AM", 
"Jun 18, 2014 1:00:00 AM", 
"Jun 19, 2014 11:45:00 PM" 

更重要的是,你应该字符串转换为日期之前相比,sortedArray…因此您将字符串转换为日期n log n次而不是n

+1

谢谢Sasha。 – Rahul