65 votes

Arrondir la minute à la quinzaine la plus proche

Je dois arrondir les heures à la minute la plus proche en PHP. Les heures sont extraites d'une base de données MySQL depuis une colonne datetime et formatées comme 2010-03-18 10:50:00.

Exemple :

  • 10:50 doit être 10:45
  • 1:12 doit être 1:00
  • 3:28 doit être 3:15
  • etc.

Je suppose que floor() est impliqué mais je ne suis pas sûr de la marche à suivre.

Merci

7 votes

Si vous arrondissiez à la quart d'heure le plus proche, 1:12 ne deviendrait-il pas 1:15 et 3:28 ne deviendrait-il pas 3:30 ? Plutôt, n'êtes-vous pas en train d'arrondir à la baisse au quart d'heure près ? La première option est un peu plus difficile que la seconde...

0 votes

Désolé, oui c'était le but. Arrondir À LA BAISSE à la quinzaine la plus proche.

0 votes

Fonction pour arrondir arbitrairement les DateTimes PHP : stackoverflow.com/a/57399274/339440

82voto

Veger Points 17657
$secondes = time();
$secondes_arrondies = round($secondes / (15 * 60)) * (15 * 60);

echo "Original : " . date('H:i', $secondes) . "\n";
echo "Arrondi : " . date('H:i', $secondes_arrondies) . "\n";

Cet exemple récupère l'heure actuelle et l'arrondit au plus proche quart d'heure, puis affiche à la fois l'heure d'origine et l'heure arrondie.

PS : Si vous voulez arrondir vers le bas, remplacez round() par floor().

12 votes

Vous pouvez utiliser ceil () / floor() en complément de round() si vous voulez forcer votre temps vers le haut/vers le bas, respectivement.

3 votes

Simple, intelligent et facilement personnalisable. Génial!

36voto

Wickethewok Points 2212

Votre fonction complète ressemblerait à ceci...

fonction roundToQuarterHour($timestring) {
    $minutes = date('i', strtotime($timestring));
    return $minutes - ($minutes % 15);
}

1 votes

Nous avons supprimé la fonction et suivi cette route : $start_minutes = date('i', strtotime($row['start'])); $minutes_floor = $start_minutes - ($start_minutes % 15);

8 votes

Si $minutes = 29, il renverra 15 - doit renvoyer 30

0 votes

Comment faire arrondir vers le haut. Comme 9.10 arrondi à 9.15 et 9.20 à 9.30 de la même manière

12voto

Richard JP Le Guen Points 13306
$now = getdate();
$minutes = $now['minutes'] - $now['minutes']%15;

 //Peut ajouter ceci pour aller à l'intervalle de 15 minutes le plus proche (vers le haut ou vers le bas)
  $rmin  = $now['minutes']%15;
  if ($rmin > 7){
    $minutes = $now['minutes'] + (15-$rmin);
   }else{
      $minutes = $now['minutes'] - $rmin;
  }

$rounded = $now['hours'].":".$minutes;
echo $rounded;

0 votes

J'ai constaté que si l'heure est quelque chose comme 10:59, elle est arrondie à 10:60. Pour résoudre cela, j'ai ajouté : if ($minutes == "60") { $rounded = $date_split['hour']+1; $rounded .= ":00"; } else { $minutes = str_pad($minutes, 2, '0', STR_PAD_LEFT); $rounded = $date_split['hour'].":".$minutes; } également str_pad pour garantir le zéro de tête partout. Cette solution pourrait ne pas être optimale mais fonctionne bien.

6voto

Scott Saunders Points 12721
$minutes = ($minutes - ($minutes % 15));

0 votes

Donc 1:19 devient (19%15)*15 = 4*15 = 60!?

0 votes

Merci Richard. Ma tête est ailleurs.

6voto

Alfred Points 32190

Récemment, j'aime aborder un problème de la manière TDD/test unitaire. Je ne programme plus autant en PHP ces derniers temps, mais voici ce que j'ai concocté. Pour être honnête, j'ai en fait regardé les exemples de code ici, et j'ai choisi celui que je pensais déjà correct. Ensuite, je voulais vérifier cela par des tests unitaires en utilisant les tests que vous avez fournis ci-dessus.

class TimeTest

require_once 'PHPUnit/Framework.php';
require_once 'Time.php';

class TimeTest extends PHPUnit_Framework_TestCase 
{
    protected $time;

    protected function setUp() {
        $this->time = new Time(10, 50);
    }

    public function testConstructingTime() {
        $this->assertEquals("10:50", $this->time->getTime());
        $this->assertEquals("10", $this->time->getHours());
        $this->assertEquals("50", $this->time->getMinutes());        
    }

    public function testCreatingTimeFromString() {
        $myTime = Time::create("10:50");
        $this->assertEquals("10", $myTime->getHours());
        $this->assertEquals("50", $myTime->getMinutes());
    }

    public function testComparingTimes() {
        $timeEquals     = new Time(10, 50);
        $this->assertTrue($this->time->equals($timeEquals));
        $timeNotEquals  = new Time(10, 44);
        $this->assertFalse($this->time->equals($timeNotEquals));
    }

    public function testRoundingTimes()
    {
        // Round test time.
        $roundedTime = $this->time->round();
        $this->assertEquals("10", $roundedTime->getHours());
        $this->assertEquals("45", $roundedTime->getMinutes());

        // Test some more times.
        $timesToTest = array(
            array(new Time(1,00), new Time(1,12)),
            array(new Time(3,15), new Time(3,28)),
            array(new Time(1,00), new Time(1,12)),
        );

        foreach($timesToTest as $timeToTest) {
            $this->assertTrue($timeToTest[0]->equals($timeToTest[0]->round()));
        }        
    }
}

class Time

hours    = $hours;
        $this->minutes  = $minutes;
    }

    public function equals(Time $time) {
        return  $this->hours == $time->getHours() &&
                 $this->minutes == $time->getMinutes();
    }

    public function round() {
        $roundedMinutes = $this->minutes - ($this->minutes % 15);
        return new Time($this->hours, $roundedMinutes);
    }

    public function getTime() {
        return $this->hours . ":" . $this->minutes;
    }

    public function getHours() {
        return $this->hours;
    }

    public function getMinutes() {
        return $this->minutes;
    }
}

Exécution des tests

alfred@alfred-laptop:~/htdocs/time$ phpunit TimeTest.php 
PHPUnit 3.3.17 par Sebastian Bergmann.

....

Temps: 0 secondes

OK (4 tests, 12 assertions)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X