【问题标题】:how to sort array of dates in ascending order in ios如何在ios中按升序对日期数组进行排序
【发布时间】:2016-09-03 08:36:43
【问题描述】:

我有一个 NSMutableArray,其中包含字符串格式的日期。在这里,我需要按日期升序对该数组进行排序。我使用了强文本

 NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
 NSArray *descriptors=[NSArray arrayWithObject: descriptor];
 NSArray *reverseOrder=[dateArray sortedArrayUsingDescriptors:descriptors];

但它只按照日期和月份的升序对日期进行排序。不考虑年份。请帮我。 例如,数组包含

 03/09/2017, 03/06/2016, 01/06/2016,01/04/2016 and 03/01/2017.

使用上面几行代码后,Array中包含like,

 01/04/2018, 01/06/2016, 03/01/2017, 03/06/2016, 03/09/2016

【问题讨论】:

  • 你的日期格式为 mm/dd 或 dd/mm

标签: ios objective-c nsdate


【解决方案1】:

您需要像这样使用sortedArrayUsingComparator 来使用字符串数组对日期进行排序。

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"MM/dd/yyyy"];
NSArray *sortedArray = [yourArray sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
    NSDate *d1 = [df dateFromString: obj1];
    NSDate *d2 = [df dateFromString: obj2];
    return [d1 compare: d2];
}];

注意:设置日期格式根据您的日期,很难从您的示例中断言日期格式这就是我使用MM/dd/yyyy的原因,如果您的日期包含格式dd/MM/yyyy然后使用那个。

【讨论】:

  • 对不起,我已经使用了这个代码,但我仍然没有得到正确的解决方案
  • 感谢您的回复。
  • 你能告诉我日期的格式是 dd/MM 还是 MM/dd?
  • 对不起,这是我的错。而你的答案是正确的。非常感谢
【解决方案2】:

您的代码正确,但日期格式错误。

试试这个代码:

NSMutableArray *dateArray = [[NSMutableArray alloc] initWithArray: @[@"03/09/2017", @"03/06/2016", @"01/06/2016",@"01/04/2016", @"03/01/2017"]];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSDate *date;
for (int i = 0; i < dateArray.count; i++) {
    [formatter setDateFormat:@"MM/dd/yyyy"];  // Please your date format set.
    date = [formatter dateFromString:[dateArray objectAtIndex:i]];
    [formatter setDateFormat:@"yyyy/MM/dd"];
    [dateArray replaceObjectAtIndex:i withObject:[formatter stringFromDate:date]];
}
NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
NSArray *descriptors=[NSArray arrayWithObject: descriptor];
NSArray *reverseOrder=[dateArray sortedArrayUsingDescriptors:descriptors];

NSLog(@"Array: %@",reverseOrder);

【讨论】:

    【解决方案3】:

    请尝试以下代码:

    NSArray *strDateArray = [[NSArray alloc] initWithObjects:@"03/09/2017",@"03/06/2016", @"01/06/2016",@"01/04/2016",@"03/01/2017", nil];
    
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"MM/dd/yyyy"];
    
        NSMutableArray *dateArray = [[NSMutableArray alloc] init];
    
        for (NSString *dateString in strDateArray) {
            NSDate *date = [formatter dateFromString:dateString];
            [dateArray addObject:date];
        }
    
        // sort array of dates
        [dateArray sortUsingComparator:^NSComparisonResult(NSDate *date1, NSDate *date2) {
            // return date1 compare date2 for ascending. And reverse the call for ascending.
            return [date1 compare:date2];
        }];
    
        NSLog(@"dateArray %@", dateArray);
        NSMutableArray *sortedDateArray = [[NSMutableArray alloc] init];
    
        for (NSDate *date in dateArray) {
            NSString *dateString = [formatter stringFromDate:date];
            [sortedDateArray addObject:dateString];
        }
    
        NSLog(@"sortedDateArray %@", sortedDateArray);
    

    【讨论】:

      【解决方案4】:

      对于 Swift 4.0

      let formater = DateFormatter()
          formater.dateFormat = "MM/dd/yyyy" //date formate should be according to your date formate
          let sortedArray=arrayToSort.sorted(){
              (obj1, obj2) in
              let date1=formater.date(from: obj1)
              let date2=formater.date(from: obj2)
              return date1!<date2!
          }
      

      【讨论】:

        【解决方案5】:

        //可以根据自己的代码更改日期格式

        NSDateFormatter *df = [[NSDateFormatter alloc] init];
                              [df setDateFormat:@"MM/dd/yyyy"];
        
        NSArray *sortedArray = [YourArraysortedArrayUsingComparator:^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2)
        {
            NSString *strDateObj1  = [NSString stringWithFormat:@"%@",[obj1 valueForKey:@"BirthDate"]];
            NSString *strDateObj2  = [NSString stringWithFormat:@"%@",[obj2 valueForKey:@"BirthDate"]];
            NSDate *d1 = [df dateFromString: strDateObj1];
            NSDate *d2 = [df dateFromString: strDateObj2];
            return [d1 compare: d2];
        }];
        
        NSLog(@"%@", sortedArray)
        

        【讨论】:

          猜你喜欢
          • 2011-11-22
          • 2018-06-14
          • 1970-01-01
          • 2016-11-07
          • 1970-01-01
          • 2013-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多