从午夜开始的PHP获取小时数差异范围失败

时间:2018-08-28 02:46:14

标签: php

我正在尝试从当前时间的午夜开始计时

现在应该是02:34,然后我希望得到

02:34 - 02:00,
01:00 - 02:00,
00:00 - 01:00

作为数组

所以我尝试了

function getFromMidnight(){
    $durations = [];
    $currentTime = strtotime("now");
    $iStartOfHour = $currentTime - ($currentTime % 3600);
    $midnight = strtotime('today midnight');

    $hours = floor(($iStartOfHour - $midnight)/3600);
    array_push($durations,["from"=>$currentTime, "to"=>$iStartOfHour]);

    if(floor(($iStartOfHour - $midnight)/3600) > 0){
        for ($val = 1;$val <= $hours;$val++){
            $newval = $val +=1;
            array_push($durations, ["from"=>strtotime('- '.$val.' hours',$iStartOfHour),"to"=>strtotime('- '.$newval.' hours',$iStartOfHour)]);
        }
    }

    return $durations; 
    }

对于第一个数组具有正确的持续时间,例如从上面的示例02:34-02:00开始,但是接下来的数组被弄乱了,给了我带有恒定时间戳的错误值,例如:01:00 - 01:00

我怀疑它的for循环出现错误,这可能是什么问题?

1 个答案:

答案 0 :(得分:1)

我不会使用该代码,而不是解决问题,而只需倒转DateInterval并向后工作。然后sub()循环中的小时数以获得偏移量。

<?php
date_default_timezone_set('UTC');

$begin = new DateTime('today midnight');
$end = new DateTime();

$interval = new DateInterval('PT60M');
$interval->invert = 1;
$daterange = new DatePeriod($begin, $interval, $end);

$range = [];
foreach ($daterange as $date){
    $range[] = [
        'from' => $date->format("H:i"),
        'to' => $date->sub($interval)->format("H:i")
    ];
}

print_r($range);

https://3v4l.org/BMSbI

结果:

Array
(
    [0] => Array
        (
            [from] => 00:00
            [to] => 01:00
        )

    [1] => Array
        (
            [from] => 01:00
            [to] => 02:00
        )

    [2] => Array
        (
            [from] => 02:00
            [to] => 03:00
        )

    [3] => Array
        (
            [from] => 03:00
            [to] => 04:00
        )

)