математика — PHP вычитает две длительности и уменьшает процент, чтобы получить окончательное время

Я храню значения продолжительности в базе данных, чтобы узнать, сколько у меня есть возможностей для выполнения действий в течение данной рабочей недели. Например, у меня есть следующие входные данные, чтобы вычислить продолжительность емкости, которую я имею в неделю, из общей продолжительности, сокращенной продолжительности (например, время обеда, встречи, посещения туалетов и т. Д.) И процента, с которого нужно уменьшить. Так, например, у меня есть следующие значения:

$total_duration = 30:30:00; //(37 hours 30 mins 00 secs)
$reduced_duration = 01:00:00; //(1 hour 00 mins 00 secs)
$capacity_percentage = 90%; // capacity percentage for leeway

Поэтому то, что я хочу сделать, вычесть $total_duration от $reduced_duration а затем получить $capacity_percentage % от этого общего

Я пытаюсь следующее;

    $total_duration = '30:30:00'; //(37 hours 30 mins 00 secs)
$reduced_duration= '01:00:00'; //(1 hour 00 mins 00 secs)
$capacity_percentage ='90%'; // capacity percentage for leeway

$total_duration_hrs = 0;
$total_duration_mins = 0;
$total_duration_secs = 0;

$reduced_duration_hrs = 0;
$reduced_duration_mins = 0;
$reduced_duration_secs = 0;

list($total_duration_hours, $total_duration_minutes, $total_duration_minutes) = explode(':', $total_duration);

list($reduced_duration_hours, $reduced_duration_minutes, $reduced_duration_seconds) = explode(':', $reduced_duration);

$total_duration_hrs += (int) $total_duration_hours;
$total_duration_mins += (int) $total_duration_minutes;
$total_duration_secs += (int) $total_duration_minutes;

$reduced_duration_hrs += (int) $reduced_duration_hours;
$reduced_duration_mins += (int) $reduced_duration_minutes;
$reduced_duration_secs += (int) $reduced_duration_seconds;

$totalhrs = ($total_duration_hrs - $reduced_duration_hrs);
$totalmins = ($total_duration_mins - $reduced_duration_mins);
$totalsecs = ($total_duration_secs - $reduced_duration_secs);

Это дает мне правильное общее время, т.е. 29:30:30, Но теперь я немного не уверен в том, как найти значение времени в процентах, найду ли я 90% часов, минут и секунд или я сделаю что-нибудь еще? Есть идеи, ребята?

2

Решение

Это проще, если вы делаете все за секунды и конвертируете это в часы, минуты, секунды, когда хотите вывести или прочитать значения. Таким образом, ваша логика становится проще и меньше зависит от состояния.

function secondsToFormat($seconds) {
$diff = (new DateTime)->sub(new DateInterval("PT{$seconds}S"))->diff(new DateTime);
$h = $diff->format("%h") + $diff->format("%a") * 24;
return $diff->format("{$h}:%I:%S");
}

Теперь вам нужна функция, которая делает противоположное, чтобы вы могли легко конвертировать между ними.

function formatToSeconds($formattedTimeString) {
list($hours, $minutes, $seconds) = explode(":", $formattedTimeString);
$seconds += $hours * 60 * 60;
$seconds += $minutes * 60;
return $seconds;
}
function getPercentage($total, $percent) {
return (int) floor($total / 100 * $percent);
}

Теперь вы можете просто сделать это …

$t = formatToSeconds($total_duration);
$r = formatToSeconds($reduced_duration);
$diff = $t - $r; // difference in seconds
echo secondsToFormat(getPercentage($diff, 90)), " at 90% capacity";

и вы получите что-то вроде 26:33:00 at 90% capacity

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]