2010-08-10 5 views
12

j'ai une petite fonction qui montre la plus récente activité, il saisir l'horodatage au format unix de la db, puis il l'écho avec cette ligne:PHP: la date « Yesterday », « Aujourd'hui »

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

maintenant je voudrais remplacer la date (j M -Y) à hier, et aujourd'hui si la dernière activité était dans aujourd'hui, et même avec Hier.

Comment puis-je faire cela?

+0

Avez-vous du code que vous avez écrit jusqu'à présent? –

+0

Pouvez-vous s'il vous plaît essayer d'être plus précis? Je n'ai pas compris ce que tu veux dire par hier et aujourd'hui ... franchement ;-) – maraspin

+2

C'est demain que tu dois t'inquiéter, pas hier ou aujourd'hui, débarrasser toutes ces toiles d'araignées et le chagrin, sachant juste que c'est un jour et tout cette. –

Répondre

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

Je reçois une erreur inattendue '{' – Karem

+1

La ligne 'else if' semble manquer un') '. – Maerlyn

+0

Désolé, réparé cela pour vous Karem. Je suppose que cela a fonctionné pour vous cependant. – Keyo

35

je trouverais le timestap pour la fin minuit et celui qui le précède, si $last_access est entre les deux horodateurs, puis afficher hier, quoi que ce soit plus grand que l'horodatage dernier minuit serait aujourd'hui ...

Je crois que ce serait l'arithmétique de la date plus rapide que de faire.

En fait, je viens de tester ce code et il semble fonctionner à merveille:

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

Beaucoup plus propre que ma réponse +1 – Keyo

+0

+1 Cela fonctionne très bien, merci! :) – 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: Je ne savais pas que vous pouviez utiliser des chaînes relatives dans strtotime. Agréable. Quelques pièges sur PHP4 vs PHP5 cependant. – tcrosley

+0

Je l'utilise en fait dans un service de recherche basé sur le Web pour permettre à l'utilisateur d'entrer dans une fenêtre glissante: par ex. de "il y a deux mois" à "aujourd'hui". – mvds

2

Si vous allez sur la route comme suggéré ci-dessus, avec timestamp unix pour aujourd'hui/hier, jetez un oeil à strtotime, l'une des plus grandes inventions du 20ème siècle (ou 21?):

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

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

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

Vous devez c jour ompare avec le jour, SECONDES comparaison sont tout à fait tort: ​​

Si nous sommes aujourd'hui matin, cela veut dire hier soir est aujourd'hui (par moins 24h) ^^

Voici une méthode que j'utilise pour Kinoulink (une startup française) :

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

Super! Il ne manque que l'année, au dernier «autre». Mais c'est une beauté. Merci! –

0

ici est fonction de travail

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

travail espoir pour vous ...

0

j'ai amélioré Thomas Decaux réponse à venir avec cette

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

}

Il faut dans l'horodatage comme argument, il ajoute l'année du temps si elle était d'une autre année, etc. ...