Разница между продолжительностью - PullRequest
0 голосов
/ 02 мая 2018

Я создаю расписание, в котором отображаются ожидаемые и фактические часы.

Продолжительность сохраняется, как показано ниже

23:15 - 23 часа и 15 минут

25:45 - 25 часов и 45 минут

Мне нужно выяснить разницу в часах и минутах между ними (дополнительные часы отработаны)

Я пробовал ниже

$acutal=='23:15';
$expected=='25:45';
$start_time = new DateTime("1970-01-01 $acutal:00");
$time = $start_date->diff(new DateTime("1970-01-01 $expected:00"));

Это работает, однако, когда часы превышают 24:00, он выдает ошибку (очевидно, потому что читает это как время)

Неопределенное исключение «Исключение» с сообщением «DateTime :: __ construct (): Не удалось проанализировать строку времени (1970-01-01 25:45:00)

Есть ли другой способ сделать это?

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Вы можете попробовать использовать функции datetime, но мне кажется намного проще воспринимать время как строку, использовать разбиение или разнесение, чтобы получить часы и минуты, преобразовать в целые числа, получить разницу в минутах и ​​преобразовать ее обратно в часы. и минуты (целое число, деленное на 60 и остаток).

$t1=explode(':',$expected);
$t2=explode(':',$actual);
$d=60*($t1[0]-$t2[0])+t1[1]-t2[1];
$result=str_pad(floor($d/60),2,'0',STR_PAD_LEFT).':'.str_pad($d%60,2,'0',STR_PAD_LEFT);
0 голосов
/ 02 мая 2018

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

<?php
// get the difference in H:mm between two H:mm 
function diff_time($actual, $expected) {
    $diff_mins = mins($actual) - mins($expected);

    return format_mins($diff_mins);
}

// convert a HH:mm to number of minutes
function mins($t) {
    $parts = explode(':', $t);

    return $parts[0] * 60 + $parts[1];
}

// convert number of minutes into HH:mm
function format_mins($m) {
    $mins = $m % 60;
    $hours = ($m - $mins) / 60;

    // format HH:mm
    return $hours . ':' . sprintf('%02d', abs($mins));
}

var_dump(diff_time('23:15', '25:45'));
var_dump(diff_time('25:15', '23:45'));

Это выводит:

string(5) "-2:30"
string(4) "1:30"

.. во-первых, на 2:30 меньше, чем ожидалось, для второго на 1:30 больше, чем ожидалось.

0 голосов
/ 02 мая 2018

Вы можете проверить, больше ли число часов, чем 24, и если да, добавить день и удалить 24 часа.

$actual='23:15';
$expected='25:45';

$day = 1;
list($hrs, $min) = explode(':', $expected);
if ($hrs > 24) { $day += 1; $hrs -= 24; }

$start_time = new DateTime("1970-01-01 $actual:00");
$time = $start_time->diff(new DateTime("1970-01-$day $hrs:$min:00"));

echo $time->format('%hh %Im');

Выход:

2h 30m

Обратите внимание, что == используется для сравнения, а не для назначения.

Вы также можете изменить if ($hrs > 24) на while(), если есть 48 или более часов.


редактировать

Как отмечает @CollinD, если время превысит количество дней месяца, оно не будет выполнено. Вот еще одно решение:

$actual='23:15';
$expected='25:45';

list($hrs, $min) = explode(':', $actual);
$total1 = $min + $hrs * 60;

list($hrs, $min) = explode(':', $expected);
$diff = $min + $hrs * 60 - $total1;

$start_time = new DateTime();
$expected_time = new DateTime();
$expected_time->modify("+ $diff minutes");
$time = $start_time->diff($expected_time);

echo $time->format('%hh %Im');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...