持续时间之间的差异

Difference between durations

我正在创建一个时间表,其中显示预期和实际时间。

时长保存如下

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 它会抛出一个错误(显然是因为它正在读取它作为时间)

Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (1970-01-01 25:45:00)

还有其他方法吗?

您可以检查小时数是否大于 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

另请注意,==是用来比较的,不是赋值的。

如果还有 48 小时或更长时间,您也可以将 if ($hrs > 24) 更改为 while()


编辑

正如@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');

您可以尝试使用日期时间函数,但对我来说,将时间视为字符串似乎更直接,使用 split 或 explode 获取小时和分钟,转换为整数,获取分钟差值并将其转换回来到小时和分钟(整数除以 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);

您可以通过跟踪工作分钟数来手动完成 - 这将是准确的,并且还可以让您显示负差异。

<?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 高于预期。