humanizeDuration function
String
humanizeDuration(
- Duration duration, {
- HumanizeOptions options = const HumanizeOptions(),
- 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}';
}
}