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

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

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.