Home > Software design >  how to get time difference in flutter?
how to get time difference in flutter?

Time:12-14

I want to get time difference like -

'2h 28mins ago', 'a few seconds ago', 'a few mins ago','1 min ago', '6h ago','a day ago','a week ago', 'a few months ago'

I get event occured time as DateTime object. I can get current time with DateTime.now() I want to calculate the difference between this 2 times. I'm currently doing this using many lines of if else statements like this...

if (now.year > date.year) {
      //months ago
      if ((12 - date.month)   now.month > 11) {
        return "a year ago";
      } else if ((12 - date.month)   now.month > 1) {
        return "${(12 - date.month)   now.month} months ago";
      } else if ((12 - date.month)   now.month == 1) {
        if ((getDateCountForMonth(date.month) - date.day)   now.day > 13) {
          return "a few weeks ago";
        }
...}}

Is there a better and simple way to do this? I want to output like this - '2h 28mins ago', 'a few seconds ago', 'a few mins ago','1 min ago', '6h ago','a day ago','a week ago', 'a few months ago'

CodePudding user response:

Lets say the selected date is

DateTime date = DateTime(2022, 9, 7, 17, 30);

you can calculate the difference by calling difference on DateTime format like this:

date.difference(DateTime.now());

and you can get this difference in many format like in days, inHours, in inMinutes ,... :

var days = date.difference(DateTime.now()).inDays;

and with this the calculation may get easier.

if (days > 365) {
 //years ago
} else if (days < 365 && days > 31)  {
 // month ago
} else {
 ...
}

CodePudding user response:

I had created a function to calculate the difference for a project in past, you can make use of this function. Just call it by passing the DateTime string of which you want to compare with current timing:

String getComparedTime(String dateTime) {
    Duration difference = DateTime.now().difference(DateTime.parse(dateTime));
    final List prefix = [
      "just now",
      "second(s) ago",
      "minute(s) ago",
      "hour(s) ago",
      "day(s) ago",
      "month(s) ago",
      "year(s) ago"
    ];
    if (difference.inDays == 0) {
      if (difference.inMinutes == 0) {
        if (difference.inSeconds < 20) {
          return (prefix[0]);
        } else {
          return ("${difference.inSeconds} ${prefix[1]}");
        }
      } else {
        if (difference.inMinutes > 59) {
          return ("${(difference.inMinutes / 60).floor()} ${prefix[3]}");
        } else {
          return ("${difference.inMinutes} ${prefix[2]}");
        }
      }
    } else {
      if (difference.inDays > 30) {
        if (((difference.inDays) / 30).floor() > 12) {
          return ("${((difference.inDays / 30) / 12).floor()} ${prefix[6]}");
        } else {
          return ("${(difference.inDays / 30).floor()} ${prefix[5]}");
        }
      } else {
        return ("${difference.inDays} ${prefix[4]}");
      }
    }
  }

CodePudding user response:

String timeAgo({bigDate, smallDate, bool numericDates = false}) {
  final difference = bigDate.difference(smallDate);
  if ((difference.inDays / 7).floor() >= 1) {
    return (numericDates) ? '1 week ago' : 'Last week';
  } else if (difference.inDays >= 2) {
    return '${difference.inDays} days ago';
  } else if (difference.inDays >= 1) {
    return (numericDates) ? '1 day ago' : 'Yesterday';
  } else if (difference.inHours >= 2) {
    return '${difference.inHours} hours ago';
  } else if (difference.inHours >= 1) {
    return (numericDates) ? '1 hour ago' : 'An hour ago';
  } else if (difference.inMinutes >= 2) {
    return '${difference.inMinutes} minutes ago';
  } else if (difference.inMinutes >= 1) {
    return (numericDates) ? '1 minute ago' : 'A minute ago';
  } else if (difference.inSeconds >= 3) {
    return '${difference.inSeconds} seconds ago';
  } else {
    return 'Just now';
  }
}

/// and use like

String date = timeAgo(smallDate: DateTime(2022, 12, 14, 10, 00), bigDate: DateTime(2022, 12, 14, 12, 00),);
print('difference between to dates: $date');
  • Related