relativeTimeString function

String relativeTimeString(
  1. DateTime dateTime, {
  2. DateTime? clock,
})

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';
}