PHP:将两个时间戳之间的时间划分为相等的卡住间隔的函数


PHP: Function to divide the time between two timestamps into equal intervals getting stuck

我有一个函数,我将总共5个参数传递给它。

$Date1, $Time1, $Date2 and $Time2 and $Interval.

我首先使用Date1Time1形成时间戳1,然后使用Date2Time2形成时间戳2,然后将这两个时间戳划分为相等的小时间隔,然后存储到关联数组中。

例如

$Date1 = 27-03-2016
$Time1 = 18:00
$Date2 = 27-03-2016
$Time2 = 21:00

现在我想把这个时间分成60分钟的相等时间间隔,然后把它存储到下面格式的关联数组中。

$array=[27-03-2016=>18:00,27-03-2016=>19:00,27-03/2016=>20:00,27-03.2016=>21:00]

我用php编写了以下函数。当我运行这个程序时,文件将永远挂起,没有任何响应,当我检查服务器日志时,它会给出错误:行超过了30秒的最大执行时间

$end_time = date('H-i',strtotime($end_timestamp));

由于我对php还比较陌生,所以我无法理解出了什么问题。

function FindTimeSpan (&$Date1,&$Time1,&$Date2,&$Time2,&$Interval)
{
    $timespan=array($Date1 => $Time1);
    $timestamp1 = strtotime($Date1 . $Time1);
    $timestamp2 = strtotime($Date2 . $Time2);
    while( $Date1 < $Date2)
    {
        $start_timestamp = $timestamp1;
        $end_timestamp = $timestamp2 . '+' .$Interval;
        //Separating Date and Time from a timestamp
        $end_date = date('Y-m-d',strtotime($end_timestamp));
        $end_time = date('H-i',strtotime($end_timestamp));
        //pushing value to an array
        $timespan = array_merge($timespan, array($end_date => $end_time));
        //setting the start value to the new end value
        $timestamp1 = $end_timestamp;
    }
    echo 'timestamp array' . json_encode($timespan);
}

您遇到的问题是一个无限循环,它是由条件$Date1 < $Date2引起的。您不修改这两个值中的任何一个,因此条件将始终为true。奇怪的是,您没有使用修改后的不同timestamp值,但您应该这样做。

关于这一点,您应该将$end_timestamp = $timestamp2 . '+' .$Interval;简单地替换为$end_timestamp = $timestamp2 + $Interval ;。使用单引号和点会使PHP将其视为字符串运算,而不是数学运算。有了这个并使用这个循环条件$timestamp1 < $timestamp2,您的代码应该停止。

正如在一条评论中所说,你的数组结构是不可能的,因为你不能多次为同一个键赋值。相反,您应该为每个日期创建一个数组,并将不同的时间推送到这些数组中。

要做到这一点,您应该首先修复在循环中检索日期和时间的方式。在下面的代码中,对strtotime的调用是不必要的,因为函数date需要时间戳,所以不需要将其转换回字符串。

    //Separating Date and Time from a timestamp
    $end_date = date('Y-m-d',strtotime($end_timestamp));
    $end_time = date('H-i',strtotime($end_timestamp));

你也应该保持一致,这里使用的日期格式与你举的示例格式不一致。

现在,根据您上面的建议,我对代码和需求进行了一些更改。

  1. 我还没有决定使用Assoc数组。

  2. 相反,我将在相等的时间间隔之间划分两个邮票(假设这是可能的)。

  3. 然后我正在做这个字符串的简单数组推送。

  4. 稍后,一旦这个数组形成,我将解析它,并将Date和Time分开。

现在,当我比较这两个时间戳时,我的代码并没有进入无限循环。但现在的问题是,它将第一个值推送到数组,但所有后续值都被推送为空

所以我从下面的代码中得到的输出如下array[1459051200,null,null,null,……]

以下是代码

$Date1 = "2016-03-27";
$Time1 = "00:00";
$Date2 = "2016-03-30";
$Time2 = "22:00";
$Interval = '60';
FindTimeSpan ($Date1, $Time1, $Date2, $Time2, $Interval);
function FindTimeSpan (&$Date1,&$Time1,&$Date2,&$Time2,&$Interval)
{
$timestamp1 = strtotime($Date1 . $Time1);
$timespan=array();
array_push($timespan,$timestamp1);
echo 'Value of array timespan' . json_encode($timespan);
$timestamp2 = strtotime($Date2 . $Time2);
while( $timestamp1 < $timestamp2)
{
$start_timestamp = $timestamp1;
$end_timestamp = $timestamp1 + $Interval;
//pushing value to an array
array_push($timespan,$end_timespan);
//
$timestamp1 = $end_timestamp;
}
echo 'timestamp array' . json_encode($timespan);
}