11
votes

PHP TEMPS ROUTE () UP (Future) à la prochaine fois de 5 minutes

Comment puis-je arrondir le résultat de heure () haut (vers l'avenir) au prochain multiple de 5 minutes?


3 commentaires

le plus proche dans le futur ou dans le passé?


@hakre: Vous oubliez l'option du plus proche le plus proche, comme des travaux d'arrondi habituels. À 14h06, la 5 minutes la plus proche est dans le passé (14:05) et à 14h08, la 5 minutes la plus proche est à l'avenir (14:10). Dans la question originale (non éditée), il s'agissait clairement du délai de livraison de courrier électronique attendu (qui doit être à l'avenir).


@Jarrodroberson c'est MySQL, c'est juste PHP.


5 Réponses :


16
votes

Essayez:

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


2 commentaires

Alors que l'OP a demandé le «le plus proche» du contexte est décrit comme futur.


Cette solution est valable pour le plus proche. Utilisez rond pour le plus proche et CEIL pour l'avenir le plus proche. Bien que nous sommes ici, plancher devrait fonctionner pour la fin.



43
votes
 $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.

3 commentaires

OP a demandé "le plus proche" de ce fait, même si une seconde au-dessus d'une note de cinq minutes.


Je sais que pourquoi j'ai ajouté le commentaire. Par la description de son besoin de ce qu'il cherche, c'est le tour suivant 5 minutes, et pas le script le plus proche (il a dit "qui leur dirait quand leur email serait livré" - Futur Tense). Peut-être que je me trompe mais que ce que j'ai compris


Désolé pour la confusion, j'ai effectivement entendu dire à l'avenir et peu de temps après avoir posté cela réalisé que ceil existait, mais merci pour l'entrée!



11
votes

Essayez cette fonction:

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


0 commentaires

2
votes

pour les personnes utilisant Carbon (telle que les personnes utilisant Laravel), cela peut aider:

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));
}


0 commentaires

0
votes

pour utiliser Carbon :

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


0 commentaires