How do I round the result of time() up (towards the future) to the next multiple of 5 minutes?
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));
}