如何从数组中对日期进行分组?



我的日期格式是"2019-12-03T05:58:11.317Z",就像这样。我想对相同的日期元素进行分组。我可以根据日期创建UITableView部分。这是数组,我有三个不同的日期,所以我想创建 3 个部分。这里的问题是newArrayList没有保存所有元素。

NSMutableArray * arrayList;
NSMutableArray *newArrayList;
//This is my date array
arrayList = [[NSMutableArray alloc] initWithObjects:@“2019-12-03T05:58:11.317Z”, @“2019-12-03T05:58:10.317Z”, @“2019-12-03T05:58:01.317Z”, @“2019-12-03T05:55:12.448Z”, @“2019-12-03T05:48:11.317Z”, @“2019-12-03T05:28:11.317Z”, @“2019-12-03T05:11:24.004Z”, @“2019-12-03T05:28:11.317Z”, @“2019-12-03T05:55:12.965Z”, @“2019-12-02T15:09:35.408Z”, @“2019-12-02T15:09:38.187Z”, @“2019-12-02T15:43:02.118Z”, @“2019-12-02T15:44:09.344Z”, @“2019-12-02T17:07:55.038Z”, @“2019-12-02T16:42:16.649Z”, @“2019-12-01T16:42:16.649Z”, nil];
newArrayList = [[NSMutableArray alloc]init];//Here I want to same date elements 
NSDate *fromDate;
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
for (int i=0; i<arrayList.count; i++) {
NSDate *dt1 = fromDate;
NSDate *dt2 = [self getLocalDateTimeFromUTC2:[arrayList objectAtIndex:i]];
if (i != 0) {
if ([self isSameDay:dt1 otherDay:dt2] == YES) {
[tempArray addObject:t];
} else {
[newArrayList addObject:tempArray];
//  [tempArray removeAllObjects];
}
}
fromDate = dt2;
}
//To get required date formate
-(NSDate *)getLocalDateTimeFromUTC2:(NSString *)strDate
{
// create dateFormatter with UTC time format
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZ"]; //@"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZ"
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
//    NSLog(@"%@", t.dateAndTime); //2019-12-02T15:09:38.187Z
NSDate *date = [dateFormatter dateFromString:strDate]; // create date from string
// change to a readable time format and change to local time zone
[dateFormatter setDateFormat:@"dd-MM-yyyy"];
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
NSString *timestamp = [dateFormatter stringFromDate:date];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"dd-MM-yyyy"];
[dateFormat setTimeZone:[NSTimeZone localTimeZone]];
NSDate *date2 = [dateFormat dateFromString:timestamp];
//    NSLog(@"%@", date2);
return date2;
}
//To compare two dates
- (BOOL)isSameDay:(NSDate*)date1 otherDay:(NSDate*)date2 {
NSCalendar* calendar = [NSCalendar currentCalendar];
unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay;
NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date1];
NSDateComponents* comp2 = [calendar components:unitFlags fromDate:date2];
return [comp1 day]   == [comp2 day] && [comp1 month] == [comp2 month] && [comp1 year]  == [comp2 year];
}

试试这个:

NSMutableDictionary *dictByDate = [NSMutableDictionary new];
NSMutableArray *newArr = [NSMutableArray new] ;
for(NSString *strDate in arrayList)
{
// convert date to proper formate (if needed)
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZ"];
NSDate *dateNew = [format dateFromString:strDate];
[format setDateFormat:@"MMMM-dd-yyyy"];
NSString *finalDateString = [format stringFromDate:dateNew];
NSLog(@"%@",finalDateString) ;
NSMutableArray *arrWithSameDate = dictByDate[finalDateString];
if(! arrWithSameDate)
{
arrWithSameDate = [NSMutableArray new];
dictByDate[finalDateString] = arrWithSameDate;
}
[arrWithSameDate addObject: strDate];
}
[newArr addObjectsFromArray:[dictByDate allValues]] ;
NSLog(@"group data: %@", newArr);

