relativeTime function

String relativeTime(
  1. DateTime? date, {
  2. DateTime? reference,
  3. RelativeTimeConfig config = const RelativeTimeConfig(),
})

Implementation

String relativeTime(
  DateTime? date, {
  DateTime? reference,
  RelativeTimeConfig config = const RelativeTimeConfig(),
}) {
  if (date == null) return '';

  final now = reference ?? DateTime.now();
  final difference = date.difference(now);
  final seconds = difference.inSeconds.abs();
  final minutes = difference.inMinutes.abs();
  final hours = difference.inHours.abs();
  final days = difference.inDays.abs();
  final weeks = (days / 7).floor();
  final months = (days / 30).floor();
  final years = (days / 365).floor();
  final isFuture = difference.inSeconds > 0;

  // Treat as "now"
  if (config.nowThresholdSeconds != null &&
      seconds <= config.nowThresholdSeconds!) {
    return _format(config, TimeUnit.now, 0, isFuture);
  }

  // Treat as "today"
  if (config.useToday &&
      date.year == now.year &&
      date.month == now.month &&
      date.day == now.day) {
    return _format(config, TimeUnit.today, 0, isFuture);
  }

  // Yesterday or Tomorrow
  if (days == 1) {
    if (!isFuture) return _format(config, TimeUnit.yesterday, 0, isFuture);
    return _format(config, TimeUnit.tomorrow, 0, isFuture);
  }

  TimeUnit unit;
  int value;

  if (seconds < 60) {
    unit = TimeUnit.second;
    value = seconds;
  } else if (minutes < 60) {
    unit = TimeUnit.minute;
    value = minutes;
  } else if (hours < 24) {
    unit = TimeUnit.hour;
    value = hours;
  } else if (days < 7) {
    unit = TimeUnit.day;
    value = days;
  } else if (days < 30) {
    unit = TimeUnit.week;
    value = weeks;
  } else if (days < 365) {
    unit = TimeUnit.month;
    value = months;
  } else {
    unit = TimeUnit.year;
    value = years;
  }

  return _format(config, unit, value, isFuture);
}