humanizeDuration function

String humanizeDuration(
  1. Duration duration, {
  2. HumanizeOptions options = const HumanizeOptions(),
  3. HumanizeLanguage language = const EnLanguage(),
})

By default, Humanize Duration will humanize down to the millisecond. It will humanize in English by default. For example,

humanizeDuration(const Duration(milliseconds: 3000)); // '3 seconds'
humanizeDuration(const Duration(milliseconds: 97320000)); // '1 day, 3 hours, 2 minutes'

-- Options and languages You can change the settings and languages : Supported languages: EnLanguage, EsLanguage, FrLanguage, JpLanguage, ArLanguage English , Spanish , French , Arabic , Japanese

humanizeDuration(
const Duration(milliseconds: 97320000),
language: const ArLanguage(),
options: const HumanizeOptions(
  conjunction: ' و ',
  units: [Units.day, Units.hour],
  // delimiter: ' -- ',
  // lastPrefixComma: false,
  // spacer: ' Whole'
),
);

Implementation

String humanizeDuration(
  Duration duration, {
  HumanizeOptions options = const HumanizeOptions(),
  HumanizeLanguage language = const EnLanguage(),
}) {
  List<Units> sortedUnits = List.from(options.units)
    ..sort((a, b) => a.index.compareTo(b.index));

  int i, len;
  len = sortedUnits.length;

  var ms = duration.inMilliseconds.abs();

  List<_HumanizePiece> pieces = [];
  Units unitName;
  int unitMS, unitCount;

  for (i = 0; i < len; i++) {
    unitName = sortedUnits[i];
    unitMS = unitMeasures[unitName]!;
    unitCount = (ms / unitMS).floor();
    pieces.add(_HumanizePiece(unitName, unitCount, language));
    ms -= unitCount * unitMS;
  }

  pieces.removeWhere((e) => e.unitCount <= 0);
  final result = pieces.map((e) => e.format(options.spacer)).toList();
  if (options.conjunction == null || result.length == 1) {
    return result.join(options.delimiter);
  }
  if (result.length == 2) {
    return result.join(options.conjunction!);
  } else {
    return '${result.sublist(0, result.length - 1).join(options.delimiter)}${(options.lastPrefixComma ? "," : "")}${options.conjunction!}${result.last}';
  }
}