【问题标题】:Time Duration between 2 DateTimes in PHP is not accurate when over a day has past超过一天后,PHP 中 2 个 DateTimes 之间的持续时间不准确
【发布时间】:2013-09-16 00:01:44
【问题描述】:

我正在为我的老板开发一个 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

【问题讨论】:

  • 另一种方法是将此类任务移至 DBMS。这些数据更准确。

标签: php datetime


【解决方案1】:

更改function variable $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);

如果你想将days 转换为hours,那么试试这个,

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

【讨论】:

  • 谢谢 我了解如何显示总天数,我的目标是不显示天数,而是将天数作为小时数添加到总小时数中。因此,额外的 2 天将使 H 小时增加 48 小时
  • 打败我。 :-) 好答案!虽然我会从函数中删除 $format 字符串并对其进行硬编码,但由于其余代码现在取决于格式为 '%H:%I:%S'
【解决方案2】:

这是因为您将差异格式化为 %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);
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      相关资源
      最近更新 更多