Я храню значения продолжительности в базе данных, чтобы узнать, сколько у меня есть возможностей для выполнения действий в течение данной рабочей недели. Например, у меня есть следующие входные данные, чтобы вычислить продолжительность емкости, которую я имею в неделю, из общей продолжительности, сокращенной продолжительности (например, время обеда, встречи, посещения туалетов и т. Д.) И процента, с которого нужно уменьшить. Так, например, у меня есть следующие значения:
$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% часов, минут и секунд или я сделаю что-нибудь еще? Есть идеи, ребята?
Это проще, если вы делаете все за секунды и конвертируете это в часы, минуты, секунды, когда хотите вывести или прочитать значения. Таким образом, ваша логика становится проще и меньше зависит от состояния.
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
Других решений пока нет …