12

我想将时间添加到现有日期。我有 2 个字符串变量:

$date     = "2013-01-05 10:55:15";
$interval =            "50:25:10";

我想计算最终日期“2013-01-07 13:20:25”。时间的小时数可以大于 23,这意味着这个时间间隔可以大于一整天。

最好的方法是什么?

4

5 回答 5

14

使用日期时间 API

$date = new DateTime("2013-01-05 10:55:15");
$date->add(new DateInterval("PT50H25M10S"));

然后您可以将其转换回字符串,其日期格式与您将在date()函数中使用的日期格式相同,如果您愿意:

$string = $date->format("Y-m-d H:i:s");

有关DateInterval定义的更多信息,请访问此页面:

日期间隔

格式以字母 P 开头,表示“句号”。每个持续时间段由一个整数值表示,后跟一个时间段指示符。如果持续时间包含时间元素,则规范的该部分以字母 T 开头。

这里有一些简单的例子。两天是P2D。两秒是PT2S。六年零五分钟是P6YT5M。

所以在这种情况下PT50H25M10S意味着 50 小时 25 分钟和 10 秒

请注意,DateInterval 仅从 PHP 5.3 开始可用,如果您必须使用较低版本,则可以使用以下内容:

 $time = strtotime("2013-01-05 10:55:15");
 $time += 55*60*60 + 25*60 + 10;
 $newDate = date("Y-m-d H:i:s");
于 2013-09-26T19:10:54.377 回答
6

这有点棘手。

通常,如果它是静态周期或单一周期类型,您会在此处执行以下操作:

$date = "2013-01-05 10:55:15";
$time = new DateTime($date);
$time->add(new DateInterval('PT5M'));

这将使日期时间增加 5 分钟。但是我怀疑你可以传递整个间隔。所以你可能需要做的是将间隔分割为 : 然后将间隔的每个部分(我假设它是动态的?)分别添加到日期。所以首先是几小时,然后是几分钟,然后是几秒钟

有关这方面的更多信息,请参见此处:http ://www.php.net/manual/en/datetime.add.php

于 2013-09-26T19:10:04.730 回答
5

使用DateIntervalDateTime->add()

$date = new DateTime("2013-01-05 10:55:15");
$date->add(new DateInterval("PT50H25M10S"));
于 2013-09-26T19:08:44.970 回答
5

您可以先分解间隔,然后获取小时、分钟、秒,然后使用 DateTimeadd()来添加间隔,如下所示:

$interval = '50:25:10';
$datestring = '2013-01-05 10:55:15';    
list($hours, $minutes, $seconds) = explode(':', $interval); 

$date = new DateTime($datestring);    
$date->add(new DateInterval('PT'.$hours.'H'.$minutes.'M'.$seconds.'S'));
echo $date->format('Y-m-d H:i:s');

演示!

于 2013-09-26T19:20:16.360 回答
1

In case anyone needs based on answers above, I made my function like this:

public function addTime($date, $time) {
    $atime = explode(":", $time);
    $_date = date_create_from_format("Y-m-d H:i:s", $date);
    $_date->add(new DateInterval("PT" . intval($atime[0])."H".intval($atime[1])."M".intval($atime[2])."S"));
    return $_date->format("Y-m-d H:i:s");
}

hope it helps someone

于 2013-09-26T23:46:18.350 回答