timeElapsed static method

String timeElapsed(
  1. dynamic dateTime, {
  2. String? inDay,
  3. String? inHour,
  4. String? inMinute,
  5. String justNow = 'just now',
})
String timeElapsed = Mixins.timeElapsed('2021-02-24 11:12:30', inDay: 'day ago');
// put value with String or DateTime only
// only for 1 month calculation

Implementation

static String timeElapsed(dynamic dateTime,
    {String? inDay,
    String? inHour,
    String? inMinute,
    String justNow = 'just now'}) {
  try {
    Duration compare(DateTime x, DateTime y) => Duration(
        microseconds:
            (x.microsecondsSinceEpoch - y.microsecondsSinceEpoch).abs());

    DateTime date = dateTime is String ? DateTime.parse(dateTime) : dateTime;

    DateTime x = DateTime.now();
    DateTime y = DateTime(
        date.year, date.month, date.day, date.hour, date.minute, date.second);

    Duration diff = compare(x, y);
    String h = '${date.hour}'.padLeft(2, '0'),
        m = '${date.minute}'.padLeft(2, '0'),
        s = '${date.second}'.padLeft(2, '0');

    String dateTimeStr =
        '${date.year}-${'${date.month}'.padLeft(2, '0')}-${'${date.day}'.padLeft(2, '0')} $h:$m:$s';

    // if init value more then current time
    if (y.millisecondsSinceEpoch > x.millisecondsSinceEpoch) {
      return '-';
    }

    String textInDay(int value) =>
        inDay ?? (value > 1 ? 'days ago' : 'day ago');
    String textInHour(int value) =>
        inHour ?? (value > 1 ? 'hours ago' : 'hour ago');
    String textInMinute(int value) =>
        inMinute ?? (value > 1 ? 'minutes ago' : 'minute ago');

    if (diff.inSeconds >= 60) {
      if (diff.inMinutes >= 60) {
        if (diff.inHours >= 24) {
          return diff.inDays > 31
              ? dateTimeStr
              : '${diff.inDays} ${textInDay(diff.inDays)}';
        } else {
          return '${diff.inHours} ${textInHour(diff.inHours)}';
        }
      } else {
        return '${diff.inMinutes} ${textInMinute(diff.inMinutes)}';
      }
    } else {
      return justNow;
    }
  } catch (e) {
    rethrow;
  }
}