Intervalle entre 2 dates / différence entre 2 dates

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 285 fois - Téléchargée 27 fois

Contenu du snippet

Bon, tout bêtement :

<?=intervaleDates("20040601","20040610")?>

affiche

9

Et ça marche quelque soit la date. Pas de prob dû à mktime qui marche pu en dessous de 1970. Pas de problème avec les années bissextiles non plus.

Source / Exemple :


// Donne l'intervale en jours entre 2 dates
function intervaleDates($date1,$date2)
{
	// $date2 sera plus récente que $date1
	if (intval($date1) > intval($date2))
	{
		$tmp = $date1;
		$date1 = $date2;
		$date2 = $tmp;
	}
	// les dates sont-elles au bon format ?
	if (ereg("([0-9]{4})([0-9]{2})([0-9]{2})", $date1, $regs1)
		&& ereg("([0-9]{4})([0-9]{2})([0-9]{2})", $date2, $regs2))
	{
		$d1 = intval($regs1[3]);	$m1 = intval($regs1[2]);	$y1 = intval($regs1[1]);
		$d2 = intval($regs2[3]);	$m2 = intval($regs2[2]);	$y2 = intval($regs2[1]);
		$by1 = ($y1 - 2000) % 4;
		$by2 = ($y2 - 2000) % 4;
		$dy1 = array(0,31,($by1 == 0 ? 29 : 28),31,30,31,30,31,31,30,31,30,31);
		$dy2 = array(0,31,($by2 == 0 ? 29 : 28),31,30,31,30,31,31,30,31,30,31);
		// si les années sont différentes
		// on ajoute les jours restant à $y1 et les jours de plus à $y2 + 1 pour le passage d'année
		// puis on ajoute les jours des années entre $y1 et $y2
		if ($y1 != $y2)
		{
			$interval = intervaleDates($date1,$y1."1231") + intervaleDates($y2."0101",$date2) + 1;
			for ($i = $y1 + 1; $i < $y2; $i++)
			{
				$b = ($i - 2000) % 4;
				$interval += ($b == 0 ? 366 : 365);
			}
			return $interval;
		}
		// Si $y1 == $y2
		// si les mois sont égaux, on renvoie la différence entre les jours
		if ($m1 == $m2)
			return $d2 - $d1;
		// sinon on fait un savant calcul ;)
		if ($m2 > $m1)
		{
			$r1 = 0;
			for ($i = $m1; $i < $m2; $i++)
				$r1 += $dy1[$i];
			return $r1 - $d1 + $d2;
		}
	}
	echo "<b>Parse error:</b> Argument(s) incorrect(s) pour intervaleInDays(). Attendu : 'AAAAMMJJ'<br />\n";
	return FALSE;
}

Conclusion :


Vos commentaires sont les bienvenus.

A voir également

Ajouter un commentaire

Commentaires

cs_gege217
Messages postés
40
Date d'inscription
jeudi 23 janvier 2003
Statut
Membre
Dernière intervention
13 août 2008
-
Petit rectificatif :

Dans le contexte d'utilisation que j'ai des calculs de date, je fais des stats et des calculs suivants des filtres sur dates avec des périodes données... et j'utilise donc le système de requete SQL pour faire mes calculs.
Comme ca, j'ai plus qu'un traitement d'affichage à faire...

.oOMimiLOo.

> natha : bien sur, ca marche avec des dates < à 1970.
cs_natha
Messages postés
22
Date d'inscription
mardi 13 mai 2003
Statut
Membre
Dernière intervention
21 octobre 2005
-
Ouaip ça j'avais bien compris ;) C'est juste qu'il faut garder l'idée sous l'coude et pas forcément la rejetter en bloc. Personne n'a (totalement) tord. :p
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008
-
"Bon c'est sur, ca nécéssite une base de donnée... mais dans la plupart des cas, on accouple tjs PHP à une base ...."

ça veut dire qu'il comptait utiliser cette méthode même hors contexte BDD, ce que, très personnellement, je trouve furieux, sans rancune ;-)
cs_natha
Messages postés
22
Date d'inscription
mardi 13 mai 2003
Statut
Membre
Dernière intervention
21 octobre 2005
-
Kirua, faut voir le contexte... selon les cas, si t'es déjà connecté à la base et que ton traitement concerne les données en base à insérer par exemple ou autre alors autant utiliser le truc de gege217. Bon c'est sûr que des cas comme ça il faut en trouver, mais ça peut arriver.
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008
-
gege, tu nous fais une horreur :/ tu vas pas embêter le serveur de BDD pour des cons calculs et quelques conditionnelles :/ je ferais jamais ça :/

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.