relativeTimeString function
Returns a relative time string: "2 hours ago", "in 3 days", "just now".
clock defaults to DateTime.now. English only.
Implementation
String relativeTimeString(DateTime dateTime, {DateTime? clock}) {
final DateTime now = clock ?? DateTime.now();
final Duration diff = dateTime.difference(now);
final int sec = diff.inSeconds.abs();
final int min = diff.inMinutes.abs();
final int hour = diff.inHours.abs();
final int day = diff.inDays.abs();
final bool isPast = diff.isNegative;
final String suffix = isPast ? _kSuffixAgo : '';
final String prefix = isPast ? '' : _kPrefixIn;
if (sec < 60) return isPast ? _kJustNow : _kInAMoment;
if (min < 60) return '$prefix$min ${_relativeUnit(min, _kMinute, _kMinutes)}$suffix';
if (hour < 24) return '$prefix$hour ${_relativeUnit(hour, _kHour, _kHours)}$suffix';
if (day == 1) return isPast ? _kYesterday : _kTomorrow;
if (day < 7) return '$prefix$day $_kDays$suffix';
// Coarse buckets use fixed divisors (7/30/365) rather than true calendar
// arithmetic: output is intentionally approximate ("about 2 months"), so
// exact month lengths and leap years are not worth the added complexity.
final int weeks = (day / 7).floor();
if (day < 30) return '$prefix$weeks ${_relativeUnit(weeks, _kWeek, _kWeeks)}$suffix';
final int months = (day / 30).floor();
if (day < 365) return '$prefix$months ${_relativeUnit(months, _kMonth, _kMonths)}$suffix';
final int years = (day / 365).floor();
return '$prefix$years ${_relativeUnit(years, _kYear, _kYears)}$suffix';
}