with strip_tags remove ent_quotes ejemplo php date time floor

php - strip_tags - Minuto redondo hasta el cuarto más cercano



strip_tags wordpress (14)

Últimamente me gusta abordar un problema con la TDD / unidad de prueba . No estoy programando mucho PHP últimamente, pero esto es lo que se me ocurrió. Para ser sincero, en realidad miré los ejemplos del código aquí, y seleccioné el que creía que ya era correcto. A continuación, quería verificar esto mediante pruebas unitarias usando las pruebas que proporcionó anteriormente.

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

hora de clase

<?php class Time { private $hours; private $minutes; public static function create($timestr) { $hours = date(''g'', strtotime($timestr)); $minutes = date(''i'', strtotime($timestr)); return new Time($hours, $minutes); } public function __construct($hours, $minutes) { $this->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; } }

Prueba de carrera

alfred@alfred-laptop:~/htdocs/time$ phpunit TimeTest.php PHPUnit 3.3.17 by Sebastian Bergmann. .... Time: 0 seconds OK (4 tests, 12 assertions)

Necesito redondear los tiempos al cuarto de hora más cercano en PHP. Los tiempos se extraen de una base de datos MySQL de una columna de fecha y formato como 2010-03-18 10:50:00 .

Ejemplo:

  • 10:50 debe ser 10:45
  • 1:12 necesita ser 1:00
  • 3:28 necesita ser 3:15
  • etc.

Supongo que floor() está involucrado, pero no estoy seguro de cómo hacerlo.

Gracias


Aquí hay una función que estoy usando actualmente:

/** * Rounds a timestamp * * @param int $input current timestamp * @param int $round_to_minutes rounds to this minute * @param string $type auto, ceil, floor * @return int rounded timestamp */ static function roundToClosestMinute($input = 0, $round_to_minutes = 5, $type = ''auto'') { $now = !$input ? time() : (int)$input; $seconds = $round_to_minutes * 60; $floored = $seconds * floor($now / $seconds); $ceiled = $seconds * ceil($now / $seconds); switch ($type) { default: $rounded = ($now - $floored < $ceiled - $now) ? $floored : $ceiled; break; case ''ceil'': $rounded = $ceiled; break; case ''floor'': $rounded = $floored; break; } return $rounded ? $rounded : $input; }

Espero que ayude a alguien :)


Es una vieja pregunta, pero habiéndome implementado recientemente, compartiré mi solución:

public function roundToQuarterHour($datetime) { $datetime = ($datetime instanceof DateTime) ? $datetime : new DateTime($datetime); return $datetime->setTime($datetime->format(''H''), ($i = $datetime->format(''i'')) - ($i % 15)); } public function someQuarterHourEvent() { print_r($this->roundToQuarterHour(new DateTime())); print_r($this->roundToQuarterHour(''2016-10-19 10:50:00'')); print_r($this->roundToQuarterHour(''2016-10-19 13:12:00'')); print_r($this->roundToQuarterHour(''2016-10-19 15:28:00'')); }


Escribí una función que hace el truco para redondear las marcas de tiempo a segundos o minutos.

Puede que no sea la forma más eficiente, pero creo que PHP no se preocupa por unos pocos bucles simples.

En tu caso, solo pasas tu fecha de MySQL así:

<?php echo date(''d/m/Y - H:i:s'', roundTime(strtotime($MysqlDateTime), ''i'', 15)); ?>

Devoluciones: el valor redondeado de closests (¡mira hacia arriba y hacia abajo!)

La función:

