Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中,当超过一天时,两个日期时间之间的持续时间不准确_Php_Datetime - Fatal编程技术网

在PHP中,当超过一天时,两个日期时间之间的持续时间不准确

在PHP中,当超过一天时,两个日期时间之间的持续时间不准确,php,datetime,Php,Datetime,我正在为我的老板开发一个时钟应用程序,我将时钟输入和输出时间存储为日期时间和时间戳 下面是一个简单的函数,用于计算用户的时钟输入和时钟输出日期时间之间的持续时间 在演示中,您可以看到结果是15:11:18,尽管两个日期之间大约有5天。我知道我可以简单地让函数显示天数,但我的老板不想显示天数,而是应该显示两个日期时间之间的总时、分、秒,而不显示天数 有人能给我指出正确的方向或帮助我显示适当的时间吗 例如,额外的2天将使小时数增加48小时,而不是2天 public function dateTime

我正在为我的老板开发一个时钟应用程序,我将时钟输入和输出时间存储为日期时间和时间戳

下面是一个简单的函数,用于计算用户的时钟输入和时钟输出日期时间之间的持续时间

在演示中,您可以看到结果是
15:11:18
,尽管两个日期之间大约有5天。我知道我可以简单地让函数显示天数,但我的老板不想显示天数,而是应该显示两个日期时间之间的总时、分、秒,而不显示天数

有人能给我指出正确的方向或帮助我显示适当的时间吗

例如,额外的2天将使小时数增加48小时,而不是2天

public function dateTimeDifference($startDatetime, $endDatetime, $format = '%H:%I:%S')
{
    $startDatetime2 = new DateTime($startDatetime, $this->timeZone);
    $endDatetime2 = new DateTime($endDatetime, $this->timeZone);
    $interval = $startDatetime2->diff($endDatetime2);

    return $interval->format($format);

}

$startDatetime = '2013-09-10 07:15:48 pm';
$endDatetime = '2013-09-15 10:27:06 am'; 

echo dateTimeDifference($startDatetime, $endDatetime)

// Result:   15:11:18

更改
函数变量$format的格式

$format = '%d days %H:%I:%S'

public function dateTimeDifference($startDatetime, $endDatetime, $format = '%d days %H:%I:%S')
{
    $startDatetime2 = new DateTime($startDatetime, $this->timeZone);
    $endDatetime2 = new DateTime($endDatetime, $this->timeZone);
    $interval = $startDatetime2->diff($endDatetime2);

    return $interval->format($format);

}

$startDatetime = '2013-09-10 07:15:48 pm';
$endDatetime = '2013-09-15 10:27:06 am'; 

echo dateTimeDifference($startDatetime, $endDatetime);
如果要将
转换为
小时
,请尝试此操作

function dateTimeDifference($startDatetime, $endDatetime, $format = '%H:%I:%S')
{
    $startDatetime2 = new DateTime($startDatetime);
    $endDatetime2 = new DateTime($endDatetime);
    $interval = $startDatetime2->diff($endDatetime2);
    $d=$interval->format('%d');
    $format=$interval->format($format);
    $f=explode(':',$format);
    $td=$d*24;
    return $time=($f[0]+$td).':'.$f[1].':'.$f[2];

}

$startDatetime = '2013-09-10 07:15:48 pm';
$endDatetime = '2013-09-15 10:27:06 am'; 

echo dateTimeDifference($startDatetime, $endDatetime);
// 111:11:18

更改
函数变量$format的格式

$format = '%d days %H:%I:%S'

public function dateTimeDifference($startDatetime, $endDatetime, $format = '%d days %H:%I:%S')
{
    $startDatetime2 = new DateTime($startDatetime, $this->timeZone);
    $endDatetime2 = new DateTime($endDatetime, $this->timeZone);
    $interval = $startDatetime2->diff($endDatetime2);

    return $interval->format($format);

}

