PHP Минус / Строки Вычитания Часа / Минуты форматированные H: i - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть функция PHP, которая при задании двух значений часов / минут добавляет два значения, например:

00: 20 + 00:15 = 00: 35

Вот функция:

function sumHoursAndMinutes() {
    $i = 0;
    foreach(func_get_args() as $time) {
        sscanf($time, '%d:%d', $hour, $min);
        $i += $hour * 60 + $min;
    }

    if( $h = floor($i / 60) ) {
        $i %= 60;
    }

    return sprintf('%02d:%02d', $h, $i);
}
// Usage: sumHoursAndMinutes("00:20", "00:15");

Вывод: "00:35"

Как можно добиться того же, выполняя вычитание, Пример:00:20 - 00:15 = 00: 05

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

Это может выглядеть как длительный подход, но я бы лично превратил его в минуты.Это облегчает обработку, и я использовал метод переформатирования для следующей цели: если ваш substractTimeFromTime или addTimeToTime возвращает что-то <0, вы знаете, что-то не так с вашими входами или это просто не имеет никакого смыслав вашем контексте.Кроме того, вам необходимо убедиться, что времена действительны, поскольку 01:99 будет правильным вводом на данный момент.Я просто предполагал, что вы делаете проверку раньше.

function reformatMinutes($minutes)
{
    $hours = intval($minutes/60);
    $minutes -= $hours*60;
    return sprintf("%02d:%02d",$hours,$minutes);
}

function addTimeToTime($time1, $time2)
{
    $time1 = explode(":",$time1);
    $time2 = explode(":",$time2);
    $sumOfMinutes = intval($time1[0])*60+intval($time2[0])*60+intval($time1[1])+intval($time2[1]);
    return $sumOfMinutes;

}

function substractTimeFromTime($basis,$subtract)
{
    $basis = explode(":",$basis);
    $subtract = explode(":",$subtract);
    $remainingMinutes = intval($basis[0])*60-intval($subtract[0])*60+intval($basis[1])-intval($subtract[1]);
    return $remainingMinutes;       
}

$resultPlus = addTimeToTime("01:10","00:15");
$resultMinus = substractTimeFromTime("01:30","00:15");
echo reformatMinutes($resultPlus);
echo reformatMinutes($resultMinus);

Это выводит:

01:25
01:15
0 голосов
/ 31 декабря 2018

Вы можете использовать date () и strtotime ().

Не забудьте установить часовой пояс снова по умолчанию после.
Нам нужен часовой пояс UTC, чтобы не беспокоиться о летнем времени или разнице часовых поясов.

$a = "00:20";
$b = "00:15";

date_default_timezone_set("UTC");

echo date("H:i", strtotime($a) + strtotime($b));
echo "\n\n";
echo date("H:i", strtotime($a) - strtotime($b));

date_default_timezone_set("Your_default_timezone");

//00:35
//00:05

https://3v4l.org/kIVlI


Если вам нужно рассчитать часы и минуты вручную из strtotime.

Если вы хотите добавить это, вам нужно удалить strtotime ("00: 00 ") * 2 из результата, потому что мы используем времена Unix.
Затем я использую str_pad для форматирования часов и минут.

$a = "00:20";
$b = "02:15";

date_default_timezone_set("UTC");

// If addition
$diff = strtotime($a) + strtotime($b) - strtotime("00:00")*2;
$hours = floor($diff /3600);
$minutes = ($diff -($hours *3600))/60;

echo str_pad($hours,2,0, STR_PAD_LEFT) . ":" . str_pad($minutes,2,0, STR_PAD_LEFT) ;


echo "\n\n";


//If subtraction
$diff = strtotime($a) - strtotime($b);
$hours = floor($diff /3600);
$minutes = ($diff -($hours *3600))/60;

echo str_pad($hours,2,0, STR_PAD_LEFT) . ":" . str_pad($minutes,2,0, STR_PAD_LEFT) ;


//date_default_timezone_set("Your_default_timezone");

//02:35
//-2:05
0 голосов
/ 31 декабря 2018

Либо напишите почти идентичную функцию для минуса вместо плюса, либо добавьте необязательный логический параметр, который по умолчанию равен плюс, но может быть установлен на минус.

...