timeRemaining method

String timeRemaining({
  1. String beforeDueDate = 'from now',
  2. String afterDueDate = 'overdue',
  3. DateTime? targetDate,
})

Formats date as '2 hours to go' or '2 days to go' or '2 minutes overdue' etc.

  • If dueDate is in the future, it returns the time remaining until the dueDate.
  • If dueDate is in the past, it returns the time since the dueDate.
  • If dueDate is not provided, it uses this date.

Example:

final futureDate = DateTime.now().add(const Duration(hours: 2));
final text = futureDate.timeRemaining();
// returns: '2 hours from now'

Implementation

String timeRemaining({
  String beforeDueDate = 'from now',
  String afterDueDate = 'overdue',
  DateTime? targetDate,
}) {
  // get the difference between dates
  final d = (targetDate ?? this).difference(
    DateTime.now(),
  );

  final weeks = d.inDays ~/ 7;
  final days = d.inDays;
  final hrs = d.inHours;
  final mins = d.inMinutes;
  final secs = d.inSeconds;

  final absWeeks = weeks.abs();
  final absDays = days.abs();
  final absHrs = hrs.abs();
  final absMins = mins.abs();
  final absSecs = secs.abs();

  String value;

  // ////////////////////////////////////
  // Time is not due yet
  // ////////////////////////////////////
  if (weeks > 0) {
    value = '$weeks week${weeks > 1 ? 's' : ''} $beforeDueDate';
  } else if (days > 0) {
    value = '$days day${days > 1 ? 's' : ''} $beforeDueDate';
  } else if (hrs > 0) {
    value = '$hrs hour${hrs > 1 ? 's' : ''} $beforeDueDate';
  } else if (mins > 0) {
    value = '$mins minute${mins > 1 ? 's' : ''} $beforeDueDate';
  } else if (secs > 0) {
    value = '$secs second${secs > 1 ? 's' : ''} $beforeDueDate';
  }
  // ////////////////////////////////////
  // Time is overdue
  // ////////////////////////////////////
  else if (weeks < 0) {
    value = '$absWeeks week${absWeeks > 1 ? 's' : ''} $afterDueDate';
  } else if (days < 0) {
    value = '$absDays day${absDays > 1 ? 's' : ''} $afterDueDate';
  } else if (hrs < 0) {
    value = '$absHrs hour${absHrs > 1 ? 's' : ''} $afterDueDate';
  } else if (mins < 0) {
    value = '$absMins minute${absMins > 1 ? 's' : ''} $afterDueDate';
  } else {
    value = '$absSecs second${absSecs > 1 ? 's' : ''} $afterDueDate';
  }

  return value.trim();
}