2010-08-10 26 views
12

tengo una pequeña función que muestra la actividad más reciente, se agarra fecha y hora en formato UNIX desde el PP, y luego se echo a cabo con esta línea:PHP: Fecha de "Yesterday", "Hoy"

date("G:i:s j M -Y", $last_access) 

Ahora me gustaría reemplazar la fecha (j M -Y) a Ayer, y Hoy si la última actividad fue dentro de hoy, y lo mismo ocurre con Ayer.

¿Cómo puedo hacer esto?

+0

¿Tiene algún código que haya escrito hasta ahora? –

+0

¿Puedes intentar ser más preciso? No entendí lo que quieres decir con Ayer y Hoy ... francamente ;-) – maraspin

+2

Es mañana que debes preocuparte, no ayer o hoy, despejando todas esas telarañas y el dolor, solo sabiendo que está a un día de distancia y todo ese. –

Respuesta

14
function get_day_name($timestamp) { 

    $date = date('d/m/Y', $timestamp); 

    if($date == date('d/m/Y')) { 
     $date = 'Today'; 
    } 
    else if($date == date('d/m/Y',now() - (24 * 60 * 60))) { 
     $date = 'Yesterday'; 
    } 
    return $date; 
} 
print date('G:i:s', $last_access).' '.get_day_name($last_access); 
+0

me sale el error inesperado '{' – Karem

+1

La línea 'else if' parece que falta un') '. – Maerlyn

+0

Disculpa, lo solucioné para ti, Karem. Aunque creo que funcionó para ti. – Keyo

35

que iba a encontrar la timestap para el final de la medianoche y el anterior, si es $last_access entre las dos marcas de tiempo, a continuación, mostrar ayer, algo más grande que la última fecha y hora de la medianoche de hoy habría ...

Creo que sería la aritmética más rápida que la de la fecha de realización.

De hecho, acabo probado este código y parece que funcionan muy bien:

<?php 
    if ($last_access >= strtotime("today")) 
     echo "Today"; 
    else if ($last_access >= strtotime("yesterday")) 
     echo "Yesterday"; 
?> 
+0

Mucho más limpio que mi respuesta +1 – Keyo

+0

+1 Esto funciona genial, gracias! :) – Nathan

1
something like: 

$now = time(); 

$last_midnight = $now - ($now % (24*60*60)); 

if ($last_access >= $last_midnight) 
{ 
print "Today"; 
}  
elseif ($last_access >= ($last_midnight-(24*60*60)) 
{ 
Print "Yesterday"; 
} 
+0

@mvds: No sabía que pudieras usar cadenas relativas en strtotime. Bonito. Sin embargo, algunos problemas son PHP4 vs PHP5. – tcrosley

+0

De hecho, lo uso en algún servicio de búsqueda basado en web para permitir al usuario ingresar una ventana deslizante: p. de "hace dos meses" a "hoy". – mvds

2

Si van por el camino como se sugirió anteriormente, con marcas de tiempo UNIX para hoy/ayer, echar un vistazo en strtotime, uno de los grandes inventos del siglo 20 (o 21?):

echo strtotime("yesterday"); // midnight 
1281391200 

echo strtotime("today"); // midnight 
1281477600 

echo strtotime("today, 1:30"); 
1281483000 
7

tienes que c ompare día con día, Secondes comparaison son totalmente equivocado:

Si estamos hoy por la mañana, lo que significa la noche de ayer es hoy en día (por menos 24h) ^^

aquí un método que utilizo para Kinoulink (una puesta en marcha francés) :

public function formatDateAgo($value) 
{ 
    $time = strtotime($value); 
    $d = new \DateTime($value); 

    $weekDays = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche']; 
    $months = ['Janvier', 'Février', 'Mars', 'Avril',' Mai', 'Juin', 'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Décembre']; 

    if ($time > strtotime('-2 minutes')) 
    { 
     return 'Il y a quelques secondes'; 
    } 
    elseif ($time > strtotime('-30 minutes')) 
    { 
     return 'Il y a ' . floor((strtotime('now') - $time)/60) . ' min'; 
    } 
    elseif ($time > strtotime('today')) 
    { 
     return $d->format('G:i'); 
    } 
    elseif ($time > strtotime('yesterday')) 
    { 
     return 'Hier, ' . $d->format('G:i'); 
    } 
    elseif ($time > strtotime('this week')) 
    { 
     return $weekDays[$d->format('N') - 1] . ', ' . $d->format('G:i'); 
    } 
    else 
    { 
     return $d->format('j') . ' ' . $months[$d->format('n') - 1] . ', ' . $d->format('G:i'); 
    } 
} 
+0

¡Genial! Solo le falta el año, en la última «otra cosa». Pero es una belleza. ¡Gracias! –

0

aquí es la función de trabajo

function minus_one_day($date){ 
     $date2 = formatDate4db($date); 
     $date1 = str_replace('-', '/', $date2); 
     $yesterday = date('Y-m-d',strtotime($date1 . "-1 days")); 
     return $yesterday; } 

trabajo esperanza para usted ...

0

I aumentaron respuesta Thomas Decaux para llegar a este

function formatTimeString($timeStamp) { 
$str_time = date("Y-m-d H:i:sP", $timeStamp); 
$time = strtotime($str_time); 
$d = new DateTime($str_time); 

$weekDays = ['Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun']; 
$months = ['Jan', 'Feb', 'Mar', 'Apr', ' May', 'Jun', 'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec']; 

if ($time > strtotime('-2 minutes')) { 
    return 'Just now'; 
} elseif ($time > strtotime('-59 minutes')) { 
    $min_diff = floor((strtotime('now') - $time)/60); 
    return $min_diff . ' min' . (($min_diff != 1) ? "s" : "") . ' ago'; 
} elseif ($time > strtotime('-23 hours')) { 
    $hour_diff = floor((strtotime('now') - $time)/(60 * 60)); 
    return $hour_diff . ' hour' . (($hour_diff != 1) ? "s" : "") . ' ago'; 
} elseif ($time > strtotime('today')) { 
    return $d->format('G:i'); 
} elseif ($time > strtotime('yesterday')) { 
    return 'Yesterday at ' . $d->format('G:i'); 
} elseif ($time > strtotime('this week')) { 
    return $weekDays[$d->format('N') - 1] . ' at ' . $d->format('G:i'); 
} else { 
    return $d->format('j') . ' ' . $months[$d->format('n') - 1] . 
    (($d->format('Y') != date("Y")) ? $d->format(' Y') : "") . 
    ' at ' . $d->format('G:i'); 
} 

}

Se necesita en la marca de tiempo como el argumento, se añade el año de las veces si era de un año diferente, etc. ...

Cuestiones relacionadas