diff --git a/src/Symfony/Component/Console/Helper/Helper.php b/src/Symfony/Component/Console/Helper/Helper.php index 3981bbf3ab1ba..ddb2e93035432 100644 --- a/src/Symfony/Component/Console/Helper/Helper.php +++ b/src/Symfony/Component/Console/Helper/Helper.php @@ -87,39 +87,41 @@ public static function substr(?string $string, int $from, ?int $length = null): public static function formatTime(int|float $secs, int $precision = 1): string { + $ms = (int) ($secs * 1000); $secs = (int) floor($secs); - if (0 === $secs) { - return '< 1 sec'; + if (0 === $ms) { + return '< 1 ms'; } static $timeFormats = [ - [1, '1 sec', 'secs'], - [60, '1 min', 'mins'], - [3600, '1 hr', 'hrs'], - [86400, '1 day', 'days'], + [1, 'ms'], + [1000, 's'], + [60000, 'min'], + [3600000, 'h'], + [86_400_000, 'd'], ]; $times = []; foreach ($timeFormats as $index => $format) { - $seconds = isset($timeFormats[$index + 1]) ? $secs % $timeFormats[$index + 1][0] : $secs; + $milliSeconds = isset($timeFormats[$index + 1]) ? $ms % $timeFormats[$index + 1][0] : $ms; if (isset($times[$index - $precision])) { unset($times[$index - $precision]); } - if (0 === $seconds) { + if (0 === $milliSeconds) { continue; } - $unitCount = ($seconds / $format[0]); - $times[$index] = 1 === $unitCount ? $format[1] : $unitCount.' '.$format[2]; + $unitCount = ($milliSeconds / $format[0]); + $times[$index] = $unitCount.' '.$format[1]; - if ($secs === $seconds) { + if ($ms === $milliSeconds) { break; } - $secs -= $seconds; + $ms -= $milliSeconds; } return implode(', ', array_reverse($times)); diff --git a/src/Symfony/Component/Console/Tests/Helper/HelperTest.php b/src/Symfony/Component/Console/Tests/Helper/HelperTest.php index 0a0c2fa48b22c..009864454c671 100644 --- a/src/Symfony/Component/Console/Tests/Helper/HelperTest.php +++ b/src/Symfony/Component/Console/Tests/Helper/HelperTest.php @@ -20,31 +20,34 @@ class HelperTest extends TestCase public static function formatTimeProvider() { return [ - [0, '< 1 sec', 1], - [0.95, '< 1 sec', 1], - [1, '1 sec', 1], - [2, '2 secs', 2], - [59, '59 secs', 1], - [59.21, '59 secs', 1], + [0, '< 1 ms', 1], + [0.0004, '< 1 ms', 1], + [0.95, '950 ms', 1], + [1, '1 s', 1], + [2, '2 s', 2], + [59, '59 s', 1], + [59.21, '59 s', 1], + [59.21, '59 s, 210 ms', 5], [60, '1 min', 2], - [61, '1 min, 1 sec', 2], - [119, '1 min, 59 secs', 2], - [120, '2 mins', 2], - [121, '2 mins, 1 sec', 2], - [3599, '59 mins, 59 secs', 2], - [3600, '1 hr', 2], - [7199, '1 hr, 59 mins', 2], - [7200, '2 hrs', 2], - [7201, '2 hrs', 2], - [86399, '23 hrs, 59 mins', 2], - [86399, '23 hrs, 59 mins, 59 secs', 3], - [86400, '1 day', 2], - [86401, '1 day', 2], - [172799, '1 day, 23 hrs', 2], - [172799, '1 day, 23 hrs, 59 mins, 59 secs', 4], - [172800, '2 days', 2], - [172801, '2 days', 2], - [172801, '2 days, 1 sec', 4], + [61, '1 min, 1 s', 2], + [119, '1 min, 59 s', 2], + [120, '2 min', 2], + [121, '2 min, 1 s', 2], + [3599, '59 min, 59 s', 2], + [3600, '1 h', 2], + [7199, '1 h, 59 min', 2], + [7200, '2 h', 2], + [7201, '2 h', 2], + [86399, '23 h, 59 min', 2], + [86399, '23 h, 59 min, 59 s', 3], + [86400, '1 d', 2], + [86401, '1 d', 2], + [172799, '1 d, 23 h', 2], + [172799, '1 d, 23 h, 59 min, 59 s', 4], + [172799.123, '1 d, 23 h, 59 min, 59 s, 123 ms', 5], + [172800, '2 d', 2], + [172801, '2 d', 2], + [172801, '2 d, 1 s', 4], ]; }