【问题标题】:How to sort Array of dates? [duplicate]如何对日期数组进行排序? [复制]
【发布时间】:2013-06-04 11:33:25
【问题描述】:

我在下面的数组中有一个日期,我想对其进行排序。

 NSMutableArray *arrDates =[[NSMutableArray alloc]init];
[arrDates addObject:@"24/01/2010"];
[arrDates addObject:@"15/05/2014"];
[arrDates addObject:@"04/03/2011"];
[arrDates addObject:@"30/05/2013"];
[arrDates addObject:@"11/10/2012"];

我尝试使用下面的代码,但没有得到我应该在这里完全作为 Key 传递的内容。

NSSortDescriptor *sortDis = [[NSSortDescriptor alloc] initWithKey:????? ascending:TRUE];
[arr sortUsingDescriptors:[NSArray arrayWithObject:sortDis]];

我通过了self,但它的排序仅基于日期(天)。

我想显示如下结果

24/01/2010
04/03/2011
11/10/2012
30/05/2013
15/05/2014

我也尝试过以下行

[arrDates sortUsingSelector:@selector(compare:)];

但没用。请帮忙。

【问题讨论】:

  • 它们不是日期。首先将字符串转换为日期。
  • like for (NSString *strDate in arrDates) { NSDateFormatter *formatter=[NSDateFormatter new]; [格式化程序 setDateFormat:@"dd/MM/yyyy"]; NSDate *date=[格式化程序 dateFromString:strDate]; [arr 添加对象:日期]; }

标签: iphone ios objective-c


【解决方案1】:

使用适当的类型存储您的数据,日期为NSDate,然后您可以使用:

NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(NSDate *date1, NSDate *date2) {
    return [date1 compare:date2];
}];

假设arrayNSArrayNSDate 对象。

【讨论】:

  • +1 最有效的答案:)
  • 还有几行代码。
  • +1 @trojanfoe,这是最好的答案。如果我有 100 个 obj,那么在这种情况下它会变慢吗?
  • 即使你有 "...OVER 10 000!!!!" 这也不会慢
  • 我不明白为什么日期格式更改为 2009-10-01 这种格式?
【解决方案2】:

试试

NSMutableArray *arrDates =[[NSMutableArray alloc]init];
[arrDates addObject:@"24/01/2010"];
[arrDates addObject:@"15/05/2014"];
[arrDates addObject:@"04/03/2011"];
[arrDates addObject:@"30/05/2013"];
[arrDates addObject:@"11/10/2012"];

NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:@"dd/MM/yyyy"];
[arrDates sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSDate *date1 = [dateFormatter dateFromString:obj1];
    NSDate *date2 = [dateFormatter dateFromString:obj2];
    return [date1 compare:date2];
}];

【讨论】:

  • 那里进行了大量的转换,效率不高。在此之前将字符串转换为日期有什么问题?毫无疑问,每当必须呈现或进一步处理数组时,它都会很有用。
  • @trojanfoe 我只是建议了一个特定于需求的解决方案。如果可以的话,我永远不会将 dateString 存储为 NSDate 实例。感谢您的建议。
  • 这是正确的答案
  • @SamBudda 谢谢你的好话。但是另一个答案被接受了,因为它有另一种更有效地做同样事情的方法。如果日期存储为字符串,则无论何时使用都需要进行转换。我的更具体的是对当前的 dateStrings 数组进行排序:)
  • 带有标记答案的问题是,当显然 OP 正在存储字符串时,它假设数组具有 nsdate 对象。仅仅因为字符串看起来像日期并不意味着 iOS 知道它们是日期。我过去做过这种事情,根据 OPs 的问题,你的方式是正确的
【解决方案3】:

您需要将它们添加为 NSDate 对象,为此使用:

NSString *dateString = @"01/02/2010";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSDate *dateFromString = [[NSDate alloc] init];
dateFromString = [dateFormatter dateFromString:dateString];
[dateFormatter release];

一旦数组包含 NSDates,它将被正确排序

或者如果你不想存储 NSDates,当你比较它时,将它们转换为日期并比较它们

【讨论】:

    【解决方案4】:

    将日期存储为 NS(Mutable)Array 中的 NSDate 对象,然后使用 [NSArray sortedArrayUsingSelector:[NSMutableArray sortUsingSelector: 并将 @selector(compare:) 作为参数传递。 -[NSDate compare:] 方法将为您按升序排列日期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 2020-01-31
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多