持续时间之间的差异

时间:2018-05-02 19:05:20

标签: php datetime time difference

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

持续时间保存如下

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()的未捕获异常'Exception':   无法解析时间字符串(1970-01-01 25:45:00)

还有其他办法吗?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

您可以尝试使用日期时间函数,但对于我来说,将时间视为字符串,使用拆分或爆炸来获取小时和分钟,转换为整数,获得分钟数并将其转换回数小时似乎更直接和分钟(整数除以60和余数)。

from py4j.java_gateway import java_import
from binascii import b2a_base64
jvm = sc._gateway.jvm

java_import(jvm, "org.apache.hadoop.hbase.client.Scan")
java_import(jvm, "org.apache.hadoop.hbase.util.Bytes")
java_import(jvm, "org.apache.hadoop.hbase.protobuf.ProtobufUtil")

to_bytes = lambda x: jvm.Bytes.toBytesBinary(x)

scan = jvm.Scan()
scan.setStartRow(to_bytes(YOUR_START_ROW))
scan.setStopRow(to_bytes(YOUR_STOP_ROW))
scan.addFamily(to_bytes(YOUR_COLUMN_FAMILY_KEY))

scan_proto_bytes = jvm.ProtobufUtil.toScan(scan).toByteArray()
scan_str = b2a_base64(str(scan_proto_bytes))

        conf = {"hbase.mapreduce.inputtable" : table,
            "hbase.mapreduce.scan" : scan_str,
            "hbase.zookeeper.quorum" : host}

答案 2 :(得分:0)

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

<?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比预期更多。