timeRemaining method
Formats date as '2 hours to go' or '2 days to go' or '2 minutes overdue' etc.
- If
dueDateis in the future, it returns the time remaining until thedueDate. - If
dueDateis in the past, it returns the time since thedueDate. - If
dueDateis 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();
}