formatDuration function

String formatDuration(
  1. int ms, {
  2. bool hideTrailingZeros = false,
  3. bool mostSignificantOnly = false,
})

Formats a duration in milliseconds to a human-readable string.

Implementation

String formatDuration(
  int ms, {
  bool hideTrailingZeros = false,
  bool mostSignificantOnly = false,
}) {
  if (ms < 60000) {
    if (ms == 0) return '0s';
    if (ms < 1) return '${(ms / 1000).toStringAsFixed(1)}s';
    return '${ms ~/ 1000}s';
  }

  var days = ms ~/ 86400000;
  var hours = (ms % 86400000) ~/ 3600000;
  var minutes = (ms % 3600000) ~/ 60000;
  var seconds = ((ms % 60000) / 1000).round();

  // Handle rounding carry-over
  if (seconds == 60) {
    seconds = 0;
    minutes++;
  }
  if (minutes == 60) {
    minutes = 0;
    hours++;
  }
  if (hours == 24) {
    hours = 0;
    days++;
  }

  if (mostSignificantOnly) {
    if (days > 0) return '${days}d';
    if (hours > 0) return '${hours}h';
    if (minutes > 0) return '${minutes}m';
    return '${seconds}s';
  }

  if (days > 0) {
    if (hideTrailingZeros && hours == 0 && minutes == 0) return '${days}d';
    if (hideTrailingZeros && minutes == 0) return '${days}d ${hours}h';
    return '${days}d ${hours}h ${minutes}m';
  }
  if (hours > 0) {
    if (hideTrailingZeros && minutes == 0 && seconds == 0) return '${hours}h';
    if (hideTrailingZeros && seconds == 0) return '${hours}h ${minutes}m';
    return '${hours}h ${minutes}m ${seconds}s';
  }
  if (minutes > 0) {
    if (hideTrailingZeros && seconds == 0) return '${minutes}m';
    return '${minutes}m ${seconds}s';
  }
  return '${seconds}s';
}