【问题标题】:How to sort the Array that contains date in strings in descending order? [duplicate]如何按降序对字符串中包含日期的数组进行排序? [复制]
【发布时间】:2013-08-27 10:18:12
【问题描述】:

我想按降序对包含日期字符串的数组进行排序,我已经尝试过 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”代替了月份,而且日期格式也不像我指定的格式。

【问题讨论】:

  • MM/DD/YYYY 日期格式错误,请使用MM/dd/yyyy。见unicode.org/reports/tr35/tr35-25.html#Date_Field_Symbol_Table
  • @rckoenes 是对的。你到底是在哪里排序的?
  • @rckoenes 是的,我做了这个改变,但我仍然得到相同的输出。
  • 看我的回答。在您的代码中,您实际上并没有对任何内容进行排序。如果你想要一个数组按特定顺序排序,你必须实际排序它。
  • 阅读一下 NSArray 的规范吧?

标签: ios iphone objective-c nsdate nsdateformatter


【解决方案1】:

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

你应该做这样的事情......

// 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。无论如何,您可以使用 sortedArrayUsingSelector:@selector(compare:)]; 将其缩短一点
  • 谢谢。您不能使用compare: 进行降序:) 我编辑了。对于下降,您需要反转比较调用。或者您可以使用compare: 进行排序,然后反转整个数组。
  • 抱歉,我错过了降序部分。你是对的。
  • 我也错过了它。但后来编辑了。在我意识到之前打算改用你的方法。
  • @Fogmeister 我得到这样的输出 ""2012-12-04 18:30:00 +0000", "2012-01-11 18:30:00 +0000", "2011 -07-13 18:30:00 +0000”、“2011-01-25 18:30:00 +0000”、“2008-12-22 18:30:00 +0000”、“2007-10-03 18 :30:00 +0000”、“2007-08-16 18:30:00 +0000”、“2007-03-18 18:30:00 +0000”、“2006-12-05 18:30:00 + 0000”、“2006-10-30 18:30:00 +0000”、“2006-02-23 18:30:00 +0000”、“2005-02-08 18:30:00 +0000””我需要只有月、日和年,格式为 MM/DD/YYYY。
【解决方案2】:

试试

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

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

【讨论】:

    【解决方案3】:

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

    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,但我想对于小型数据集,这种方法会很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多