Intervalle entre 2 dates / différence entre 2 dates

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

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.