Table des matières
Niveau
..........
En rapport...

Ajouter, soustraire, comparer des dates

On constate souvent que les gens maîtrise mal les opérations sur les dates..
J'ai donc essayé de concevoir un système simple pour modifier une date.
Avec la classe suivante, vous pourrez :

Comment ça marche

En 1er lieu, il faut instancier la classe en lui donnant la date de départ ainsi que son format :

php
$madate=new dateOp("14/07/2006 12:30","jj/mm/aaaa hh:ii");
// ou 
$madate=new dateOp("14.7.06 8:10","jj.m.aa h:ii");

La définition du format de date est trés importante.

Dans la définition du format de la date :
'j' représente les jours ('jj' pour avoir le zero initial)
'm' représente les mois ('mm' pour avoir le zero initial)
'aa' représente les années ('aaaa' pour avoir l'année sur 4 chiffres)
'h' représente les heures ('hh' pour avoir le zero initial)
'ii' représente les minutes
'ss' représente les secondes
Cette classe ne fonctionne qu'avec des dates numériques. Il vous sera impossible de travailler avec une date alphanumérique. (ex : “12 septembre 2006” est une mauvaise date).

Ensuite, vous effectuez les opérations désirées.

Ajouter ou soustraire des jours

Pour cela, vous devez utiliser la fonction AjouteJours
Pour additionner 5 jours :

php
$madate->AjouteJours(5);

Pour soustraire 9 jours :

php
$madate->AjouteJours(-9);

Ajouter ou soustraire des mois

Pour cela, vous devez utiliser la fonction AjouteMois
Pour additionner 5 mois :

php
$madate->AjouteMois(5);

Pour soustraire 9 mois :

php
$madate->AjouteMois(-9);

Ajouter ou soustraire des années

Pour cela, vous devez utiliser la fonction AjouteAnnees
Pour additionner 5 années :

php
$madate->AjouteAnnees(5);

Pour soustraire 9 années :

php
$madate->AjouteAnnees(-9);

Ajouter ou soustraire des heures

Pour cela, vous devez utiliser la fonction AjouteHeures
Pour additionner 5 heures :

php
$madate->AjouteHeures(5);

Pour soustraire 9 heures :

php
$madate->AjouteHeures(-9);

Ajouter ou soustraire des minutes

Pour cela, vous devez utiliser la fonction AjouteMinutes
Pour additionner 5 minutes :

php
$madate->AjouteMinutes(5);

Pour soustraire 9 minutes :

php
$madate->AjouteMinutes(-9);

Ajouter ou soustraire des secondes

Pour cela, vous devez utiliser la fonction AjouteSecondes
Pour additionner 5 secondes :

php
$madate->AjouteSecondes(5);

Pour soustraire 9 secondes :

php
$madate->AjouteSecondes(-9);

Connaître la différence entre deux dates

Après avoir instancié la classe avec une date d'origine (comme décrit plus haut) vous pouvez la comparer à une seconde date en utilisant la fonction DiffenrenceEntreDate

php
$difference=$madate->DiffenrenceEntreDate('11/04/2000','jj/mm/aaaa');

la fonction DiffenrenceEntreDate renvoie une variable de type tableau qui contient 4 valeurs. Les 3 premières corresponde au nombre d'années, de mois et de jours qui séparent les deux date. La 4eme valeur correspond au nombre de jour qui sépare les deux dates.
Le code ci-dessous renverra par exemple :

Array
(
    [ans] => 10
    [mois] => 2
    [jours] => 3
    [joursTotal] => 3715.20842593
    [heures] => 5
    [minutes] => 00
    [secondes] => 08
)
La fonction DiffenrenceEntreDate prend 2 paramètres :
La date de comparaison
Le format de la date de comparaison. Ce format est défini de la même façon que précédemment.
Si vous avez effectué des additions ou des soustractions à la date d'origine, il en sera tenu compte lors de la comparaison.

Obtenir la date

Après avoir effectué toutes vos opérations, vous pouvez récupérer la date au format que vous désirez.
Pour cela, utilisez la fonction GetDate

php
echo $madate->GetDate('h:i:s jj-mm-aaaa');
La fonction GetDate prend 1 parametres :
Le format de la date de sortie. Ce format est défini de la même façon que précédemment.

Debogage

Vous pouvez afficher certaines informations de débogage en affichage la variable tableau errno :

php
print_r($madate->errno);
/*
Affichera, par exemple :
Array
(
    [0] => jj/mm/aaaa : Les heures n'ont pas été trouvées... Les heures doivent être précisées par 'hh' ou 'h' (ex: jj/mm/aaaa hh:ii:ss)
    [1] => jj/mm/aaaa : Les minutes n'ont pas été trouvées... Les minutes doivent être précisées par 'ii' ou 'i' (ex: jj/mm/aaaa hh:ii:ss)
    [2] => jj/mm/aaaa : Les secondes n'ont pas été trouvées... Les secondes doivent être précisées par 'ss' ou 's' (ex: jj/mm/aaaa hh:ii:ss)
)
*/

Code

Placez ce code dans un fichier nommé “date.class.php” et pensez à l'inclure dans vos pages (include(“date.class.php”);)

php
<?php
class dateOp {	
	function dateOp($dat,$format="jj/mm/aaaa hh:ii:ss") {
		$this->errno = array();
 
		if (strlen($dat)!=strlen($format)) {
			$this->_error("Format de date incompatible avec la date fournie");
			return false;
		}
 
		$this->dat['origine']=$dat;
		$this->format=strtolower($format);
		return $this->_ExplodeDate($this->dat,$this->format);
	}
 
	function AjouteJours($nb) {
		$this->dat['jj']+=floatval($nb);
		return true;
	}
	function AjouteMois($nb) {
		$this->dat['mm']+=floatval($nb);
		return true;
	}
	function AjouteAnnees($nb) {
		$this->dat['aaaa']+=floatval($nb);
		return true;
	}
	function AjouteHeures($nb) {
		$this->dat['hh']+=floatval($nb);
		return true;
	}
	function AjouteMinutes($nb) {
		$this->dat['ii']+=floatval($nb);
		return true;
	}
	function AjouteSecondes($nb) {
		$this->dat['ss']+=floatval($nb);
		return true;
	}
	function DiffenrenceEntreDate($dat,$format="jj/mm/aaaa hh:ii:ss") {
		if (strlen($dat)!=strlen($format)) {
			$this->_error("Format de date incompatible avec la date fournie");
			return false;
		}
		$this->dat2['origine']=$dat;
		$this->format2=strtolower($format);
		$this->_ExplodeDate($this->dat2,$this->format2);
		$d1=mktime($this->dat['hh'],$this->dat['ii'],$this->dat['ss'],$this->dat['mm'],$this->dat['jj'],$this->dat['aaaa']);
		$d2=mktime($this->dat2['hh'],$this->dat2['ii'],$this->dat2['ss'],$this->dat2['mm'],$this->dat2['jj'],$this->dat2['aaaa']);
 
		if ($d2>$d1)
			$d=$d2-$d1;
		else
			$d=$d1-$d2;
 
		return array("ans"=>date('Y',$d)-1970,"mois"=>date('m',$d)-1,"jours"=>date('d',$d)-1,"joursTotal"=>$d/60/60/24,"heures"=>date("G",$d)-1,"minutes"=>date("i",$d),"secondes"=>date("s",$d));
	}
 
	function GetDate($format="jj/mm/aaaa") {
		$format=str_replace(array('jj','j','m','nn','aaaa','aa','hh','h','ii','ss'),array('d','D','n','m','Y','y','H','G','i','s'),$format);
		return date($format,mktime($this->dat['hh'],$this->dat['ii'],$this->dat['ss'],$this->dat['mm'],$this->dat['jj'],$this->dat['aaaa']));
	}
 
	function _ExplodeDate(&$dat,$format) {
		$j[0]=2;
		if (($j[1]=strpos($format,'jj'))===false) {
			$j[0]=1;
			if (($j[1]=strpos($format,'j'))===false)
				$this->_error($format." : Les jours n'ont pas été trouvés... Les jours doivent être précisés par 'jj' ou par 'j' (ex: jj/mm/aaaa)");	
		}
		$m[0]=2;
		if (($m[1]=strpos($format,'mm'))===false)
			$m[0]=1;
			if (($m[1]=strpos($format,'m'))===false)
				$this->_error($format." : Les mois n'ont pas été trouvés... Les mois doivent être précisés par 'mm' ou par 'm' (ex: jj/mm/aaaa)");
		$a[0]=4;
		if (($a[1]=strpos($format,'aaaa'))===false) {
			//cherche pour un aa au lieu de aaaa
			$a[0]=2;
			if (($a[1]=strpos($format,'aa'))===false)
				$this->_error($format." : Les années n'ont pas été trouvés... Les années doivent être précisés par 'aaaa' ou par 'aa' (ex: jj/mm/aaaa)");
		}
		$h[0]=2;
		if (($h[1]=strpos($format,'hh'))===false)
			$h[0]=1;
			if (($h[1]=strpos($format,'h'))===false)
				$this->_error($format." : Les heures n'ont pas été trouvées... Les heures doivent être précisées par 'hh' ou 'h' (ex: jj/mm/aaaa hh:ii:ss)");
		$i[0]=2;
		if (($i[1]=strpos($format,'ii'))===false)
			$i[0]=1;
			if (($i[1]=strpos($format,'i'))===false)
				$this->_error($format." : Les minutes n'ont pas été trouvées... Les minutes doivent être précisées par 'ii' ou 'i' (ex: jj/mm/aaaa hh:ii:ss)");
		$s[0]=2;
		if (($s[1]=strpos($format,'ss'))===false)
			$s[0]=1;
			if (($s[1]=strpos($format,'s'))===false)
				$this->_error($format." : Les secondes n'ont pas été trouvées... Les secondes doivent être précisés par 'ss' ou 's' (ex: jj/mm/aaaa hh:ii:ss)");
		$dat['jj']	=($j[1]!==false)?floatval(substr($dat['origine'],$j[1],$j[0])):1;
		$dat['mm']	=($m[1]!==false)?floatval(substr($dat['origine'],$m[1],$m[0])):1;
		$dat['aaaa']	=($a[1]!==false)?floatval(substr($dat['origine'],$a[1],$a[0])):1970;
		if ($a[0]==2)
			$dat['aaaa']=floatval(substr(date('Y'),0,2).$dat['aaaa']);
		$dat['hh']	=($h[1]!==false)?floatval(substr($dat['origine'],$h[1],$h[0])):0;
		$dat['ii']	=($i[1]!==false)?floatval(substr($dat['origine'],$i[1],$i[0])):0;
		$dat['ss']	=($s[1]!==false)?floatval(substr($dat['origine'],$s[1],$s[0])):0;
		return true;
	}
	function _error($str) {
		$this->errno[]=$str;
		return true;
	}
}
?>

Voici aussi un petit exemple pour tester :

php
<?php
include("date.class.php");
echo '<pre>';
$a=new dateOp(date('Y.m-d His'),'aaaa.mm-jj hhiiss');
$a->AjouteJours(-800);
echo $a->GetDate('h:i:s jj-mm-aaaa')."\n";
print_r($a->DiffenrenceEntreDate('10/03/1992','jj/mm/aaaa'));
print_r($a->errno);
echo '</pre>';
?>


20/07/2006 12:03 -

iDo –