PHP Расчет общего времени, потраченного на строки и / или временные метки - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь выполнить глупую функцию QPI, в которой я бы взял набор записанных времен, хранимых в базе данных SQL, вычел их друг от друга, а затем разделил их на количество задач (или строк), которые я выбрал вSQL-запрос.

Проблема, с которой я сталкиваюсь, состоит в том, что у меня есть вычитаемые периоды времени (де-факто это длительность между двумя временными метками) и в формате 0000-00-00 00:38:11, являющемся вычитанием между 2019-04-19 05:59:36.000и 2019-04-19 06:37:47.000.

Если бы я strtotime('0000-00-00 00:38:11') вернул бы значение, равное 943922291, которое моя довольно точная функция для преобразования секунд в даты превращает в 29 years, 10 months, 29 days, 38 minutes and 11 seconds, что, очевидно, неверно.

Я думало том, чтобы делать большинство вещей более программно и быть менее зависимым от библиотек.Я «взорвал» строку на ее компоненты и сделал несколько базовых (и неправильных умножений, так как она не учитывает високосные годы).Но это не правильный способ сделать это, я в этом уверен.

Есть ли способ преобразовать продолжительность в секунды, используя системные библиотеки?


Вот мой глупый строковый преобразователь даты в время, на всякий случайИз этого может получиться полезное:

function myFunc($input_date)
  {
        $date = explode(" ", $input_date);
        //////////////////////////////
        $yearmonthday = explode("-", $date[0]); 
        //////////////////////////////
        $years=$yearmonthday[0]; 
        $months=$yearmonthday[1];
        $days=$yearmonthday[2];
        /////////////////////////////
        $hoursminutesseconds = explode(":", $date[1]); 
        $hours=$hoursminutesseconds[0];
        $minutes=$hoursminutesseconds[1];
        $seconds=$hoursminutesseconds[2];

        echo '---------------<br>';    
        echo $input_date;    
        echo '<br>---------------<br>';    
        echo "years: ".$years." months: ".$months." days: ".$days." hours: ".$hours." minutes: ".$minutes." seconds: ".$seconds;
        echo '<br>---------------<br>';

        echo 'MINUTES: '.$minutes.'<br>';
        $minsToSec = $minutes * 60;
        echo 'Mins to Sec: '.$minsToSec.'<br>';


        echo 'HOURS: '.$hours.'<br>';
        $hoursToSec = $hours * 3600;
        echo 'Hours to Sec: '.$hoursToSec.'<br>';

        echo 'DAYS: '.$days.'<br>';
        $daysToSec = $days * 86400;
        echo 'Days to Sec: '.$daysToSec.'<br>';

        echo 'Months: '.$months.'<br>';
        $monthsToSec = $months * 2629746;
        echo 'Months to Sec: '.$monthsToSec.'<br>';

        echo 'Years: '.$years.'<br>';
        $yearssToSec = $years * 31556952;
        echo 'Years to Sec: '.$yearssToSec.'<br>';

        $combined = $minsToSec + $daysToSec + $monthsToSec + $yearssToSec;

        //echo 'All combined: ' . $combined. '<br>';

        return $combined;
  } 

Ниже приведен вышеупомянутый конвертер секунд в дату:

function convertSecToTime($sec)
{
    $date1 = new DateTime("@0");
    $date2 = new DateTime("@$sec");
    $interval = date_diff($date1, $date2);
    $parts = ['years' => 'y', 'months' => 'm', 'days' => 'd', 'hours' => 'h', 'minutes' => 'i', 'seconds' => 's'];
    $formatted = [];

    foreach($parts as $i => $part)
    {
        $value = $interval->$part;
        if ($value !== 0)
        {
            if ($value == 1){
                $i = substr($i, 0, -1);
            }
            $formatted[] = "$value $i";
        }
    }

    if (count($formatted) == 1)
    {
        return $formatted[0];
    }

    else
    {
        $str = implode(', ', array_slice($formatted, 0, -1));
        $str.= ' and ' . $formatted[count($formatted) - 1];
        return $str;
    }
}
...