









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 :
En 1er lieu, il faut instancier la classe en lui donnant la date de départ ainsi que son format :
$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.
Ensuite, vous effectuez les opérations désirées.
Pour cela, vous devez utiliser la fonction AjouteJours
Pour additionner 5 jours :
$madate->AjouteJours(5);
Pour soustraire 9 jours :
$madate->AjouteJours(-9);
Pour cela, vous devez utiliser la fonction AjouteMois
Pour additionner 5 mois :
$madate->AjouteMois(5);
Pour soustraire 9 mois :
$madate->AjouteMois(-9);
Pour cela, vous devez utiliser la fonction AjouteAnnees
Pour additionner 5 années :
$madate->AjouteAnnees(5);
Pour soustraire 9 années :
$madate->AjouteAnnees(-9);
Pour cela, vous devez utiliser la fonction AjouteHeures
Pour additionner 5 heures :
$madate->AjouteHeures(5);
Pour soustraire 9 heures :
$madate->AjouteHeures(-9);
Pour cela, vous devez utiliser la fonction AjouteMinutes
Pour additionner 5 minutes :
$madate->AjouteMinutes(5);
Pour soustraire 9 minutes :
$madate->AjouteMinutes(-9);
Pour cela, vous devez utiliser la fonction AjouteSecondes
Pour additionner 5 secondes :
$madate->AjouteSecondes(5);
Pour soustraire 9 secondes :
$madate->AjouteSecondes(-9);
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
$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
)
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
echo $madate->GetDate('h:i:s jj-mm-aaaa');
Vous pouvez afficher certaines informations de débogage en affichage la variable tableau errno :
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) ) */
Placez ce code dans un fichier nommé “date.class.php” et pensez à l'inclure dans vos pages (include(“date.class.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 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 -
Discussion