PHP:用于将两个时间戳之间的时间分成相等的间隔卡住的功能

时间:2016-03-29 21:21:28

标签: php date timestamp associative-array strtotime

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

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

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

e.g。

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

3 个答案:

答案 0 :(得分:0)

遇到的问题是无限循环,这是由条件$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 :(得分:0)

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

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

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

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

  4. 稍后,一旦这个数组形成,我将解析它并将日期和时间分开。

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

    所以我从下面的代码得到的输出就像 阵列[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);
    }
    

答案 2 :(得分:-2)

问题是你的while循环while( $Date1 < $Date2){...}你永远不会改变$ Date1或$ Date2的值,所以循环继续使用if( $Date1 < $Date2){...}