我正在快速做,希望你能在 obj-c 中管理


  1. 假设您有以下数据

    let arrDates = [  "2019-12-03T05:58:11.317Z ",   "2019-12-03T05:58:10.317Z ",   "2019-12-03T05:58:01.317Z ",   "2019-12-03T05:55:12.448Z ",   "2019-12-03T05:48:11.317Z ",   "2019-12-03T05:28:11.317Z ",   "2019-12-03T05:11:24.004Z ",   "2019-12-03T05:28:11.317Z ",   "2019-12-03T05:55:12.965Z ",   "2019-12-02T15:09:35.408Z ",   "2019-12-02T15:09:38.187Z ",   "2019-12-02T15:43:02.118Z ",   "2019-12-02T15:44:09.344Z ",   "2019-12-02T17:07:55.038Z ",   "2019-12-02T16:42:16.649Z ",   "2019-12-01T16:42:16.649Z "]
    
  2. 制作日期组

    let dictGroupDate = Dictionary(grouping: arrDates) { (strdate) -> String in
    let df = DateFormatter()
    df.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZ"
    let date = df.date(from: strdate)
    df.dateFormat = "yyyy-MM-dd"
    return df.string(from: date!)
    }
    
  3. 获取所有部分日期并对其进行排序

    let arrDateKey = Array(dictGroupDate.keys).sorted { (strdate1, strdate2) -> Bool in
    let df = DateFormatter()
    df.dateFormat = "yyyy-MM-dd"
    let date1 = df.date(from: strdate1)
    let date2 = df.date(from: strdate2)
    return date1!.compare(date2!)  == .orderedAscending
    }
    
  4. 对每个日期的时间进行排序并创建新字典

    var newGroupedDates = [String : [String]]()
    for strKey in arrDateKey {
    let sortedTime = dictGroupDate[strKey]?.sorted(by: { (strdate1, strdate2) -> Bool in
    let df = DateFormatter()
    df.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZ"
    let date1 = df.date(from: strdate1)
    let date2 = df.date(from: strdate2)
    return date1!.compare(date2!)  == .orderedAscending
    })
    newGroupedDates[strKey] = sortedTime!
    }
    
  5. UITABLEVIEW显示数据

    // NumberOfSections
    arrDateKey.count
    //NumberOfRows
    let key = arrDateKey[indexPath.section]
    newGroupedDates[key]?.count
    // CellForRow
    // To get correct date and Time
    let key = arrDateKey[indexPath.section]
    let item = newGroupedDates[key]![indexPath.row]
    // Now item is the date string, and do whatever you wanted to do.
    

输出

最终新分组日期

["2019-12-03": ["2019-12-03T05:11:24.004Z ", "2019-12-03T05:28:11.317Z ", "2019-12-03T05:28:11.317Z ", "2019-12-03T05:48:11.317Z ", "2019-12-03T05:55:12.448Z ", "2019-12-03T05:55:12.965Z ", "2019-12-03T05:58:01.317Z ", "2019-12-03T05:58:10.317Z ", "2019-12-03T05:58:11.317Z "], "2019-12-02": ["2019-12-02T15:09:35.408Z ", "2019-12-02T15:09:38.187Z ", "2019-12-02T15:43:02.118Z ", "2019-12-02T15:44:09.344Z ", "2019-12-02T16:42:16.649Z ", "2019-12-02T17:07:55.038Z "], "2019-12-01": ["2019-12-01T16:42:16.649Z "]]

万一,我错过了什么,然后评论我。

一些注意事项: 1(不要将日期保留为字符串,原因有很多: a( 日期使用较少的内存 b( 您可以使用 but 在考虑时区和跳跃的函数中进行比较和排序。

2(不要在每个地方创建格式化程序(即将热量从for中取出( 根据苹果:

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW10

相关内容

  • 没有找到相关文章

最新更新