0

我正在为我的老板开发一个 Timeclock 应用程序,并将时钟进出时间存储为 DateTime 和 Timestamp。

下面是一个简单的函数来计算用户的打卡和打卡日期时间之间的持续时间。

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

谁能指出我正确的方向或帮助它显示适当的时间?

例如,额外的 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
4

3 回答 3

2

改变function variable $formatlike的格式

$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);

如果你想转换dayshours然后试试这个,

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
于 2013-09-15T15:39:44.783 回答
1

那是因为您将差异格式化为 %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);
}
于 2013-09-15T15:52:12.900 回答
1

最好和最简单的方法是覆盖 $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);

}
于 2013-09-15T16:01:44.323 回答