Afficher une date-heure récente dans un format naturel et litteraire plus compréhensible

Soyez le premier à donner votre avis sur cette source.

Snippet vu 10 339 fois - Téléchargée 26 fois

Contenu du snippet

Ces fonctions permettent de mettre en évidence la proximité d'un événement en transformant un timestamp UNIX en un texte trés court.

Exemples d'expressions produites (et la période concernée entre parenthèse):
- "maintenant" (si moins de 5 minutes)
- "il y a 8 minutes" (si moins d'une heure)
- "ce matin" (meme jour)
- "hier midi" (la veille)
- "vendredi matin" (7 derniers jours)

Puis, la date est affichée normalement pour des dates plus anciennes... Sauf celles de l'année en cours qui comportent pas l'année.

L'idée a été inspirée de Google News qui affiche la durée de publication (en minutes ou heures) d'une annonce récente, mais en étendant le principe aux jours précèdant.

PARADOXE: bien que la date affichée soit moins précises sur le moment où elle s'est déroulée, les internautes sont plus réactifs à ces expressions litteraires pour percevoir si un événement est récent ou ancien :o.

Source / Exemple :


function timestamp2naturaltime($timestamp)
	{
	$ecart = ceil(date('U') - $timestamp);
	
	if ($ecart <= 7000)
		{
		$txt = 'il y a '.date_elapsednaturaltime($timestamp);
		}
	else if (($ecart <= 86400) AND (date('d',$timestamp) == date('d')))
		{
		// Aujourd'hui
		if (date('a',$timestamp) == 'am')
			{
			if (date('H',$timestamp) <= 5)
				{
				$txt = 'cette nuit';
				}
			else
				{
				$txt = 'ce matin, à '.date('H',$timestamp).' heures';
				}
			}
		else
			{
			if (date('H',$timestamp) <= 13)
				{
				$txt = 'ce midi';
				}
			else if (date('H',$timestamp) <= 17)
				{
				$txt = 'cette aprés-midi, à '.date('H',$timestamp).' heures';
				}
			else if (date('H',$timestamp) <= 21)
				{
				$txt = 'ce soir';
				}
			else
				{
				$txt = 'cette nuit';
				}
			}
		}
	else if (($ecart <= 172800) AND (date('d',$timestamp) == (date('d')-1)))
		{
		// Hier
		if (date('a',$timestamp) == 'am')
			{
			if (date('H',$timestamp) <= 5)
				{
				$txt = 'hier soir';
				}
			else
				{
				$txt = 'hier matin, à '.date('H',$timestamp).' heures';
				}
			}
		else
			{
			if (date('H',$timestamp) <= 13)
				{
				$txt = 'hier midi';
				}
			else if (date('H',$timestamp) <= 17)
				{
				$txt = 'hier aprés-midi, à '.date('H',$timestamp).' heures';
				}
			else
				{
				$txt = 'hier soir';
				}
			}
		}
	else if ($ecart <= 518400)
		{
		if (date('a',$timestamp) == 'am')
			{
			if (date('H',$timestamp) <= 5)
				{
				$txt = date_nombre2jour(date('w',$timestamp)).' soir';
				}
			else
				{
				$txt = date_nombre2jour(date('w',$timestamp)).' matin';
				}
			}
		else
			{
			if (date('H',$timestamp) <= 13)
				{
				$txt = date_nombre2jour(date('w',$timestamp)).' midi';
				}
			else if (date('H',$timestamp) <= 17)
				{
				$txt = date_nombre2jour(date('w',$timestamp)).' aprés-midi';
				}
			else
				{
				$txt = date_nombre2jour(date('w',$timestamp)).' soir';
				}
			}
		}
	else if (date('Y',$timestamp) == date('Y'))
		{
		// Cette année
		//$txt = 'le '.date_nombre2jour(date('w',$timestamp)).' '.date('j',$timestamp).' '.date_nombre2mois(date('m',$timestamp));
		$txt = 'il y a '.date_elapsednaturaltime($timestamp);
		}
	else
		{
		//$txt = 'le '.date_nombre2jour(date('w',$timestamp)).' '.date('j',$timestamp).' '.date_nombre2mois(date('m',$timestamp)).' '.date('Y',$timestamp);
		$txt = 'il y a '.date_elapsednaturaltime($timestamp);
		}
		
	return $txt;
	}
	
function date_elapsednaturaltime($timestamp1,$timestamp2=0)
	{
	if ($timestamp2 == 0)
		{
		$timestamp2 = date('U');
		}
	
	$a = date("Y",$timestamp1);
	$m = date("n",$timestamp1);
	$j = date("j",$timestamp1);
	
	$an = date("Y",$timestamp2) - $a;
	$mois = date("n",$timestamp2) - $m;
	$jour = date("j",$timestamp2) - $j;
	
	// Durée en année, mois, jours.
	if ($jour<0)
		{
		$d2=mktime(0,0,0,date("n")-1,date("j"),date("Y"));
		$diff=date_nbdays4month(date("n",$d2),date("Y",$d2));
		$jour+=$diff;
		$mois--;
		}
		
	if ($mois<0)
		{
		$mois+=12;
		$an--;
		}
		
	$txt = '';
		
	if ($an == 1)
		{
		// Depuis 1 an
		if (($mois >= 6) AND ($mois <= 7))
			{
			$txt.= '1 an et demi';
			}
		else if ($mois >= 11)
			{
			$txt.= '2 ans';
			}
		else if ($mois >= 2)
			{
			$txt.= '1 an, et '.$mois.' mois';
			}
		else
			{
			$txt.= '1 an';
			}
		}
	else if ($an > 1)
		{
		// Depuis plusieurs années
		if ($mois < 5)
			{
			$txt.= $an.' ans';
			}
		else if ($mois <= 8)
			{
			$txt.= $an.' ans et demi';
			}
		else
			{
			$txt.= ($an+1).' ans';
			}
		}
	else if ($mois >= 1)
		{
		// Depuis plusieurs mois
		if ($jour < 16)
			{
			$txt.= $mois.' mois';
			}
		else if (($jour >= 14) AND ($jour <= 16))
			{
			$txt.= $mois.' mois et demi';
			}	
		else
			{
			$txt.= ($mois+1).' mois';
			}	
		}
	else if ($jour >= 1)
		{
		if ($jour == 1)
			{
			$txt.= '24 heures';
			}
		else if ($jour >=29)
			{
			$txt.= '1 mois';
			}
		else if (($jour >=6) AND ($jour <= 8))
			{
			$txt.= '1 semaine';
			}
		else if ($jour >= 16)
			{
			$txt.= ceil($jour/7).' semaines';
			}
		else
			{
			$txt.= $jour.' jours';
			}
		}
	else
		{
		$ecart = ceil(date('U',$timestamp2)-date('U',$timestamp1));
		if (($ecart <= 65) AND ($ecart >= 58))
			{
			$txt ='1 minute';
			}
		else if ($ecart <= 60)
			{
			$txt = $ecart.' secondes';
			}
		else if (($ecart >= (58 * 60)) AND ($ecart <= (62 * 60)))
			{
			$txt = '1 heure';
			}
		else if ($ecart <= (60 * 60))
			{
			$txt = ceil($ecart/60).' minutes';
			}
		else if (($ecart >= (73 * 60)) AND ($ecart <= (77 * 60)))
			{
			$txt = '1 heure et quart';
			}
		else if (($ecart >= (88 * 60)) AND ($ecart <= (92 * 60)))
			{
			$txt = '1 heure et demi';
			}
		else if ($ecart < (120 * 60))
			{
			
			$txt = '1 heure, et '.ceil(($ecart-(60*60))/60).' minutes';
			}
		else
			{
			$txt = ceil($ecart/(60*60)).' heures';
			}
		}
		
	return $txt;
	}
	
function date_nbdays4month($month,$year)
	{
	if ($month==2)
		{
		if($year%4) return 28;
		elseif($year%100) return 29;
		elseif($year%1000) return 28;
		else return 29;
		}
	else if (($month==4)||($month==6)||($month==9)||($month==11))
		{
		return 30;
		}
	return 31;
	}
	
function date_nombre2mois($nombre=1)
	{
	$listemois = array ('janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre');
	
	if (($nombre <= 12) AND ($nombre >= 1))
		{
		$mois = $listemois[($nombre -1)];
		}
	
	return $mois;
	}
	
function date_nombre2jour($nombre=0)
	{
	$jours = array ('dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi');
	
	if (($nombre <= 6) AND ($nombre >= 0))
		{
		$jour = $jours[$nombre];
		}
	
	return $jour;
	}
	
function date_timestamp2strdate($timestamp)
	{
	$strdate = date('d',$timestamp).' '.date_nombre2mois(date('m',$timestamp)).' '.date('Y',$timestamp);
	
	return $strdate;
	}
	
function date_timestamp2strdateheure($timestamp)
	{
	$strdateheure = date_timestamp2strdate($timestamp);
	
	if ((date('H',$timestamp) > 0) OR (date('i',$timestamp) > 0))
		{
		if (date('i',$timestamp) > 0)
			{
			$strdateheure .= ', à '.date('H',$timestamp).' h '.date('i',$timestamp);
			}
		else
			{
			$strdateheure .= ', à '.date('H',$timestamp).' heures';
			}
		}
	
	return $strdateheure;
	}

Conclusion :


Mon blog:
http://360.yahoo.com/olie_ze_kat

A voir également

Ajouter un commentaire

Commentaires

malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Yo yo Olid => "où les performances etaient trés importante" : drôle de façon de voir les performances...lol, mais bon.

"Je vais qd meme pô vous macher le travail, en plus... A vos claviers messieurs dames ! :o| "
Bah si! Justement! Un code comme celui-là ne servira pas à un bon codeur php, il sera capable de faire le sien, à sa sauce, et préfèrera sans doute, vu la longueur de ton code. Un débutant, lui, sera sans aucun doute ravi! Sauf que...justement, lui ne sera sans doute pas capable de le modifier pour le rendre plus performant et surtout plus lisible. Et ça, c'est bel et bien ton boulot :-)
cs_olid
Messages postés
296
Date d'inscription
lundi 2 septembre 2002
Statut
Membre
Dernière intervention
28 janvier 2008
-
je vous donne l'idée, et c'est un code issu dune plateforme multilangue (que jai résumé au français) où les performances etaient trés importante.

Je vais qd meme pô vous macher le travail, en plus... A vos claviers messieurs dames ! :o|
fuckya
Messages postés
125
Date d'inscription
mercredi 31 mars 2004
Statut
Membre
Dernière intervention
8 juin 2006
-
L'idée est bonne dans le fond, ca me fait penser que je devrait m'en faire une pour mes besoins persos.

A part ca je suis d'accord pour les arrays, switch et autres, les perfs ok, mais avant tout la lisibilité ! D'autre part dans tes trois fonctions tu utilises $codelangue comme 2ème attribut mais n'est jamais utilisé ;)
ImmortalPC
Messages postés
955
Date d'inscription
mardi 11 mai 2004
Statut
Membre
Dernière intervention
11 novembre 2008
2 -
Salut,
le code est pas mal mais tu aurais pu remplacer :
if ($nombre ==1)
{
$mois = "janvier";
}
else if ($nombre == 2)
{
$mois = "février";
}
else if ($nombre == 3)
{
$mois = "mars";
}
else if ($nombre ==4)
{
$mois = "avril";
}
else if ($nombre ==5)
{
$mois = "mai";
}
else if ($nombre ==6)
{
$mois = "juin";
}
else if ($nombre ==7)
{
$mois = "juillet";
}
else if ($nombre ==8)
{
$mois = "août";
}
else if ($nombre ==9)
{
$mois = "septembre";
}
else if ($nombre ==10)
{
$mois = "octobre";
}
else if ($nombre ==11)
{
$mois = "novembre";
}
else if ($nombre ==12)
{
$mois = "décembre";
}

par un array !!!

Ensuite parfois tu utilises les ' autre fois " , il faut rester constant ;-)

Ensuite pour la technique cité par Malalam c' est comme ça:
<?php
if(!setlocale(LC_ALL,'fr')){// Esque le serveur a pour OS Windows ?
setlocale(LC_ALL,'fr_FR');// Le serveur a pour OS Linux !
}

$jour = date('l j F Y');

$heure = date('G:i:s');

$jour = strftime('%A %d %B %Y', strtotime($jour));
$jour = str_replace(array(' 01 ',' 0'), array(' 1er ',' '), $jour);

echo $jour,' à ',$heure;
?>

@+
malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Allez, j'en rajoute ;-)
Je suis d'accord avec les autres : la qualité du code pourrait largement être améliorer, et ce ne serait pas du luxe. Et je ne parle même pas de rapidité, mais vraiment d'agrément aussi.

Sinon, je trouve aussi que c'est une bonne idée!

Par contre, à quoi sert $codelangue? Parce que si tu comptes décliner tes fonctions dans d'autres langues, là, il devient urgent de changer leur structure ;-)

Pour mémoire, je rappelle quand même que dans pas mal de cas, pour afficher le jour, le mois, et le format général d'une date en français (sur un serveur français), on peut utiliser set_locale ().

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.