php - 我们如何在 PHP 中添加两个日期间隔

标签 php datetime addition dateinterval

我想添加两个日期间隔来计算以小时和分钟为单位的总持续时间,实际上我想执行加法,如下所示:

$a = new DateTime('14:25');
$b = new DateTime('17:30');
$interval1 = $a->diff($b);
echo "interval 1 : " . $interval1->format("%H:%I");
echo "<br />";

$c = new DateTime('08:00');
$d = new DateTime('13:00');
$interval2 = $c->diff($d);
echo "interval 2 : " . $interval2->format("%H:%I");
echo "<br />";

echo "Total interval : " . $interval1 + $interval2;

知道如何在 PHP 中执行这种类型的间隔加法以获得总小时和分钟格式的两个间隔的总和

最佳答案

PHP 没有运算符重载*,因此带有对象的 + 使 PHP 尝试首先将它们转换为字符串,但 DateInterval 不支持:

interval 1: 03:05
interval 2: 05:00
Total interval : 08:05

相反,您需要创建一个新的 DateTime 对象,然后使用 add 函数添加间隔,最后显示与引用点的差异:

$e = new DateTime('00:00');
$f = clone $e;
$e->add($interval1);
$e->add($interval2);
echo "Total interval : ", $f->diff($e)->format("%H:%I"), "\n";

完整示例/( Demo ):

$a = new DateTime('14:25');
$b = new DateTime('17:30');
$interval1 = $a->diff($b);
echo "interval 1: ", $interval1->format("%H:%I"), "\n";

$c = new DateTime('08:00');
$d = new DateTime('13:00');
$interval2 = $c->diff($d);
echo "interval 2: ", $interval2->format("%H:%I"), "\n";

$e = new DateTime('00:00');
$f = clone $e;
$e->add($interval1);
$e->add($interval2);
echo "Total interval : ", $f->diff($e)->format("%H:%I"), "\n";

您可能还想考虑查看 DateInterval 如何存储其值,然后从它扩展以进行您自己的计算。下面的例子(Demo)比较粗略,没有考虑到the inverted thingy , 它确实 not (re)set $days to false我还没有检查/测试 the period specifier on creation 的 ISO 规范但我认为展示这个想法就足够了:

class MyDateInterval extends DateInterval
{
    /**
     * @return MyDateInterval
     */
    public static function fromDateInterval(DateInterval $from)
    {
        return new MyDateInterval($from->format('P%yY%dDT%hH%iM%sS'));
    }
                                  
    public function add(DateInterval $interval)
    {
        foreach (str_split('ymdhis') as $prop)
        {
            $this->$prop += $interval->$prop;
        }
    }
}

$a = new DateTime('14:25');
$b = new DateTime('17:30');
$interval1 = $a->diff($b);
echo "interval 1: ", $interval1->format("%H:%I"), "\n";

$c = new DateTime('08:00');
$d = new DateTime('13:00');
$interval2 = $c->diff($d);
echo "interval 2: ", $interval2->format("%H:%I"), "\n";
                                  
$e = MyDateInterval::fromDateInterval($interval1);
$e->add($interval2);
echo "Total interval: ", $e->format("%H:%I"), "\n";

* 如果你写一个 PHP 扩展,它实际上是可能的(至少在某种程度上)。

关于php - 我们如何在 PHP 中添加两个日期间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11556731/

相关文章:

javascript - 需要帮助查找数组中所有数字的总和

php - 为什么我的 sql 准备语句没有给出正确的响应?

MYSQL 选取每个日期的最晚时间

c++ - 使用 std::get_time 转换 ANSI C 的 asctime() 格式

javascript - 在 moment.js 中以 ISO 日期格式将时间部分设置为 0

python - 返回类型不同,重载__add__

Php:将可变天数添加到 Y-m-d 日期格式

php - 在 PHP 中实例化类实例的不同方法

php - Laravel UNION ALL 不使用 where 语句

php - 在 cakephp 中使用模型类名 "Class"