<?php function roundTime($time, $entity = ''i'', $value = 15){ // prevent big loops if(strpos(''is'', $entity) === false){ return $time; } // up down counters $loopsUp = $loopsDown = 0; // loop up $loop = $time; while(date($entity, $loop) % $value != 0){ $loopsUp++; $loop++; } $return = $loop; // loop down $loop = $time; while(date($entity, $loop) % $value != 0){ $loopsDown++; $loop--; if($loopsDown > $loopsUp){ $loop = $return; break; } } $return = $loop; // round seconds down if($entity == ''i'' && date(''s'', $return) != 0){ while(intval(date(''s'', $return)) != 0){ $return--; } } return $return; } ?>

Usted simplemente reemplaza $ entity por ''s'' si quiere redondear hacia arriba o hacia abajo a segundos y reemplaza 15 por la cantidad de segundos o minutos que desea subir o bajar.


Necesitaba una forma de redondear el día y cortar todo más allá de eso:

$explodedDate = explode("T", gmdate("c",strtotime("now"))); $expireNowDate = date_create($explodedDate[0]);

El strtotime me da una marca de tiempo para "ahora", que gmdate convierte a formato ISO (algo así como "2012-06-05T04: 00: 00 + 00: 00"), luego uso explotar en la "T", dándome " 2012-06-05 "en el índice zeroth de $ explodedDate, que luego se pasa a date_create para obtener un objeto de fecha.

No estoy seguro de si todo eso es necesario, pero parece mucho menos trabajo que pasar y restar los segundos, minutos, horas, etc.


Para mi sistema, quería agregar trabajos que están programados para ejecutarse cada 5 minutos en mi servidor, y quiero que el mismo trabajo se ejecute en el siguiente bloque de 5 minutos, luego 15, 30, 60, 120, 240 minutos, 1 día y 2 días después, así que eso es lo que calcula esta función

function calculateJobTimes() { $now = time(); IF($now %300) { $lastTime = $now - ($now % 300); } ELSE { $lastTime = $now; } $next[] = $lastTime + 300; $next[] = $lastTime + 900; $next[] = $lastTime + 1800; $next[] = $lastTime + 3600; $next[] = $lastTime + 7200; $next[] = $lastTime + 14400; $next[] = $lastTime + 86400; $next[] = $lastTime + 172800; return $next; } echo "The time now is ".date("Y-m-d H:i:s")."<br /> Jobs will be scheduled to run at the following times:<br /><br /> <ul>"; foreach(calculateJobTimes() as $jTime) { echo "<li>".date("Y-m-d H:i:s", $jTime).''</li>''; } echo ''</ul>'';


Para redondear el uso del cuarto de hora más cercano por debajo del código

<?php $time = strtotime("01:08"); echo $time.''<br />''; $round = 15*60; $rounded = round($time / $round) * $round; echo date("H:i", $rounded); ?>

01:08 convertido en 01:15


Podría ayudar a otros. Para cualquier idioma

roundedMinutes = yourRoundFun(Minutes / interval) * interval.

Ej. El intervalo puede ser de 5 minutos, 10 minutos, 15 minutos, 30 minutos. Luego, los minutos redondeados se pueden restablecer a la fecha correspondiente.

yourDateObj.setMinutes(0) yourDateObj.setMinutes(roundedMinutes)


Solución simple:

$oldDate = "2010-03-18 10:50:00"; $date = date("Y-m-d H:i:s", floor(strtotime($oldDate) / 15 / 60) * 15 * 60);

Puede cambiar de floor a ceil si desea redondear.


Su función completa sería algo como esto ...

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


$minutes = ($minutes - ($minutes % 15));


$now = getdate(); $minutes = $now[''minutes''] - $now[''minutes'']%15; //Can add this to go to the nearest 15min interval (up or down) $rmin = $now[''minutes'']%15; if ($rmin > 7){ $minutes = $now[''minutes''] + (15-$rmin); }else{ $minutes = $now[''minutes''] - $rmin; } $rounded = $now[''hours''].":".$minutes; echo $rounded;


$seconds = time(); $rounded_seconds = round($seconds / (15 * 60)) * (15 * 60); echo "Original: " . date(''H:i'', $seconds) . "/n"; echo "Rounded: " . date(''H:i'', $rounded_seconds) . "/n";

Este ejemplo obtiene la hora actual y la redondea al cuarto más cercano e imprime tanto el tiempo original como el redondeado.

PD : si quiere redondearlo, reemplace round() con floor() .


// time = ''16:58'' // type = auto, up, down function round_time( $time, $round_to_minutes = 5, $type = ''auto'' ) { $round = array( ''auto'' => ''round'', ''up'' => ''ceil'', ''down'' => ''floor'' ); $round = @$round[ $type ] ? $round[ $type ] : ''round''; $seconds = $round_to_minutes * 60; return date( ''H:i'', $round( strtotime( $time ) / $seconds ) * $seconds ); }