持续时间之间的差异
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 高于预期。
我正在创建一个时间表,其中显示预期和实际时间。
时长保存如下
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 高于预期。