Я пытаюсь выполнить глупую функцию 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;
}
}