8791 sujets

Développement web côté serveur, CMS

Salut à tous,

J'aimerai savoir comment peux on calculer le temps écoulé d'un date pour être le plus précis possible dans l'affichage du temps.

Exemple :
Je post une commentaire ou une news. J'affiche l'heure "2010-12-12 12:27:03"

A la place j'aimerai afficher :

Il y a 8 sec
Il y 5 jours et 20 heures
Un fois le nombre x de jours est passé on affiche : 12/12/2010 à 12:27:03

Je sais que cela est possible mais je ne sais pas comment faire.

Si quelqu'un a une solution ça serait cool.
Merci d'avance.
Le souçi c'est que je n'utilise pas DateTime.

J'ai des news avec le quel je stock les heures avec NOW() à la quelle j'ai poster la news dans la bdd avec un champs de type datetime.

Merci quand même et puis j'étudie l'objet DateTime et pour tous te dire je comprend pour l'instant rien x)
Salut,

Tu dois pouvoir faire quelque chose du genre :

$datetime1 = date_create('2010-12-12 12:27:03');
$datetime2 = date_create();
$interval = date_diff($datetime1, $datetime2);
echo $interval->format('%R%d days');


Pour le format je te conseille d'aller voir sur DateInterval::format
Si tu dispose d'une version antérieure à PHP 5.3 tu peux passer par la fonction strtotime pour convertire ta date en timestamp puis la soustraire au timestamp courant :

$date = date('Y-m-d H:i:s');
$temps_ecoule = time() - strtotime($date);
echo "Il s'est écoulé $temps_ecoule secondes depuis $date jusqu'à maintenant";

Après c'est une question de conversions mathématique pour avoir un affichage plus parlant qu'un temps écoulé en secondes.
Voilà, après avoir cherchez encore un peu et obtenu de l'aide on ma donner ceçi :


function AffDate($date){
 
		if(!ctype_digit($date))
			$date = strtotime($date);
		
		if(date('Ymd', $date) == date('Ymd')){
			$diff = time()-$date;
				
			if($diff < 60) /* moins de 60 secondes */
				return 'Il y a '.$diff.' sec';
			
			else if($diff < 3600) /* moins d'une heure */
				return 'Il y a '.round($diff/60, 0).' minutes';
			
			else if($diff < 43200) /* moins de 12 heures */
				return 'Il y a '.round($diff/3600, 0).' heures' ;
			
			else /*  plus de 12 heures ont affiche ajourd'hui à HH:MM:SS */
				return 'Aujourd\'hui à '.date('H:i:s', $date);
		}
		
			else if(date('Ymd', $date) == date('Ymd', strtotime('- 1 DAY')))
				return 'Hier à '.date('H:i:s', $date);
			
			else if(date('Ymd', $date) == date('Ymd', strtotime('- 2 DAY')))
				return 'Il y a 2 jours à '.date('H:i:s', $date);
				
			else if(date('Ymd', $date) == date('Ymd', strtotime('- 3 DAY')))
				return 'Il y a 3 jours à '.date('H:i:s', $date);
				
			else if(date('Ymd', $date) == date('Ymd', strtotime('- 4 DAY')))
				return 'Il y a 4 jours à '.date('H:i:s', $date);
				
			else if(date('Ymd', $date) == date('Ymd', strtotime('- 5 DAY')))
				return 'Il y a 5 jours à '.date('H:i:s', $date);
			
			else if(date('Ymd', $date) == date('Ymd', strtotime('- 6 DAY')))
				return 'Il y a 6 jours à '.date('H:i:s', $date);
			
			else
				return 'Le '.date('d/m/Y à H:i:s', $date);
}


Seulement le souçi c'est que pour les secondes ça m'affiche une donnée erroné.

Ca m'affiche -xxxx secondes au lieu de x ou xx secondes..

Et je trouve toujours pas d'où viens l'erreur.

Merci d'avance
Modifié par DjaSama (13 Dec 2010 - 21:06)