$startDatetime = '2013-09-10 07:15:48 pm';
$endDatetime = '2013-09-15 10:27:06 am'; 

echo dateTimeDifference($startDatetime, $endDatetime);
如果要将
转换为
小时
,请尝试此操作

function dateTimeDifference($startDatetime, $endDatetime, $format = '%H:%I:%S')
{
    $startDatetime2 = new DateTime($startDatetime);
    $endDatetime2 = new DateTime($endDatetime);
    $interval = $startDatetime2->diff($endDatetime2);
    $d=$interval->format('%d');
    $format=$interval->format($format);
    $f=explode(':',$format);
    $td=$d*24;
    return $time=($f[0]+$td).':'.$f[1].':'.$f[2];

}

$startDatetime = '2013-09-10 07:15:48 pm';
$endDatetime = '2013-09-15 10:27:06 am'; 

echo dateTimeDifference($startDatetime, $endDatetime);
// 111:11:18

这是因为您正在将差异格式化为%H:%i:%s,即小时、分钟和秒。要获取天数,您需要
%D
部分

如果希望将天数转换为小时,则需要对其执行自己的计算,并将格式更改为不包含小时部分

public function dateTimeDifference($startDatetime, $endDatetime, $format = '%I:%S')
{
    $startDatetime2 = new DateTime($startDatetime, $this->timeZone);
    $endDatetime2 = new DateTime($endDatetime, $this->timeZone);
    $interval = $startDatetime2->diff($endDatetime2);

    $hours = $interval->format("%H") + ($interval->format("%d") * 24);
    return $hours . ':' . $interval->format($format);
}

这是因为您正在将差异格式化为%H:%i:%s,即小时、分钟和秒。要获取天数,您需要
%D
部分

如果希望将天数转换为小时,则需要对其执行自己的计算,并将格式更改为不包含小时部分

public function dateTimeDifference($startDatetime, $endDatetime, $format = '%I:%S')
{
    $startDatetime2 = new DateTime($startDatetime, $this->timeZone);
    $endDatetime2 = new DateTime($endDatetime, $this->timeZone);
    $interval = $startDatetime2->diff($endDatetime2);

    $hours = $interval->format("%H") + ($interval->format("%d") * 24);
    return $hours . ':' . $interval->format($format);
}

最好也是最简单的方法是覆盖$interval->h

public function dateTimeDifference($startDatetime, $endDatetime, $format = '%H:%I:%S')
{
    $startDatetime2 = new DateTime($startDatetime, $this->timeZone);
    $endDatetime2 = new DateTime($endDatetime, $this->timeZone);
    $interval = $startDatetime2->diff($endDatetime2);
    $interval -> h += 24 * $interval -> days;

    return $interval->format($format);

}

最好也是最简单的方法是覆盖$interval->h

public function dateTimeDifference($startDatetime, $endDatetime, $format = '%H:%I:%S')
{
    $startDatetime2 = new DateTime($startDatetime, $this->timeZone);
    $endDatetime2 = new DateTime($endDatetime, $this->timeZone);
    $interval = $startDatetime2->diff($endDatetime2);
    $interval -> h += 24 * $interval -> days;

    return $interval->format($format);

}

另一种方法是将此类任务移动到DBMS。另一种方法是将这些任务移动到DBMS。由于我了解如何显示总天数,我的目标是不显示天数,而是将天数作为小时添加到总小时中。因此,额外的两天将为
H
hours添加48小时,这比我强多了。:-)回答得好!虽然我会从函数中删除
$format
字符串并对其进行硬编码,但由于代码的其余部分现在取决于
'%H:%I:%S'
的格式,感谢我了解如何显示总天数,我的目标是不显示天数,而是将天数作为小时添加到总小时数中。因此,额外的两天将为
H
hours添加48小时,这比我强多了。:-)回答得好!虽然我会从函数中删除
$format
字符串并对其进行硬编码,但由于其余代码现在取决于
'%H:%I:%S'