PHP时间四舍五入

时间:2015-06-02 18:57:58

标签: php date time rounding

我在PHP中使用舍入时间时遇到了困难。

我想要的是生成一个基于当前日期的数字,但对应于最接近的" 3小时间隔"在将来。

很难解释,最好是举例:

当前日期时间(YYYYMMDDHHMM)= 201506021026

结果:时间戳为201506021200

当前日期和时间= 201506021825

结果:时间戳为201506022100

换句话说,我总是需要一个0AM,3AM,6AM,9AM,...... 21PM的最接近未来值的时间戳。

如果时间已经过了晚上9点,那么它将成为第二天凌晨0点的时间戳。

3 个答案:

答案 0 :(得分:1)

$timestamp = time();
$threeHours = (3 * 60 * 60);
$timestamp += $threeHours;
$reminder = $timestamp % $threeHours;
$timestamp -= $reminder;

如果您想在过去找到最接近的“3小时间隔”,请不要将$threeHours添加到$timestamp;

我准备了一个考虑时区的代码段:http://3v4l.org/XOXMM

希望能解决你的问题。

答案 1 :(得分:0)

    <?php

    // find next hour accurate timestamp
    $hour = date("G");
    echo "hour: $hour <br />";
    if ($hour <= 21) {
        echo "still today...<br />";
        for ($hour; $hour <= 24 ; $hour++) {
            if ($hour %3 == 0) {
                $close = strtotime("$hour:00:00");
                echo "close hour: ".$close ."<br />";

                // now from $close str time add 3 hours
                for ($need =1; $need <= 12; $need++) {
                    $t += 3600*3;
                    echo date("y/m/d G:i:s" , $close + $t) . "<br />";

                }
                break;
            }
        }
    } else {
        echo "finding tomorrow...<br />";

    }



    $next = strtotime("6 hour");
    echo date("y/m/d G:i:s" , $next);

    echo "<br />";
    echo date("y/m/d G:i:s");

结果:

hour: 19 
still today...
close hour: 1433278800
15/06/03 0:00:00
15/06/03 3:00:00
15/06/03 6:00:00
15/06/03 9:00:00
15/06/03 12:00:00
15/06/03 15:00:00
15/06/03 18:00:00
15/06/03 21:00:00
15/06/04 0:00:00
15/06/04 3:00:00
15/06/04 6:00:00
15/06/04 9:00:00
15/06/03 1:52:15
15/06/02 19:52:15

答案 2 :(得分:0)

这可以通过 -
来完成 (1)使用createFromFormat()
将您的日期时间字符串转换为php DateTime对象 (2)慢慢来。
(3)检查它是否超过21:009:00pm),如果是,请转到第二天并将时间设置为00:00
(4)如果未超过21:009:00pm),则将时间除以300(3小时递增),使用ceil()向上舍入到下一个整数,然后按3(增加3小时)来获得下一个区块。
(5)重新格式化为你的日期时间字符串格式。

$date = DateTime::createFromFormat('YmdHi', '201506021026');

$time = $date->format('Hi');
if($time > 2100){
    $date->add(new DateInterval('P1D'));
    $date->setTime(00,00);
}
else{
    $date->setTime(ceil($time/300)*3,00);   
}
echo $date->format('YmdHi');
//Result: 201506021200

修改

从您对@AliTorabi的评论,如果您想获得20个间隔,可以通过添加循环添加3小时轻松完成

$date = DateTime::createFromFormat('YmdHi', '201506021026');

$time = $date->format('Hi');
if($time > 2100){
    $date->add(new DateInterval('P1D'));
    $date->setTime(00,00);
}
else{
    $date->setTime(ceil($time/300)*3,00);   
}
echo $date->format('YmdHi')."<br />"; // iteration 1
for($i=0;$i<19;$i++){ // iterations 2-20
    $date->add(new DateInterval('PT3H'));
    echo $date->format('YmdHi')."<br />";
}