briannesbitt / Carbon

A simple PHP API extension for DateTime.
https://carbon.nesbot.com/
MIT License
16.53k stars 1.28k forks source link

⭐ Decimal cascade factor not supported #2343

Closed netcom closed 2 years ago

netcom commented 3 years ago

Hello, Please add support for decimal cascade factor.

I encountered an issue with the following code:

function formatMinutes(int $minutes = 479)
{
    $factors = \Carbon\CarbonInterval::getCascadeFactors();
    $factorsAmmended = $factors;
    $factorsAmmended['dayz'] = [7.5, 'hours'];
    $factorsAmmended['weeks'] = [5, 'dayz'];
    \Carbon\CarbonInterval::setCascadeFactors($factorsAmmended);
    $r = \Carbon\CarbonInterval::minutes($minutes)->cascade()->forHumans();
    \Carbon\CarbonInterval::setCascadeFactors($factors);
    return $r;
}

Carbon version: 2.47.0

PHP version: 7.4.13

I expected to get:

1 day 29 minutes

But I actually get:

59 minutes

Our working implementation:

function formatMinutes(int $minutes)
{
    //$testhrs = 14.2; $minutes = $testhrs*60;
    $setting_hoursinworkday = 7.5;
    $remainder = $setting_hoursinworkday - floor($setting_hoursinworkday);
    $remainder_mins = (int)($remainder*60);
    $_hours = $minutes/60;
    $_hours_in_day_int = floor($setting_hoursinworkday);
    $_numdays = (int)floor($_hours/$_hours_in_day_int);
    $_addmins = $remainder_mins*$_numdays;
    $minutes = $minutes-$_addmins;
    $numworkingdaysinweek = 5;
    $factors = \Carbon\CarbonInterval::getCascadeFactors();
    $factorsAmmended = $factors;
    $factorsAmmended['dayz'] = [$_hours_in_day_int, 'hours'];
    $factorsAmmended['weeks'] = [$numworkingdaysinweek, 'dayz'];
    \Carbon\CarbonInterval::setCascadeFactors($factorsAmmended);
    $r = \Carbon\CarbonInterval::minutes($minutes)->cascade()->forHumans();
    \Carbon\CarbonInterval::setCascadeFactors($factors);
    return $r;
}

Thanks!

kylekatarnls commented 3 years ago

Hello 👋

Float support cascade factors sounds fair. I would probably scope this into the next major version (3.x branch) as I'm not sure it's feasible without refactoring deeply some methods.

Any PR for this would be welcome.

Thanks 🙏