在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'