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% часов, минут и секунд или сделаю что-то еще? Есть идеи, ребята?


person 001221    schedule 21.11.2015    source источник
comment
Можете ли вы хранить значения длительности в базе данных в секундах? Это значительно облегчило бы расчеты.   -  person Tristan    schedule 21.11.2015
comment
@Tristan, если вы имеете в виду использование strtotime, то не совсем так, поскольку я не использую значения даты или отметки времени. если вы знаете другой метод, пожалуйста, поделитесь ??   -  person 001221    schedule 22.11.2015


Ответы (1)


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

Напишите функцию для преобразования секунд в часы:минуты:секунды

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

person Sherif    schedule 21.11.2015
comment
Я хочу, чтобы ответ был в часах, минутах и ​​секундах, а не на 90%, например. 29:30:30 - person 001221; 22.11.2015
comment
Извините, возможно, я неправильно понял ваш вопрос тогда. Звучало так, как будто вы хотели 90% результата, но неважно, просто используйте функции formatToSeconds и secondsToFormat для преобразования между ними, и у вас все еще есть ответ :) - person Sherif; 22.11.2015
comment
Обновлен ответ, чтобы проиллюстрировать, что вы ищете более конкретно. Хотя логика уже была там ;) - person Sherif; 22.11.2015