texto - Conversión de la marca de tiempo al tiempo anterior en PHP, por ejemplo, hace 1 día, hace 2 días...
string strip_tags (30)
Ejemplo de uso:
echo time_elapsed_string(''2013-05-01 00:22:35'');
echo time_elapsed_string(''@1367367755''); # timestamp input
echo time_elapsed_string(''2013-05-01 00:22:35'', true);
La entrada puede ser cualquier formato de fecha y hora admitido .
Salida:
4 months ago
4 months, 2 weeks, 3 days, 1 hour, 49 minutes, 15 seconds ago
Función:
function time_elapsed_string($datetime, $full = false) {
$now = new DateTime;
$ago = new DateTime($datetime);
$diff = $now->diff($ago);
$diff->w = floor($diff->d / 7);
$diff->d -= $diff->w * 7;
$string = array(
''y'' => ''year'',
''m'' => ''month'',
''w'' => ''week'',
''d'' => ''day'',
''h'' => ''hour'',
''i'' => ''minute'',
''s'' => ''second'',
);
foreach ($string as $k => &$v) {
if ($diff->$k) {
$v = $diff->$k . '' '' . $v . ($diff->$k > 1 ? ''s'' : '''');
} else {
unset($string[$k]);
}
}
if (!$full) $string = array_slice($string, 0, 1);
return $string ? implode('', '', $string) . '' ago'' : ''just now'';
}
Estoy tratando de convertir una marca de tiempo del formato 2009-09-12 20:57:19
y convertirlo en algo así como hace 3 minutes ago
con PHP.
Encontré un script útil para hacer esto, pero creo que está buscando un formato diferente para ser usado como la variable de tiempo. El script que quiero modificar para trabajar con este formato es:
function _ago($tm,$rcs = 0) {
$cur_tm = time();
$dif = $cur_tm-$tm;
$pds = array(''second'',''minute'',''hour'',''day'',''week'',''month'',''year'',''decade'');
$lngh = array(1,60,3600,86400,604800,2630880,31570560,315705600);
for($v = sizeof($lngh)-1; ($v >= 0)&&(($no = $dif/$lngh[$v])<=1); $v--); if($v < 0) $v = 0; $_tm = $cur_tm-($dif%$lngh[$v]);
$no = floor($no);
if($no <> 1)
$pds[$v] .=''s'';
$x = sprintf("%d %s ",$no,$pds[$v]);
if(($rcs == 1)&&($v >= 1)&&(($cur_tm-$_tm) > 0))
$x .= time_ago($_tm);
return $x;
}
Creo que en esas primeras líneas el guión está intentando hacer algo que se parece a esto (formato de fecha diferente):
$dif = 1252809479 - 2009-09-12 20:57:19;
¿Cómo haría para convertir mi marca de tiempo en ese formato (Unix?)?
Aquí está mi solución para un módulo de notificación que construí hace algún tiempo. Devuelve un resultado similar al desplegable de notificaciones de Facebook (por ejemplo, hace 1 día, ahora mismo, etc.)
public function getTimeDifference($time) {
//Let''s set the current time
$currentTime = date(''Y-m-d H:i:s'');
$toTime = strtotime($currentTime);
//And the time the notification was set
$fromTime = strtotime($time);
//Now calc the difference between the two
$timeDiff = floor(abs($toTime - $fromTime) / 60);
//Now we need find out whether or not the time difference needs to be in
//minutes, hours, or days
if ($timeDiff < 2) {
$timeDiff = "Just now";
} elseif ($timeDiff > 2 && $timeDiff < 60) {
$timeDiff = floor(abs($timeDiff)) . " minutes ago";
} elseif ($timeDiff > 60 && $timeDiff < 120) {
$timeDiff = floor(abs($timeDiff / 60)) . " hour ago";
} elseif ($timeDiff < 1440) {
$timeDiff = floor(abs($timeDiff / 60)) . " hours ago";
} elseif ($timeDiff > 1440 && $timeDiff < 2880) {
$timeDiff = floor(abs($timeDiff / 1440)) . " day ago";
} elseif ($timeDiff > 2880) {
$timeDiff = floor(abs($timeDiff / 1440)) . " days ago";
}
return $timeDiff;
}
Aquí está mi solución por favor revise y modifique de acuerdo a sus requerimientos
function getHowLongAgo($date, $display = array(''Year'', ''Month'', ''Day'', ''Hour'', ''Minute'', ''Second''), $ago = '''') {
date_default_timezone_set(''Australia/Sydney'');
$timestamp = strtotime($date);
$timestamp = (int) $timestamp;
$current_time = time();
$diff = $current_time - $timestamp;
//intervals in seconds
$intervals = array(
''year'' => 31556926, ''month'' => 2629744, ''week'' => 604800, ''day'' => 86400, ''hour'' => 3600, ''minute'' => 60
);
//now we just find the difference
if ($diff == 0) {
return '' Just now '';
}
if ($diff < 60) {
return $diff == 1 ? $diff . '' second ago '' : $diff . '' seconds ago '';
}
if ($diff >= 60 && $diff < $intervals[''hour'']) {
$diff = floor($diff / $intervals[''minute'']);
return $diff == 1 ? $diff . '' minute ago '' : $diff . '' minutes ago '';
}
if ($diff >= $intervals[''hour''] && $diff < $intervals[''day'']) {
$diff = floor($diff / $intervals[''hour'']);
return $diff == 1 ? $diff . '' hour ago '' : $diff . '' hours ago '';
}
if ($diff >= $intervals[''day''] && $diff < $intervals[''week'']) {
$diff = floor($diff / $intervals[''day'']);
return $diff == 1 ? $diff . '' day ago '' : $diff . '' days ago '';
}
if ($diff >= $intervals[''week''] && $diff < $intervals[''month'']) {
$diff = floor($diff / $intervals[''week'']);
return $diff == 1 ? $diff . '' week ago '' : $diff . '' weeks ago '';
}
if ($diff >= $intervals[''month''] && $diff < $intervals[''year'']) {
$diff = floor($diff / $intervals[''month'']);
return $diff == 1 ? $diff . '' month ago '' : $diff . '' months ago '';
}
if ($diff >= $intervals[''year'']) {
$diff = floor($diff / $intervals[''year'']);
return $diff == 1 ? $diff . '' year ago '' : $diff . '' years ago '';
}
}
Gracias
Cuando desarrollamos un sistema de mensajes o notificaciones en nuestra aplicación en la que necesita mostrar el tiempo como ''hace 1 hora'', o hace 2 semanas, etc., solo se calcula el tiempo desde el momento actual hasta el tiempo de envío del mensaje.
Respondo aquí para la pregunta que se hizo anteriormente en este sitio . La función xx no funciona.
Espero que esto te sea de utilidad.
Encontré resultados como el siguiente feo:
1 años, 2 meses, 0 días, 0 horas, 53 minutos y 1 segundos
Por eso me di cuenta de una función que respeta los plurales, elimina valores vacíos y, opcionalmente, es posible acortar la salida:
function since($timestamp, $level=6) {
global $lang;
$date = new DateTime();
$date->setTimestamp($timestamp);
$date = $date->diff(new DateTime());
// build array
$since = json_decode($date->format(''{"year":%y,"month":%m,"day":%d,"hour":%h,"minute":%i,"second":%s}''), true);
// remove empty date values
$since = array_filter($since);
// output only the first x date values
$since = array_slice($since, 0, $level);
// build string
$last_key = key(array_slice($since, -1, 1, true));
$string = '''';
foreach ($since as $key => $val) {
// separator
if ($string) {
$string .= $key != $last_key ? '', '' : '' '' . $lang[''and''] . '' '';
}
// set plural
$key .= $val > 1 ? ''s'' : '''';
// add date value
$string .= $val . '' '' . $lang[ $key ];
}
return $string;
}
Se ve mucho mejor:
1 año, 2 meses, 53 minutos y 1 segundo
Opcionalmente use $level = 2
para acortarlo de la siguiente manera:
1 año y 2 meses
Elimine la parte $lang
si la necesita solo en inglés o edite esta traducción para que se ajuste a sus necesidades:
$lang = array(
''second'' => ''Sekunde'',
''seconds'' => ''Sekunden'',
''minute'' => ''Minute'',
''minutes'' => ''Minuten'',
''hour'' => ''Stunde'',
''hours'' => ''Stunden'',
''day'' => ''Tag'',
''days'' => ''Tage'',
''month'' => ''Monat'',
''months'' => ''Monate'',
''year'' => ''Jahr'',
''years'' => ''Jahre'',
''and'' => ''und'',
);
Esta es en realidad una solución mejor que he encontrado. Utiliza jQuery sin embargo funciona perfectamente. También se actualiza automáticamente de manera similar a como lo hacen SO y Facebook para que no tenga que actualizar la página para ver las actualizaciones.
Este complemento leerá su atributo de datetime
en la etiqueta <time>
y lo completará por usted.
e.g. "4 minutes ago" or "about 1 day ago
Esta función no está hecha para ser usada en el idioma inglés. Traduje las palabras en inglés. Esto necesita más arreglos antes de usar para el inglés.
function ago($d) {
$ts = time() - strtotime(str_replace("-","/",$d));
if($ts>315360000) $val = round($ts/31536000,0).'' year'';
else if($ts>94608000) $val = round($ts/31536000,0).'' years'';
else if($ts>63072000) $val = '' two years'';
else if($ts>31536000) $val = '' a year'';
else if($ts>24192000) $val = round($ts/2419200,0).'' month'';
else if($ts>7257600) $val = round($ts/2419200,0).'' months'';
else if($ts>4838400) $val = '' two months'';
else if($ts>2419200) $val = '' a month'';
else if($ts>6048000) $val = round($ts/604800,0).'' week'';
else if($ts>1814400) $val = round($ts/604800,0).'' weeks'';
else if($ts>1209600) $val = '' two weeks'';
else if($ts>604800) $val = '' a week'';
else if($ts>864000) $val = round($ts/86400,0).'' day'';
else if($ts>259200) $val = round($ts/86400,0).'' days'';
else if($ts>172800) $val = '' two days'';
else if($ts>86400) $val = '' a day'';
else if($ts>36000) $val = round($ts/3600,0).'' year'';
else if($ts>10800) $val = round($ts/3600,0).'' years'';
else if($ts>7200) $val = '' two years'';
else if($ts>3600) $val = '' a year'';
else if($ts>600) $val = round($ts/60,0).'' minute'';
else if($ts>180) $val = round($ts/60,0).'' minutes'';
else if($ts>120) $val = '' two minutes'';
else if($ts>60) $val = '' a minute'';
else if($ts>10) $val = round($ts,0).'' second'';
else if($ts>2) $val = round($ts,0).'' seconds'';
else if($ts>1) $val = '' two seconds'';
else $val = $ts.'' a second'';
return $val;
}
Esto es con lo que fui. Es una versión modificada del post de Abbbas khan:
<?php
function calculate_time_span($post_time)
{
$seconds = time() - strtotime($post);
$year = floor($seconds /31556926);
$months = floor($seconds /2629743);
$week=floor($seconds /604800);
$day = floor($seconds /86400);
$hours = floor($seconds / 3600);
$mins = floor(($seconds - ($hours*3600)) / 60);
$secs = floor($seconds % 60);
if($seconds < 60) $time = $secs." seconds ago";
else if($seconds < 3600 ) $time =($mins==1)?$mins."now":$mins." mins ago";
else if($seconds < 86400) $time = ($hours==1)?$hours." hour ago":$hours." hours ago";
else if($seconds < 604800) $time = ($day==1)?$day." day ago":$day." days ago";
else if($seconds < 2629743) $time = ($week==1)?$week." week ago":$week." weeks ago";
else if($seconds < 31556926) $time =($months==1)? $months." month ago":$months." months ago";
else $time = ($year==1)? $year." year ago":$year." years ago";
return $time;
}
// uses
// $post_time="2017-12-05 02:05:12";
// echo calculate_time_span($post_time);
Intenté esto y funciona bien para mí
$datetime1 = new DateTime(''2009-10-11'');
$datetime2 = new DateTime(''2009-10-10'');
$difference = $datetime1->diff($datetime2);
echo formatOutput($difference);
function formatOutput($diff){
/* function to return the highrst defference fount */
if(!is_object($diff)){
return;
}
if($diff->y > 0){
return $diff->y .(" year".($diff->y > 1?"s":"")." ago");
}
if($diff->m > 0){
return $diff->m .(" month".($diff->m > 1?"s":"")." ago");
}
if($diff->d > 0){
return $diff->d .(" day".($diff->d > 1?"s":"")." ago");
}
if($diff->h > 0){
return $diff->h .(" hour".($diff->h > 1?"s":"")." ago");
}
if($diff->i > 0){
return $diff->i .(" minute".($diff->i > 1?"s":"")." ago");
}
if($diff->s > 0){
return $diff->s .(" second".($diff->s > 1?"s":"")." ago");
}
}
Compruebe este enlace para referencia here
¡Gracias! y divertirse.
La siguiente es una solución muy simple y extremadamente eficiente.
function timeElapsed($originalTime){
$timeElapsed=time()-$originalTime;
/*
You can change the values of the following 2 variables
based on your opinion. For 100% accuracy, you can call
php''s cal_days_in_month() and do some additional coding
using the values you get for each month. After all the
coding, your final answer will be approximately equal to
mine. That is why it is okay to simply use the average
values below.
*/
$averageNumbDaysPerMonth=(365.242/12);
$averageNumbWeeksPerMonth=($averageNumbDaysPerMonth/7);
$time1=(((($timeElapsed/60)/60)/24)/365.242);
$time2=floor($time1);//Years
$time3=($time1-$time2)*(365.242);
$time4=($time3/$averageNumbDaysPerMonth);
$time5=floor($time4);//Months
$time6=($time4-$time5)*$averageNumbWeeksPerMonth;
$time7=floor($time6);//Weeks
$time8=($time6-$time7)*7;
$time9=floor($time8);//Days
$time10=($time8-$time9)*24;
$time11=floor($time10);//Hours
$time12=($time10-$time11)*60;
$time13=floor($time12);//Minutes
$time14=($time12-$time13)*60;
$time15=round($time14);//Seconds
$timeElapsed=$time2 . ''yrs '' . $time5 . ''months '' . $time7 .
''weeks '' . $time9 . ''days '' . $time11 . ''hrs ''
. $time13 . ''mins and '' . $time15 . ''secs.'';
return $timeElapsed;
}
tiempo de eco transcurrido (1201570814);
Salida de muestra:
6 años 4 meses 3 semanas 4 días 12 horas 40 minutos y 36 segundos.
Modifiqué un poco la función original (en mi opinión, más útil o lógica).
// display "X time" ago, $rcs is precision depth
function time_ago ($tm, $rcs = 0) {
$cur_tm = time();
$dif = $cur_tm - $tm;
$pds = array(''second'',''minute'',''hour'',''day'',''week'',''month'',''year'',''decade'');
$lngh = array(1,60,3600,86400,604800,2630880,31570560,315705600);
for ($v = count($lngh) - 1; ($v >= 0) && (($no = $dif / $lngh[$v]) <= 1); $v--);
if ($v < 0)
$v = 0;
$_tm = $cur_tm - ($dif % $lngh[$v]);
$no = ($rcs ? floor($no) : round($no)); // if last denomination, round
if ($no != 1)
$pds[$v] .= ''s'';
$x = $no . '' '' . $pds[$v];
if (($rcs > 0) && ($v >= 1))
$x .= '' '' . $this->time_ago($_tm, $rcs - 1);
return $x;
}
Muchas soluciones aquí no tuvieron en cuenta el redondeo. Por ejemplo:
El evento ocurrió a las 3 de la tarde hace dos días. Si está comprobando a las 2pm, se mostrará un día antes. Si está comprobando a las 4 pm se mostrará hace dos días.
Si está trabajando con tiempo de Unix, esto ayuda:
// how long since event has passed in seconds
$secs = time() - $time_ago;
// how many seconds in a day
$sec_per_day = 60*60*24;
// days elapsed
$days_elapsed = floor($secs / $sec_per_day);
// how many seconds passed today
$today_seconds = date(''G'')*3600 + date(''i'') * 60 + date(''s'');
// how many seconds passed in the final day calculation
$remain_seconds = $secs % $sec_per_day;
if($today_seconds < $remain_seconds)
{
$days_elapsed++;
}
echo ''The event was ''.$days_ago.'' days ago.'';
No es perfecto si le preocupan los segundos de salto y el horario de verano.
No sé por qué nadie menciona a Carbon todavía.
https://github.com/briannesbitt/Carbon
Esta es en realidad una extensión de php dateTime (que ya se usó aquí) y tiene el método: diffForHumans. Así que todo lo que necesitas hacer es:
$dt = Carbon::parse(''2012-9-5 23:26:11.123789'');
echo $dt->diffForHumans();
más ejemplos: http://carbon.nesbot.com/docs/#api-humandiff
Ventajas de esta solución:
- Funciona para fechas futuras y devolverá algo así como en 2 meses, etc.
- puede utilizar la localización para obtener otros idiomas y la pluralización funciona bien
- Si vas a empezar a usar Carbon para otras cosas, trabajar con fechas será tan fácil como nunca.
Puedes usar:
date("Y-m-d H:i:s",strtotime("1 day ago"));
Respuesta ligeramente modificada desde arriba:
$commentTime = strtotime($whatever)
$today = strtotime(''today'');
$yesterday = strtotime(''yesterday'');
$todaysHours = strtotime(''now'') - strtotime(''today'');
private function timeElapsedString(
$commentTime,
$todaysHours,
$today,
$yesterday
) {
$tokens = array(
31536000 => ''year'',
2592000 => ''month'',
604800 => ''week'',
86400 => ''day'',
3600 => ''hour'',
60 => ''minute'',
1 => ''second''
);
$time = time() - $commentTime;
$time = ($time < 1) ? 1 : $time;
if ($commentTime >= $today || $commentTime < $yesterday) {
foreach ($tokens as $unit => $text) {
if ($time < $unit) {
continue;
}
if ($text == ''day'') {
$numberOfUnits = floor(($time - $todaysHours) / $unit) + 1;
} else {
$numberOfUnits = floor(($time)/ $unit);
}
return $numberOfUnits . '' '' . $text . (($numberOfUnits > 1) ? ''s'' : '''') . '' ago'';
}
} else {
return ''Yesterday'';
}
}
Si usa MySQL, use la función UNIX_TIMESTAMP()
.
Solo para tirar en otra opción ...
Aunque prefiero la publicación del método DateTime here , no me gustó el hecho de que mostrara 0 años, etc.
/*
* Returns a string stating how long ago this happened
*/
private function timeElapsedString($ptime){
$diff = time() - $ptime;
$calc_times = array();
$timeleft = array();
// Prepare array, depending on the output we want to get.
$calc_times[] = array(''Year'', ''Years'', 31557600);
$calc_times[] = array(''Month'', ''Months'', 2592000);
$calc_times[] = array(''Day'', ''Days'', 86400);
$calc_times[] = array(''Hour'', ''Hours'', 3600);
$calc_times[] = array(''Minute'', ''Minutes'', 60);
$calc_times[] = array(''Second'', ''Seconds'', 1);
foreach ($calc_times AS $timedata){
list($time_sing, $time_plur, $offset) = $timedata;
if ($diff >= $offset){
$left = floor($diff / $offset);
$diff -= ($left * $offset);
$timeleft[] = "{$left} " . ($left == 1 ? $time_sing : $time_plur);
}
}
return $timeleft ? (time() > $ptime ? null : ''-'') . implode('' '', $timeleft) : 0;
}
Soy consciente de que hay varias respuestas aquí, pero esto es lo que se me ocurrió. Esto solo controla los valores DATETIME de MySQL según la pregunta original a la que respondía. La matriz $ a necesita algo de trabajo. Doy la bienvenida a los comentarios sobre cómo mejorar. Llamar como
echo time_elapsed_string (''2014-11-14 09:42:28'');
function time_elapsed_string($ptime)
{
// Past time as MySQL DATETIME value
$ptime = strtotime($ptime);
// Current time as MySQL DATETIME value
$csqltime = date(''Y-m-d H:i:s'');
// Current time as Unix timestamp
$ctime = strtotime($csqltime);
// Elapsed time
$etime = $ctime - $ptime;
// If no elapsed time, return 0
if ($etime < 1){
return ''0 seconds'';
}
$a = array( 365 * 24 * 60 * 60 => ''year'',
30 * 24 * 60 * 60 => ''month'',
24 * 60 * 60 => ''day'',
60 * 60 => ''hour'',
60 => ''minute'',
1 => ''second''
);
$a_plural = array( ''year'' => ''years'',
''month'' => ''months'',
''day'' => ''days'',
''hour'' => ''hours'',
''minute'' => ''minutes'',
''second'' => ''seconds''
);
foreach ($a as $secs => $str){
// Divide elapsed time by seconds
$d = $etime / $secs;
if ($d >= 1){
// Round to the next lowest integer
$r = floor($d);
// Calculate time to remove from elapsed time
$rtime = $r * $secs;
// Recalculate and store elapsed time for next loop
if(($etime - $rtime) < 0){
$etime -= ($r - 1) * $secs;
}
else{
$etime -= $rtime;
}
// Create string to return
$estring = $estring . $r . '' '' . ($r > 1 ? $a_plural[$str] : $str) . '' '';
}
}
return $estring . '' ago'';
}
Tendrá que tomar cada pieza individual de su marca de tiempo y convertirla en tiempo Unix. Por ejemplo, para la marca de tiempo, 2009-09-12 20:57:19.
(((2008-1970) * 365) + (8 * 30) +12) * 24 + 20 le daría una estimación RÁPIDA de las horas desde el 1 de enero de 1970.
Toma ese número, multiplica por 60 y suma 57 para obtener los minutos.
Toma eso, multiplica por 60 y suma 19.
Sin embargo, eso lo convertiría de manera muy aproximada e inexacta.
¿Hay alguna razón por la que no puedas tomar el tiempo normal de Unix para empezar?
Uso de:
echo elapsed_time(''2016-05-09 17:00:00''); // 18 saat 8 dakika önce yazıldı.
Función:
function elapsed_time($time){// Nekadar zaman geçmiş
$diff = time() - strtotime($time);
$sec = $diff;
$min = floor($diff/60);
$hour = floor($diff/(60*60));
$hour_min = floor($min - ($hour*60));
$day = floor($diff/(60*60*24));
$day_hour = floor($hour - ($day*24));
$week = floor($diff/(60*60*24*7));
$mon = floor($diff/(60*60*24*7*4));
$year = floor($diff/(60*60*24*7*4*12));
//difference calculate to string
if($sec < (60*5)){
return ''şimdi yazıldı.'';
}elseif($min < 60){
return ''biraz önce yazıldı.'';
}elseif($hour < 24){
return $hour.'' saat ''.$hour_min.'' dakika önce yazıldı.'';
}elseif($day < 7){
if($day_hour!=0){$day_hour=$day_hour.'' saat '';}else{$day_hour='''';}
return $day.'' gün ''.$day_hour.''önce yazıldı.'';
}elseif($week < 4){
return $week.'' hafta önce yazıldı.'';
}elseif($mon < 12){
return $mon.'' ay önce yazıldı.'';
}else{
return $year.'' yıl önce yazıldı.'';
}
}
te ayuda a comprobarlo
function calculate_time_span($seconds)
{
$year = floor($seconds /31556926);
$months = floor($seconds /2629743);
$week=floor($seconds /604800);
$day = floor($seconds /86400);
$hours = floor($seconds / 3600);
$mins = floor(($seconds - ($hours*3600)) / 60);
$secs = floor($seconds % 60);
if($seconds < 60) $time = $secs." seconds ago";
else if($seconds < 3600 ) $time =($mins==1)?$mins."now":$mins." mins ago";
else if($seconds < 86400) $time = ($hours==1)?$hours." hour ago":$hours." hours ago";
else if($seconds < 604800) $time = ($day==1)?$day." day ago":$day." days ago";
else if($seconds < 2629743) $time = ($week==1)?$week." week ago":$week." weeks ago";
else if($seconds < 31556926) $time =($months==1)? $months." month ago":$months." months ago";
else $time = ($year==1)? $year." year ago":$year." years ago";
return $time;
}
$seconds = time() - strtotime($post->post_date);
echo calculate_time_span($seconds);
acaba de pasar la fecha a esta func. Se imprimiría en un formato de tiempo para usted.
date_default_timezone_set(''your-time-zone'');
function convert($datetime){
$time=strtotime($datetime);
$diff=time()-$time;
$diff/=60;
$var1=floor($diff);
$var=$var1<=1 ? ''min'' : ''mins'';
if($diff>=60){
$diff/=60;
$var1=floor($diff);
$var=$var1<=1 ? ''hr'' : ''hrs'';
if($diff>=24){$diff/=24;$var1=floor($diff);$var=$var1<=1 ? ''day'' : ''days'';
if($diff>=30.4375){$diff/=30.4375;$var1=floor($diff);$var=$var1<=1 ? ''month'' : ''months'';
if($diff>=12){$diff/=12;$var1=floor($diff);$var=$var1<=1 ? ''year'' : ''years'';}}}}
echo $var1,'' '',$var,'' ago'';
}
1470919932
esto y está funcionando bien, funciona tanto para la marca de tiempo de Unix como 1470919932
o el tiempo formateado como 16-08-11 14:53:30
function timeAgo($time_ago) {
$time_ago = strtotime($time_ago) ? strtotime($time_ago) : $time_ago;
$time = time() - $time_ago;
switch($time):
// seconds
case $time <= 60;
return ''lessthan a minute ago'';
// minutes
case $time >= 60 && $time < 3600;
return (round($time/60) == 1) ? ''a minute'' : round($time/60).'' minutes ago'';
// hours
case $time >= 3600 && $time < 86400;
return (round($time/3600) == 1) ? ''a hour ago'' : round($time/3600).'' hours ago'';
// days
case $time >= 86400 && $time < 604800;
return (round($time/86400) == 1) ? ''a day ago'' : round($time/86400).'' days ago'';
// weeks
case $time >= 604800 && $time < 2600640;
return (round($time/604800) == 1) ? ''a week ago'' : round($time/604800).'' weeks ago'';
// months
case $time >= 2600640 && $time < 31207680;
return (round($time/2600640) == 1) ? ''a month ago'' : round($time/2600640).'' months ago'';
// years
case $time >= 31207680;
return (round($time/31207680) == 1) ? ''a year ago'' : round($time/31207680).'' years ago'' ;
endswitch;
}
?>
Escrito originalmente y disponible en este link
function _ago($tm,$rcs = 0) {
$cur_tm = time(); $dif = $cur_tm-$tm;
$pds = array(''second'',''minute'',''hour'',''day'',''week'',''month'',''year'',''decade'');
$lngh = array(1,60,3600,86400,604800,2630880,31570560,315705600);
for($v = sizeof($lngh)-1; ($v >= 0)&&(($no = $dif/$lngh[$v])<=1); $v--); if($v < 0) $v = 0; $_tm = $cur_tm-($dif%$lngh[$v]);
$no = floor($no); if($no <> 1) $pds[$v] .=''s''; $x=sprintf("%d %s ",$no,$pds[$v]);
if(($rcs == 1)&&($v >= 1)&&(($cur_tm-$_tm) > 0)) $x .= time_ago($_tm);
return $x;
}
Necesita un valor de tiempo (), y le dirá cuántos segundos / minutos / horas / días / años / décadas.
Estoy usando la siguiente función durante varios años. Y está funcionando bien:
function timeDifference($timestamp)
{
$otherDate=$timestamp;
$now=@date("Y-m-d H:i:s");
$secondDifference=@strtotime($now)-@strtotime($otherDate);
$extra="";
if ($secondDifference == 2592000) {
// months
$difference = $secondDifference/2592000;
$difference = round($difference,0);
if ($difference>1) { $extra="s"; }
$difference = $difference." month".$extra." ago";
}else if($secondDifference > 2592000)
{$difference=timestamp($timestamp);}
elseif ($secondDifference >= 604800) {
// weeks
$difference = $secondDifference/604800;
$difference = round($difference,0);
if ($difference>1) { $extra="s"; }
$difference = $difference." week".$extra." ago";
}
elseif ($secondDifference >= 86400) {
// days
$difference = $secondDifference/86400;
$difference = round($difference,0);
if ($difference>1) { $extra="s"; }
$difference = $difference." day".$extra." ago";
}
elseif ($secondDifference >= 3600) {
// hours
$difference = $secondDifference/3600;
$difference = round($difference,0);
if ($difference>1) { $extra="s"; }
$difference = $difference." hour".$extra." ago";
}
elseif ($secondDifference < 3600) {
// hours
// for seconds (less than minute)
if($secondDifference<=60)
{
if($secondDifference==0)
{
$secondDifference=1;
}
if ($secondDifference>1) { $extra="s"; }
$difference = $secondDifference." second".$extra." ago";
}
else
{
$difference = $secondDifference/60;
if ($difference>1) { $extra="s"; }else{$extra="";}
$difference = round($difference,0);
$difference = $difference." minute".$extra." ago";
}
}
$FinalDifference = $difference;
return $FinalDifference;
}
# This function prints the difference between two php datetime objects
# in a more human readable form
# inputs should be like strtotime($date)
function humanizeDateDiffference($now,$otherDate=null,$offset=null){
if($otherDate != null){
$offset = $now - $otherDate;
}
if($offset != null){
$deltaS = $offset%60;
$offset /= 60;
$deltaM = $offset%60;
$offset /= 60;
$deltaH = $offset%24;
$offset /= 24;
$deltaD = ($offset > 1)?ceil($offset):$offset;
} else{
throw new Exception("Must supply otherdate or offset (from now)");
}
if($deltaD > 1){
if($deltaD > 365){
$years = ceil($deltaD/365);
if($years ==1){
return "last year";
} else{
return "<br>$years years ago";
}
}
if($deltaD > 6){
return date(''d-M'',strtotime("$deltaD days ago"));
}
return "$deltaD days ago";
}
if($deltaD == 1){
return "Yesterday";
}
if($deltaH == 1){
return "last hour";
}
if($deltaM == 1){
return "last minute";
}
if($deltaH > 0){
return $deltaH." hours ago";
}
if($deltaM > 0){
return $deltaM." minutes ago";
}
else{
return "few seconds ago";
}
}
function humanTiming ($time)
{
$time = time() - $time; // to get the time since that moment
$time = ($time<1)? 1 : $time;
$tokens = array (
31536000 => ''year'',
2592000 => ''month'',
604800 => ''week'',
86400 => ''day'',
3600 => ''hour'',
60 => ''minute'',
1 => ''second''
);
foreach ($tokens as $unit => $text) {
if ($time < $unit) continue;
$numberOfUnits = floor($time / $unit);
return $numberOfUnits.'' ''.$text.(($numberOfUnits>1)?''s'':'''');
}
}
echo humanTiming( strtotime($mytimestring) );
function time_elapsed_string($ptime)
{
$etime = time() - $ptime;
if ($etime < 1)
{
return ''0 seconds'';
}
$a = array( 365 * 24 * 60 * 60 => ''year'',
30 * 24 * 60 * 60 => ''month'',
24 * 60 * 60 => ''day'',
60 * 60 => ''hour'',
60 => ''minute'',
1 => ''second''
);
$a_plural = array( ''year'' => ''years'',
''month'' => ''months'',
''day'' => ''days'',
''hour'' => ''hours'',
''minute'' => ''minutes'',
''second'' => ''seconds''
);
foreach ($a as $secs => $str)
{
$d = $etime / $secs;
if ($d >= 1)
{
$r = round($d);
return $r . '' '' . ($r > 1 ? $a_plural[$str] : $str) . '' ago'';
}
}
}
$time_ago = '' '';
$time = time() - $time; // to get the time since that moment
$tokens = array (
31536000 => ''year'',2592000 => ''month'',604800 => ''week'',86400 => ''day'',3600 => ''hour'',
60 => ''minute'',1 => ''second'');
foreach ($tokens as $unit => $text) {
if ($time < $unit)continue;
$numberOfUnits = floor($time / $unit);
$time_ago = '' ''.$time_ago. $numberOfUnits.'' ''.$text.(($numberOfUnits>1)?''s'':'''').'' '';
$time = $time % $unit;}echo $time_ago;
$time_elapsed = timeAgo($time_ago); //The argument $time_ago is in timestamp (Y-m-d H:i:s)format.
//Function definition
function timeAgo($time_ago)
{
$time_ago = strtotime($time_ago);
$cur_time = time();
$time_elapsed = $cur_time - $time_ago;
$seconds = $time_elapsed ;
$minutes = round($time_elapsed / 60 );
$hours = round($time_elapsed / 3600);
$days = round($time_elapsed / 86400 );
$weeks = round($time_elapsed / 604800);
$months = round($time_elapsed / 2600640 );
$years = round($time_elapsed / 31207680 );
// Seconds
if($seconds <= 60){
return "just now";
}
//Minutes
else if($minutes <=60){
if($minutes==1){
return "one minute ago";
}
else{
return "$minutes minutes ago";
}
}
//Hours
else if($hours <=24){
if($hours==1){
return "an hour ago";
}else{
return "$hours hrs ago";
}
}
//Days
else if($days <= 7){
if($days==1){
return "yesterday";
}else{
return "$days days ago";
}
}
//Weeks
else if($weeks <= 4.3){
if($weeks==1){
return "a week ago";
}else{
return "$weeks weeks ago";
}
}
//Months
else if($months <=12){
if($months==1){
return "a month ago";
}else{
return "$months months ago";
}
}
//Years
else{
if($years==1){
return "one year ago";
}else{
return "$years years ago";
}
}
}