toHuman method

String toHuman({
  1. bool short = false,
})

Returns a human-readable representation of this Duration.

When short is false (default), outputs full unit names with proper pluralization:

Duration(hours: 2, minutes: 5).toHuman();  // "2 hours 5 minutes"
Duration(seconds: 45).toHuman();            // "45 seconds"

When short is true, outputs compact abbreviations:

Duration(hours: 2, minutes: 5).toHuman(short: true);  // "2h 5m"
Duration(seconds: 45).toHuman(short: true);            // "45s"

Zero-valued units are omitted. A zero duration returns "0 seconds" / "0s".

The largest unit included (in descending order) is: days → hours → minutes → seconds → milliseconds.

Implementation

String toHuman({bool short = false}) {
  if (inMicroseconds == 0) return short ? '0s' : '0 seconds';

  var remaining = inMicroseconds;
  final parts = <String>[];

  void addPart(int value, String long, String longPlural, String short_) {
    if (value == 0) return;
    final label = short ? '$value$short_' : (value == 1 ? '$value $long' : '$value $longPlural');
    parts.add(label);
  }

  // Days.
  final days = remaining ~/ _microsecondsPerDay;
  remaining -= days * _microsecondsPerDay;
  addPart(days, 'day', 'days', 'd');

  // Hours.
  final hours = remaining ~/ _microsecondsPerHour;
  remaining -= hours * _microsecondsPerHour;
  addPart(hours, 'hour', 'hours', 'h');

  // Minutes.
  final minutes = remaining ~/ _microsecondsPerMinute;
  remaining -= minutes * _microsecondsPerMinute;
  addPart(minutes, 'minute', 'minutes', 'm');

  // Seconds.
  final seconds = remaining ~/ _microsecondsPerSecond;
  remaining -= seconds * _microsecondsPerSecond;
  addPart(seconds, 'second', 'seconds', 's');

  // Milliseconds.
  final ms = remaining ~/ _microsecondsPerMillisecond;
  addPart(ms, 'millisecond', 'milliseconds', 'ms');

  return parts.join(' ');
}