Fechas en formato tiempo transcurrido(time ago) con PHP
Autor: aartiles | Archivado en: PHP el día 19/Ene/2010
La verdad que no sé quién fue el primero en usar las fechas en formato de tiempo transcurrido hasta el momento actual, estilo hace 4 minutos atrás o hace cerca de 1 minuto… yo lo vi por primera vez, o mejor dicho me llamó la atención por primera vez en Gmail, esa interfaz que nos cambió la forma de pensar a muchos.
Con el auge de la web en tiempo real, las fechas en formato tradicional nos dicen ya bien poco,… una fecha en formato time ago o formato tiempo transcurrido nos permite tener una rápida percepción de la antigüedad de un mensaje. Por ejemplo me parece un sacrilegio que un cliente de Twitter como TweetDeck use el formato de fechas tradicionales.
Aquí os dejo una función PHP para calcular las fechas en formato de tiempo transcurrido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | public function timeAgoDate($datefrom, $dateto = -1) { // Defaults and assume if 0 is passed in that // its an error rather than the epoch if ($datefrom <= 0) { return "A long time ago"; } if($dateto==-1) { $dateto = time(); } // Calculate the difference in seconds betweeen // the two timestamps $difference = $dateto - $datefrom; // If difference is less than 60 seconds, // seconds is a good interval of choice if($difference < 60) { $interval = "s"; } // If difference is between 60 seconds and // 60 minutes, minutes is a good interval elseif($difference >= 60 && $difference < 60*60) { $interval = "n"; } // If difference is between 1 hour and 24 hours // hours is a good interval elseif($difference >= 60*60 && $difference < 60*60*24) { $interval = "h"; } // If difference is between 1 day and 7 days // days is a good interval elseif($difference >= 60*60*24 && $difference < 60*60*24*7) { $interval = "d"; } // If difference is between 1 week and 30 days // weeks is a good interval elseif($difference >= 60*60*24*7 && $difference < 60*60*24*30) { $interval = "ww"; } // If difference is between 30 days and 365 days // months is a good interval, again, the same thing // applies, if the 29th February happens to exist // between your 2 dates, the function will return // the 'incorrect' value for a day elseif($difference >= 60*60*24*30 && $difference < 60*60*24*365) { $interval = "m"; } // If difference is greater than or equal to 365 // days, return year. This will be incorrect if // for example, you call the function on the 28th April // 2008 passing in 29th April 2007. It will return // 1 year ago when in actual fact (yawn!) not quite // a year has gone by elseif($difference >= 60*60*24*365) { $interval = "y"; } // Based on the interval, determine the // number of units between the two dates // From this point on, you would be hard // pushed telling the difference between // this function and DateDiff. If the $datediff // returned is 1, be sure to return the singular // of the unit, e.g. 'day' rather 'days' switch($interval) { case "m": $months_difference = floor($difference / 60 / 60 / 24 / 29); while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom) + ($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) { $months_difference++; } $datediff = $months_difference; // We need this in here because it is possible // to have an 'm' interval and a months // difference of 12 because we are using 29 days // in a month if($datediff == 12) { $datediff--; } $res = ($datediff==1) ? "$datediff month ago" : "$datediff months ago"; break; case "y": $datediff = floor($difference / 60 / 60 / 24 / 365); $res = ($datediff==1) ? "$datediff year ago" : "$datediff years ago"; break; case "d": $datediff = floor($difference / 60 / 60 / 24); $res = ($datediff==1) ? "$datediff day ago" : "$datediff days ago"; break; case "ww": $datediff = floor($difference / 60 / 60 / 24 / 7); $res = ($datediff==1) ? "$datediff week ago" : "$datediff weeks ago"; break; case "h": $datediff = floor($difference / 60 / 60); $res = ($datediff==1) ? "$datediff hour ago" : "$datediff hours ago"; break; case "n": $datediff = floor($difference / 60); $res = ($datediff==1) ? "$datediff minute ago" : "$datediff minutes ago"; break; case "s": $datediff = $difference; $res = ($datediff==1) ? "$datediff second ago" : "$datediff seconds ago"; break; } return $res; } |
El principal problema de este formato de fecha es que al ser relativas a la hora actual, si se trata de una página pensada para que el usuario permanezca mucho tiempo en ella, como por ejemplo redes sociales, o clientes de correo como Gmail entonces al pasar algunos minutos la fecha pierde valor. Para ello necesitaríamos actualizarla cada 1 minuto con javascript o simplemente actualizar la página.
Fuente: PHP Time Ago Calculation
Posts Relacionados













Información Bitacoras.com…
Valora en Bitacoras.com: La verdad que no sé quién fue el primero en usar la fechas en formato de tiempo transcurrido hasta el momento actual, estilo hace 4 minutos atrás o hace cerca de 1 minuto… yo lo vi por primera vez, o mejor dicho me llamó …
No está nada mal, pero que nada mal ;-)
Ahora, solo dos cositas que igual hacen algo más potente el script y más eficiente.
1ª Si hay que anidar varios if elseif es casi seguro que la opción de un switch será la más óptima ;-) — Y si, en tu caso tmb se puede hacer un switch
2º Una vez creada la función, porque no utilizas mejor la clase DateTime de PHP?? que te ayudará y te quitará problemas…
Yo crearía una clase que extendiera la de DateTime y añadiría esa función…
Claro que igual tienes PHP >= 5.3.0 entonces tienes DateTime::diff que creo que hace justo esto (tengo aquí 5.2.8 y no he podido probarlo ;-)
Buenas aportaciones Ángel Luis :-)… la función la he puesto tal como la he cogido de la citada fuente, me imagino que existan muchas más alternativas.
Mi objetivo más bien era enfatizar la importancia de cambiar el chip y utilizar este tipo de fechas en las aplicaciones relacionadas con la web en tiempo real.
[...] si hay nuevos correos en el servidor para mostrarlos, además actualizando cada un minuto las fechas en formato time ago para mostrar el tiempo transcurrido desde que se recibió el correo. Si cambiamos de pestaña, [...]
Hola os dejo aqui un ejemplo en pastebin de como seria el código en c#
http://pastebin.com/d5f739646
[...] La inspiración de este articulo me vino del el excelente artículo de Alfredo Artiles sobre Fechas en formato tiempo transcurrido(time ago) con PHP Etiquetas: C# ¡Comparte este [...]
y un ejemplo de como usar la función? por que imagino que se guardará el script en un archivo y será llamado, pero ¿cuando y donde es llamado?
gracias.