Presentador Virtual e24Presenter
Encuentra usuarios de Twitter en tu ciudad con LocaFollow

votarFechas 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

Alfredo ArtilesSoy Alfredo Artiles, Co-Fundador de equipo24, e24Presenter y e24Apps. Mi pasión es el AJAX, SEO, SEM y emprender todo lo que se me ponga por delante. Si me necesitas estoy 24x7 en Twitter @aartiles24.

Tags: , , ,
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • LinkedIn
  • Meneame
  • MySpace
  • Technorati
  • TwitThis
Posts Relacionados

7 Comentarios on “Fechas en formato tiempo transcurrido(time ago) con PHP”

  1. #1 Bitacoras.com dijo 11:11 am el Enero 19th, 2010:

    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ó …


  2. #2 Ángel Luis Quesada Nieto dijo 5:58 pm el Enero 19th, 2010:

    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 ;-)


  3. #3 aartiles dijo 9:46 pm el Enero 19th, 2010:

    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.


  4. #4 Idle Spy para Mootools - Detectando la ausencia de interacción - AJAX24 dijo 11:58 am el Enero 23rd, 2010:

    [...] 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, [...]


  5. #5 Juan Maria Nieves dijo 3:53 pm el Enero 23rd, 2010:

    Hola os dejo aqui un ejemplo en pastebin de como seria el código en c#

    http://pastebin.com/d5f739646


  6. #6 Time ago en c# | Un programador más dijo 4:03 pm el Enero 23rd, 2010:

    [...] 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 [...]


  7. #7 adrag dijo 1:47 am el Abril 13th, 2010:

    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.



Deja un comentario.