Home > OS >  How to mark latest datetime from the list of multiple same day dates
How to mark latest datetime from the list of multiple same day dates

Time:10-13

Json list -

[
  {
    "date": "2022-10-10T09:53:40.835519 05:30",
    "value": 10
  },
  {
    "date": "2022-10-13T09:53:40.835519 05:30",
    "value": 12
  },
  {
    "date": "2022-10-13T10:53:40.835519 05:30",
    "value": 15
  },
   {
    "date": "2022-10-15T10:53:40.835519 05:30",
    "value": 20
  }
]

in above list if there are multiple dateTimes for same day ( ex. 2022-10-13 ) so how to mark 2022-10-13T10:53 date in object list as isLatestDateForSameDay=true as 2022-10- 13T10:53 is latest compare to 2022-10-13T09:53.

and if there is only one dateTime then it should also marked as isLatestDateForSameDay=true ex. (2022-10-10T09:53:40.835519 05:30 and 2022-10-15T10:53:40.835519 05:30)

DataListItem class -

class DataListItem {
  String date;
  int value;
  bool isLatestDate;

  DataListItem({
    required this.date,
    required this.value,
    this.isLatestDateForSameDay = false,
  });
}

Expected list of Objects -

[
  DataListItem(date: '2022-10-10T09:53:40.835519 05:30', value: 10, isLatestDateForSameDay: true),
  DataListItem(date: '2022-10-13T09:53:40.835519 05:30', value: 12, isLatestDateForSameDay: false),
  DataListItem(date: '2022-10-13T10:53:40.835519 05:30', value: 15, isLatestDateForSameDay: true),
  DataListItem(date: '2022-10-15T10:53:40.835519 05:30', value: 20, isLatestDateForSameDay: true),
];

CodePudding user response:

Lets assume your json is jsonData with collection package you can get what you want:

var grouped = groupBy(
  jsonData,
  (Map item) => (item['date'] as String).substring(0, 10),
);
List<DataListItem> result = [];

for (var element in grouped.entries) {
  if (element.value.length == 1) {
    result.add(DataListItem(
        date: element.value.first['date'] as String,
        value: element.value.first['value'] as int,
        isLatestDate: true));
  } else {
    var latesItem = findLatestDate(element.value);

    element.value.remove(latesItem);
    result.add(DataListItem(
        date: latesItem['date'] as String,
        value: latesItem['value'] as int,
        isLatestDate: true));
    element.value.forEach((e) => result.add(DataListItem(
        date: e['date'] as String,
        value: e['value'] as int,
        isLatestDate: false)));
  }
}

Map<String, dynamic> findLatestDate(List<Map<String, dynamic>> dateList) {
    Map<String, dynamic>? result;
    for (var element in dateList) {
      if (result == null) {
        result = element;
      } else {
        DateTime resultDate =
            DateFormat("yyyy-MM-ddThh:mm:ss").parse(result['date'] as String);
        DateTime tempDate =
            DateFormat("yyyy-MM-ddThh:mm:ss").parse(element['date'] as String);

        if (tempDate.isAfter(resultDate)) {
          result = element;
        }
      }
    }
    return result!;
  }

for (var element in result) {
  print("result= ${element.date} ${element.value} ${element.isLatestDate}");

  // result= 2022-10-10T09:53:40.835519 05:30 10 true
  // result= 2022-10-13T10:53:40.835519 05:30 15 true
  // result= 2022-10-13T09:53:40.835519 05:30 12 false
  // result= 2022-10-15T10:53:40.835519 05:30 20 true
}

also use intl for DateFormat.

CodePudding user response:

Try sorting the list with DateTime.parse()

 List<DataListItem> dataListItemlist = [];

  list.sort(
    (a, b) {
      return DateTime.parse(a["date"]).compareTo(DateTime.parse(b["date"]));
    },
  );

  List<String> repeatedDate = [];
  for (var i = list.length - 1; i >= 0; i--) {
    Map item = list[i];
    DateTime date = DateTime.parse(item["date"]);
    int day = date.day;
    int month = date.month;
    int year = date.year;
    String formatedDate = "$day-$month-$year";
    if (repeatedDate.contains(formatedDate)) {
      dataListItemlist.add(
        DataListItem(
          date: item["date"],
          value: item["value"],
          isLatestDateForSameDay: false,
        ),
      );
    } else {
      dataListItemlist.add(
        DataListItem(
          date: item["date"],
          value: item["value"],
          isLatestDateForSameDay: true,
        ),
      );
      repeatedDate.add(formatedDate);
    }
  }

  • Related