lyon
Suponiendo que tengo una marca de tiempo de Unix en PHP. ¿Cómo puedo redondear mi marca de tiempo php al minuto más cercano? Por ejemplo, 16:45:00 en lugar de 16:45:34?
¡Gracias por tu ayuda! 🙂
Yacoby
Si la marca de tiempo es una marca de tiempo de estilo Unix, simplemente
$rounded = round($time/60)*60;
Si es el estilo que indicó, simplemente puede convertirlo a una marca de tiempo de estilo Unix y viceversa
$rounded = date('H:i:s', round(strtotime('16:45:34')/60)*60);
round()
se utiliza como una forma sencilla de garantizar que se redondea a x
para valores entre x - 0.5 <= x < x + 0.5
. Si siempre quisiste redondear hacia abajo (como se indica), podrías usar floor()
o la función módulo
$rounded = floor($time/60)*60;
//or
$rounded = time() - time() % 60;
-
Yacoby, ¡gracias por la explicación completa! Ahora que lo mencionaste, round() es la función que prefiero tener. Tiene más sentido en mi aplicación. 🙂
– León
2 de marzo de 2010 a las 16:28
Una alternativa es esta:
$t = time();
$t -= $t % 60;
echo $t;
He leído que cada llamada a time()
en PHP tuvo que recorrer todo el camino a través de la pila hasta el sistema operativo. No sé si esto se ha cambiado en 5.3+ o no. El código anterior reduce las llamadas a time()…
Código de referencia:
$ php -r '$s = microtime(TRUE); for ($i = 0; $i < 10000000; $i++); $t = time(); $t -= $t %60; $e = microtime(TRUE); echo $e - $s . "\n\n";'
$ php -r '$s = microtime(TRUE); for ($i = 0; $i < 10000000; $i++); $t = time() - time() % 60; $e = microtime(TRUE); echo $e - $s . "\n\n";'
$ php -r '$s = microtime(TRUE); for ($i = 0; $i < 10000000; $i++); $t = floor(time() / 60) * 60; $e = microtime(TRUE); echo $e - $s . "\n\n";'
Curiosamente, más de 10,000,000 de iteraciones, los tres en realidad lo hacen al mismo tiempo;)
Ah maldita sea. Golpéame 🙂
Esta fue mi solución también.
<?php
$round = ( round ( time() / 60 ) * 60 );
echo date('h:i:s A', $round );
?>
Simplemente use lo siguiente:
$last_hour = date('Y-m-d H:00:00') // to last hour;
$last_minute = date('Y-m-d H:i:00') // to last minute;
Lo uso para eliminar viejos carritos de compras con fecha de caducidad (+ 5 minutos de gracia) en mi base de datos:
// clean expired shopping carts
function shop_clean_carts($grace = 5) {
$expiry = date('Y-m-d H:i:00', strtotime("-$grace minutes"));
$q = "DELETE FROM `shop__cart`
WHERE `expiry` < '$expiry'
AND `expiry` IS NOT NULL
AND `fk_order_id` IS NULL";
$db->query($q);
return;
}
Esto es mejor para mySql NOW() porque la consulta se almacenará en caché.
16:45:00 todavía tiene segundos… Creo que quiere decir que desea redondear al siguiente minuto más cercano, en lugar de eliminar segundos.
– Layke
2 de marzo de 2010 a las 16:12
Acabo de instalar PHP, así que puedo darte el código para hacerlo. No quiero adivinar porque odio el tiempo() . Responderé en 10 minutos si nadie más lo ha hecho.
– Layke
2 de marzo de 2010 a las 16:16
@Laykes codepad.org es bueno para hacer verificaciones rápidas de código
– Yacoby
2 de marzo de 2010 a las 16:23
gracias Laykes! Yacoby proporcionó lo que estaba buscando. Editaré mi pregunta para que quede más clara.
– León
2 de marzo de 2010 a las 16:24
@Yacoby: Eso es genial. Acabo de instalar una pila WAMP de todos modos. Lo he marcado.
– Layke
2 de marzo de 2010 a las 16:26