Jake Ball
Jake Ball

Reputation: 808

PHP round time() up (future) to next multiple of 5 minutes

How do I round the result of time() up (towards the future) to the next multiple of 5 minutes?

Upvotes: 12

Views: 18799

Answers (6)

Mathias
Mathias

Reputation: 67

I just leave this here because maybe someone is looking for the same solution. It's more complicated than I thought to just round up the actual Carbon Time to the next 5 minutes.

Here is my solution:

private function currentTimeRoundedUpToNext5Minutes($time = null): Carbon
{
    $now = $time ? Carbon::parse($time) : Carbon::now();

    // If the actual minute is divisible by 5 we want to add 5 minutes
    if ($now->minute % 5 == 0) {
        $now->minute += 5;
        $now->second(0);

        return $now;
    }

    // If it's not divisible by 5 we need to round up to next 5 minutes
    $roundedMinute = ceil($now->minute / 5) * 5;

    // If rounded minute is equal or greater than 60 - add an hour and set minutes to 0
    if ($roundedMinute >= 60) {
        $now->addHour();
        $now->minute = 0;
    } else {
        $now->minute = $roundedMinute;
    }

    $now->second(0);

    return $now;
}

Upvotes: 0

Lý Tự Tín
Lý Tự Tín

Reputation: 21

For using Carbon:

Carbon::createFromTimestamp(round(time() / 300) * 300)

Upvotes: 2

Ryan
Ryan

Reputation: 24035

For people using Carbon (such as people using Laravel), this can help:

/**
 * 
 * @param \Carbon\Carbon $now
 * @param int $nearestMin
 * @param int $minimumMinutes
 * @return \Carbon\Carbon
 */
public static function getNearestTimeRoundedUpWithMinimum($now, $nearestMin = 30, $minimumMinutes = 8) {
    $nearestSec = $nearestMin * 60;
    $minimumMoment = $now->addMinutes($minimumMinutes);
    $futureTimestamp = ceil($minimumMoment->timestamp / $nearestSec) * $nearestSec; 
    $futureMoment = Carbon::createFromTimestamp($futureTimestamp);
    return $futureMoment->startOfMinute();
}

These test assertions pass:

public function testGetNearestTimeRoundedUpWithMinimum() {
    $this->assertEquals('2018-07-07 14:00:00', TT::getNearestTimeRoundedUpWithMinimum(Carbon::parse('2018-07-06 14:12:59'), 60, 23 * 60 + 10)->format(TT::MYSQL_DATETIME_FORMAT));
    $this->assertEquals('2018-07-06 14:15:00', TT::getNearestTimeRoundedUpWithMinimum(Carbon::parse('2018-07-06 14:12:59'), 15, 1)->format(TT::MYSQL_DATETIME_FORMAT));
    $this->assertEquals('2018-07-06 14:30:00', TT::getNearestTimeRoundedUpWithMinimum(Carbon::parse('2018-07-06 14:12:59'), 30, 10)->format(TT::MYSQL_DATETIME_FORMAT));
    $this->assertEquals('2018-07-06 16:00:00', TT::getNearestTimeRoundedUpWithMinimum(Carbon::parse('2018-07-06 14:52:59'), 60, 50)->format(TT::MYSQL_DATETIME_FORMAT));
    $this->assertEquals(Carbon::parse('tomorrow 15:00:00'), TT::getNearestTimeRoundedUpWithMinimum(Carbon::parse('16:30'), 60, 60 * 22 + 30));
}

Upvotes: 3

Yaron U.
Yaron U.

Reputation: 7881

 $now = time();     
 $next_five = ceil($now/300)*300;

This will give you the next round five minutes (always greater or equal the current time).

I think that this is what you need, based on your description.

Upvotes: 48

user3567805
user3567805

Reputation:

Try this function:

function blockMinutesRound($hour, $minutes = '5', $format = "H:i") {
   $seconds = strtotime($hour);
   $rounded = round($seconds / ($minutes * 60)) * ($minutes * 60);
   return date($format, $rounded);
}

//call 
 blockMinutesRound('20:11');// return 20:10

Upvotes: 11

sagi
sagi

Reputation: 5737

Try:

$time = round(time() / 300) * 300;

Upvotes: 17

Related Questions