【发布时间】:2014-06-22 06:02:38
【问题描述】:
我有一个数组,其中包含一组时间戳(作为字符串),并且它们按排序顺序排列。我只想再次对它们进行排序,看看是否返回了相同的列表(原因是我将处理乱序存储的进一步时间戳,并且需要对它们进行排序)。这是我的日期数组,其中时间戳基本上是字符串:
(
"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”之后?我只是不明白这部分!
这是我的代码:
-(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"
)
我无法弄清楚为什么我的结果与 NSMutableArray *xAxisDataWithDate 和 w.r.t NSMutableArray *times 不一致!请在这方面帮助我!赞赏。
【问题讨论】:
-
你应该使用“hh”来表示小时,因为你在上午/下午使用 1-12。 “HH”代表 0-23。此外,请务必将日期格式的语言环境设置为某些标准语言环境(可能是
[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]),而不是让它选择系统语言环境,因为这会有所不同。综上所述,您可能应该使用日期对象而不是字符串开头。 -
另外,尝试记录您的格式化程序为两个字符串提供的
NSDate对象,这些字符串最终相对于彼此排序不正确。看看它是如何解释这些字符串的。 -
谢谢肯。这对我有用!非常感谢您的帮助。
标签: ios iphone objective-c nsdate nsdateformatter