Temps écoulé (durée) entre 2 dates sous forme littéral naturelle

0/5 (8 avis)

Snippet vu 16 005 fois - Téléchargée 30 fois

Contenu du snippet

Fonction calculant l'écart entre 2 timestamps Unix et renvoyant un texte littéral naturel sur cette durée.

Ex:
- 1 an et demi
- 2 semaines
- 1 heure et quart

Plus l'écart est faible, plus le texte est précis... Le but est de produire une information rapidement compréhensible par un Homme.

ATTENTION: le premier timestamp Unix DOIT être le plus vieux.

Source / Exemple :


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

A voir également

Ajouter un commentaire Commentaires
cs_olid Messages postés 296 Date d'inscription lundi 2 septembre 2002 Statut Membre Dernière intervention 28 janvier 2008
22 oct. 2009 à 12:40
il faut calculer le $ecart dés le début, puis déplacer la derniere section avant les comparaisons par années/mois/jours
bibiroot Messages postés 7 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 22 mai 2007
21 oct. 2009 à 10:36
Enfin je voulais dire que le script exécuté à 0H02 indiquait 24 heures au lieu de 3 minutes désolé pour l'explication incomplète
bibiroot Messages postés 7 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 22 mai 2007
21 oct. 2009 à 00:40
Il y a bogue au changement de jour
j'ai essayé le script en prenant un timestamp à 23H59
lors du passage à 0H00 le script marque 24 heures
or il n'y a que trois minutes d'écart
cs_AgentSmith Messages postés 26 Date d'inscription dimanche 16 décembre 2001 Statut Membre Dernière intervention 2 avril 2009
2 avril 2009 à 22:45
Très bon code, fonctionne très bien... bonne continuation
viki53 Messages postés 31 Date d'inscription samedi 9 février 2008 Statut Membre Dernière intervention 11 septembre 2008
24 mars 2008 à 08:01
Super source 10/10 :)

Je viens de l'installer sur mon site pour les dernières connexions des membres et les MP et pour l'instant je n'ai pas à m'en plaindre !

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.