Redondea la marca de tiempo de php al minuto más cercano

3 minutos de lectura

Avatar de usuario de Lyon
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! 🙂

  • 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

Avatar de usuario de Yacoby
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 );
?>

http://php.net/manual/en/function.time.php

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é.

¿Ha sido útil esta solución?