首页 > 解决方案 > 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 循环有错误,可能有什么问题?

标签: php

解决方案


我不会使用该代码,而不是解决问题,只需使用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
        )

)

推荐阅读