2010-11-27 42 views
6

HI, tengo un par de publicaciones en mi servidor de base de datos MySql, uno de los contenidos de cada publicación es la fecha y hora en el formato datetime (Ej. 2010-11- 26 21:55:09) cuando se realizó la publicación.Calcula la diferencia entre dos fechas en PHP

Por lo tanto, quiero recuperar la fecha y hora reales del servidor SQL con la función AHORA() y calcular cuántos segundos o minutos u horas o días atrás se publicó la información.

No sé cómo crear este script php, pero sé que ya está hecho, así que gracias por cualquier ayuda.

Respuesta

4

Como dijo billythekid, puede utilizar la función date_diff() si está usando PHP5.3 +, si no lo está, hay varios métodos. Como se muestra en otros carteles. El método más rápido en MySQL para saber la división de tiempo en la jerarquía "hours: mins: secs" es usar TIMEDIFF() function.

SELECT TIMEDIFF(NOW(), '2010-11-26 12:00:00'); 

Si desea como segundo, utilizar las características de marca de tiempo Unix de MySQL o en PHP, puede convertir Fechas de MySQL de PHP rápidamente usando strtotime().

5

se puede utilizar la función date_diff()

http://php.net/manual/en/function.date-diff.php

Algo así como ...

<?php 
$now = time(); 
$then = $posttime; 
$diff = date_diff($now,$then); 
echo $diff->format('%R%d days'); #change format for different timescales 
?> 

edición -

realidad puedo solucionar este problema en uno de mi Twitter aplicaciones que utilizan esta función ...

function time_since ($start) 
{ 
    $end = time(); 
    $diff = $end - $start; 
    $days = floor ($diff/86400); //calculate the days 
    $diff = $diff - ($days*86400); // subtract the days 
    $hours = floor ($diff/3600); // calculate the hours 
    $diff = $diff - ($hours*3600); // subtract the hours 
    $mins = floor ($diff/60); // calculate the minutes 
    $diff = $diff - ($mins*60); // subtract the mins 
    $secs = $diff; // what's left is the seconds; 
    if ($secs!=0) 
    { 
     $secs .= " seconds"; 
     if ($secs=="1 seconds") $secs = "1 second"; 
    } 
    else $secs = ''; 
    if ($mins!=0) 
    { 
     $mins .= " mins "; 
     if ($mins=="1 mins ") $mins = "1 min "; 
     $secs = ''; 
    } 
    else $mins = ''; 
    if ($hours!=0) 
    { 
     $hours .= " hours "; 
     if ($hours=="1 hours ") $hours = "1 hour ";    
     $secs = ''; 
    } 
    else $hours = ''; 
    if ($days!=0) 
    { 
     $days .= " days "; 
     if ($days=="1 days ") $days = "1 day ";     
     $mins = ''; 
     $secs = ''; 
     if ($days == "-1 days ") { 
      $days = $hours = $mins = ''; 
      $secs = "less than 10 seconds"; 
     } 
    } 
    else $days = ''; 
    return "$days $hours $mins $secs ago"; 
} 

Lo pasa en una marca de tiempo Unix del tiempo para comprobar (el tiempo de publicación) y devuelve varias cadenas.

+2

Usted señor, acaba de hacer mi día. He estado necesitando algo como esto por un tiempo, ahora puedo contar la cantidad de minutos entre dos marcas de tiempo, completamente en PHP. Lo he convertido en un GIST si a alguien le interesa o le gustaría hacerlo más eficiente: https://gist.github.com/4347159 –

+0

No creo que date_diff tome tiempo() como entrada. Toma objetos DateTime. por lo que tendría que hacer algo como: ' $ fecha1 = date_create ("03/15/2013");' '$ la fecha 2 = date_create ("12/12/2013");' ' $ diff = date_diff ($ date1, $ date2); ' –

0

Una solución fácil es posible desde el interior de la consulta SQL:

SELECT UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(post_date) AS seconds_ago FROM posts 

Documentación aquí: MySQL Ref

4

Por lo general, lo hace este tipo de cosas en una consulta, pero MySQL no es muy bueno con intervalos (sería muy fácil con PostgreSQL). Se podría convertirlo en marca de tiempo Unix, entonces se daría el número de segundos entre las dos fechas:

SELECT UNIX_TIMESTAMP() - UNIX_TIMESTAMP(your_datetime_column); 

pensé en DATEDIFF, pero sólo devuelve el número de días entre las dos fechas.

Puede hacerlo en PHP, por ejemplo, la clase DateTime:

$date1 = new DateTime(); 
$date2 = new Datetime('2010-11-26 12:00:00'); 

var_dump($date1->diff($date2)); 

(Hay una forma de procedimiento para hacer esto, si no eres un fan de la programación orientada a objetos.)
Este es, sin duda la solución que usaría si no puedo hacerlo con el RDBMS. DateTime :: diff devuelve un objeto DateInterval, que contiene el número de segundos, minutos, horas, días, etc. entre las dos fechas.

También puede hacerlo con marcas de tiempo en PHP:

$num_sec = time() - strtotime('2010-11-26 12:00:00'); 

cual se devolvía lo mismo que la consulta SQL.

+0

Lo que hay que tener en cuenta es DateTime-> diff es una característica 5.3+, por lo que si está en 5.2.x, no funcionará para usted y lo hará tiene que ir con el SQL o convertir el tiempo en marcas de tiempo de Unix en PHP y hacerlo allí. – MBCook

Cuestiones relacionadas