Age - Code calculant la différence entre deux date en lettre

Age - Code calculant la différence entre deux date en lettre - PHP - Programmation

Marsh Posté le 03-11-2010 à 22:08:26    

Bonjour à tous,
 
Je développe un site pour ma fille (1 an depuis peu) et j'avais une ligne qui ne marchait pas très bien jusqu'à il y a peu...  :)  Ayant trouvé tous les bugs, je vous met le code ci après. Pour ceux qui ont un(e) petit(e) et qui on envie d'afficher son age de manière plus naturelle... que "426 jours aujourd'hui" par exemple.
 
C'est une fonction qui n'affiche rien. Elle retourne la chaîne à afficher dans votre code sous la forme "6 ans, 3 mois et 2 jours" ou  "6 ans et 3 mois", etc. selon la date.
 
<?php  
function AgeLong($dateNaissance,$datedujour)
{ // Formats des dates "2009-10-13"
 $Jour=substr($datedujour,8,2);
 $Mois=substr($datedujour,5,2);
 $Annee=substr($datedujour,0,4);
 $NJour=substr($dateNaissance,8,2);
 $NMois=substr($dateNaissance,5,2);
 $NAnnee=substr($dateNaissance,0,4);
 switch($Annee)
 { //_________________________________________________ années précédentes
  case $Annee < $NAnnee :
   echo "/(Erreur sur ann&#233;e de naissance)";
      break;
     //_________________________________________________ même année
  case $NAnnee :
   switch($Mois)  
       {  
             case $Mois < $NMois:  
                 $Age = "/(Erreur sur ann&#233;e de naissance)";
        break;
             case $NMois:  
         switch($Jour)  
         {  
               case $Jour < $NJour:  
                   $Age = "/(Erreur sur ann&#233;e de naissance)";
          break;
               case $NJour:  
                 $Age ="moins d'un jour";
                break;
               case $Jour > $NJour:
                   IF (($Jour - $NJour)==1) {$Age = $Jour - $NJour." jour";}
                ELSE {{$Age = $Jour - $NJour." jours";}}
                   break;
         }  
              break;
             case $Mois > $NMois:
         switch($Jour)  
         {  
               case $Jour < $NJour:  
                   $AgeMois=$Mois - $NMois-1;
                   $MaxjMois=date("t", mktime(0, 0, 0, ($Mois-1), 1, $Annee));
                   $AgeJour=$MaxjMois-$NJour+$Jour;
                   IF ($AgeMois==0)
                  {  IF ($AgeJour==1) {$Age = $AgeJour." jour";}
                   ELSE     {$Age = $AgeJour." jours";}
                  }
                ELSE {  $Age = $AgeMois." mois et ".$AgeJour." jours";}
                $Age=$Age." [1]";
          break;
               case $NJour:  
                 $AgeMois=$Mois - $NMois;
            $Age = $AgeMois." mois";
            $Age=$Age." [2]";
                break;
               case $Jour > $NJour:
                   $AgeMois=$Mois - $NMois;
                   $AgeJour=$Jour-$NJour;
                IF ($AgeJour==1) {$Age = $AgeMois." mois et ".$AgeJour." jour";}
                ELSE     {$Age = $AgeMois." mois et ".$AgeJour." jours";}
                $Age=$Age." [3]";
                break;
         }  
              break;
       }  
      break;
  //_________________________________________________ années suivantes
  case $Annee > $NAnnee :
   switch($Mois)  
       {  
             case $Mois < $NMois:  
                 $AgeAnnee=$Annee - $NAnnee -1;  
     switch($AgeAnnee)  
         {  case 0 :
           $Age="";
                break;
          case 1 :
           $Age=$AgeAnnee." an";
           break;
          default:
           $Age=$AgeAnnee." ans";
           break;
              }
              switch($Jour)  
         {  
               case $Jour < $NJour:  
                   $AgeMois=(2+$Mois-1)." mois ";
                   $MaxjMois=date("t", mktime(0, 0, 0, ($Mois-1), 1, $Annee));
                   $AgeJour=($MaxjMois-$NJour)+$Jour;
                   IF ($Age!="" ) {$Age=$Age.", ";}
           IF ($AgeJour==1) {$Age=$Age.$AgeMois." et ".$AgeJour." jour";}
                ELSE     {$Age=$Age.$AgeMois." et ".$AgeJour." jours";}
          break;
               case $NJour:  
                $AgeMois=2+$Mois." mois ";
                IF ($Age=="" ){$Age=$AgeMois;}
                ELSE {$Age=$Age." et ".$AgeMois;}
                break;
               case $Jour > $NJour:
                $AgeMois=2+$Mois." mois ";
                $AgeJour=$Jour-$NJour;
           IF ($Age!="" ) {$Age=$Age.", ";}
           IF ($AgeJour==1) {$Age=$Age.$AgeMois." et ".$AgeJour." jour";}
                ELSE     {$Age=$Age.$AgeMois." et ".$AgeJour." jours";}
                break;
         }  
         break;
                 
             case $NMois:  
                 switch($Jour)  
         {  
               case $Jour < $NJour:  
                $AgeAnnee=$Annee - $NAnnee -1;
           switch($AgeAnnee)  
           {  case 0 :
             $Age="";
                  break;
            case 1 :
             $Age=$AgeAnnee." an";
             break;
            default:
             $Age=$AgeAnnee." ans";
             break;
                }
                   $AgeMois=(2+$Mois-1)." mois ";
                   $MaxjMois=date("t", mktime(0, 0, 0, ($Mois-1), 1, $Annee));
                   $AgeJour=($MaxjMois-$NJour)+$Jour;
           IF ($Age!="" ) {$Age=$Age.", ";}
                   IF ($AgeJour==1) {$Age=$Age.$AgeMois." et ".$AgeJour." jour";}
                   ELSE             {$Age=$Age.$AgeMois." et ".$AgeJour." jours";}
          break;
               case $NJour:  
                $AgeAnnee=$Annee - $NAnnee;
                IF ($AgeAnnee==1) {$Age=$AgeAnnee." an "; }
                ELSE              {$Age=$AgeAnnee." ans ";}
                break;
               case $Jour > $NJour:
                $AgeAnnee=$Annee - $NAnnee;
                IF ($AgeAnnee==1) {$AgeAnnee=$AgeAnnee." an";}
                ELSE {$AgeAnnee=$AgeAnnee." ans";}
                $AgeJour=$Jour-$NJour;
                IF ($AgeJour==1) {$Age=$AgeAnnee." et ".$AgeJour." jour";}
                   ELSE             {$Age=$AgeAnnee." et ".$AgeJour." jours";}
                break;
         }  
         break;
             case $Mois > $NMois:
              $AgeAnnee=$Annee - $NAnnee;
              IF ($AgeAnnee==1) {$AgeAnnee=$AgeAnnee." an";}
                 ELSE              {$AgeAnnee=$AgeAnnee." ans";}
              switch($Jour)  
         {  
               case $Jour < $NJour:
                IF (($Mois-$NMois-1)==0) {$AgeMois="";}
                ELSE                     {$AgeMois=($Mois-$NMois-1)." mois ";}
                   $MaxjMois=date("t", mktime(0, 0, 0, ($Mois-1), 1, $Annee));
                   $AgeJour=($MaxjMois-$NJour)+$Jour;
                   IF ($AgeMois!="" ){$AgeAnnee=$AgeAnnee.", ";}
                   
                   IF ($AgeJour==1) {$Age=$AgeAnnee.$AgeMois." et ".$AgeJour." jour";}
                   ELSE             {$Age=$AgeAnnee.$AgeMois." et ".$AgeJour." jours";}
          break;
               case $NJour:  
                $AgeMois=($Mois-$NMois)." mois ";  
                $Age=$AgeAnnee." et ".$AgeMois;
                break;
               case $Jour > $NJour:
                $AgeMois=($Mois-$NMois)." mois ";
                $AgeJour=$Jour-$NJour;
                IF ($AgeJour==1) {$Age=$AgeAnnee.", ".$AgeMois." et ".$AgeJour." jour";}
                   ELSE             {$Age=$AgeAnnee.", ".$AgeMois." et ".$AgeJour." jours";}
                break;
         }  
              break;
       }
      break;
 }
 return $Age;
}
?>

Reply

Marsh Posté le 03-11-2010 à 22:08:26   

Reply

Marsh Posté le 04-11-2010 à 09:39:06    

Bonjour,
 
Depuis PHP 5.3,il y a les classes "DateTime", "DateInterval", etc ...
 

Code :
  1. <?php
  2.   $dateNaissance = new DateTime('2000-04-26');
  3.   $datedujour = new DateTime();
  4.   $age = $datedujour -> diff($dateNaissance);
  5.   echo $age -> format('Vous avez %Y ans %m mois %d jours');
  6. ?>

Reply

Marsh Posté le 04-11-2010 à 14:34:03    

GaelGael a écrit :

Pour ceux qui ont un(e) petit(e) et qui on envie d'afficher son age de manière plus naturelle... que "426 jours aujourd'hui" par exemple.
 


utilises doctissimo  :o


---------------
qwerty-fr
Reply

Marsh Posté le 04-11-2010 à 15:32:23    

J'en connais un qui n'a jamais vu les fonctions date() et strtotime() :/ Le code est absolument horrible et énorme pour juste afficher un délai écoulé  :pt1cable:


Message édité par rufo le 04-11-2010 à 15:32:36

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 04-11-2010 à 22:42:41    

Euh bon , oui, je reconnais  :sarcastic:, c'est bourrin  :pt1cable:  
 
Mais bon, ça fait quelques temps que j'ai pas fait de Php et ce bout de code ma remis pas mal de truc en place déjà.  :jap: (auto persuasion !)
 
Mais sinon les Datetime c'est avec PHP 5.3 si je ne m'abuse ?? Là avec ma page perso (FAI : Free) je suis en PHP 4.4.3...
Bon du coup j'ai cherché et j'ai trouvé sur un Forum (http://www.commentcamarche.net/forum/affich-3334327-free-fr-versions-php) qu'en mettant un .htaccess contenant Php 5. il était possible de passer en Php 5. J'ai essayé mais ça ne marche pas du tout contrairement à ce qui est dit. Depuis 2007 ça a peut être changé.
 
 
Sinon, la ligne echo $age -> format('Vous avez %Y ans %m mois %d jours');  
ne gère pas les ages sans mois ou sans jours,... non ? Ca doit donner un truc du style "2 ans 0 mois et 1 jour" ? et aussi quand il y a qu'un an on a "1 ans" ? il doit falloir donc rajouter des tests sur %Y ùm et %d
 
Apparemment mon code vous a bien amusé, mon code de test est plus court :
require_once "Age.php";
$cptan=2009;
$cptmois=10;
$cptjours=10;
while ($cptan<2015)
{    
    while ($cptmois<13)
    {    
        while ($cptjours<=(date("t", mktime(0, 0, 0, $cptmois, 1, $cptan))))
        {    
        $datedeux=$cptan;
        if ($cptmois<10) {$datedeux=$datedeux."-0".$cptmois;}
        else {$datedeux=$datedeux."-".$cptmois;}
        if ($cptjours<10){$datedeux=$datedeux."-0".$cptjours;}
        else {$datedeux=$datedeux."-".$cptjours;}
        echo "<BR>";
        $dateUn="2009-10-13";
        $Age=AgeLong($dateUn,$datedeux);
            echo $dateUn." - ".$datedeux." - Annaïs a <b>".$Age."</b>";
            $cptjours+=1;
        }
        $cptjours=1;
        $cptmois+=1;    
    }
    $cptmois=1;
    $cptan+=1;
}
 
C'est joli  :pt1cable:  
 
Si je peut avoir le Php 5.3 sur ma page perso c'est que je me suis compliqué la vie...  
 
Gaël

Reply

Marsh Posté le 05-11-2010 à 16:59:30    

GaelGael a écrit :


 

Code :
  1. <?php
  2. function AgeLong($dateNaissance,$datedujour)
  3. {
  4. ...
  5. }
  6. ?>




 [:kzimir]  [:kzimir]  [:kzimir]


Message édité par sircam le 05-11-2010 à 17:00:05

---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 30-11-2010 à 18:06:07    

mktime pour faire des différences de date c'est le mal :o
 
(un indice : changement d'heure hiver / été )

Reply

Marsh Posté le 30-11-2010 à 20:21:46    

bah, tant que t'es pas né un 26 octobre entre 2h et 3h du mat' ... :o


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 01-12-2010 à 16:17:20    

et que tu n'interroges pas le serveur entre 2h et 3h :D
 
La différence de jour entre 2 dates peut devenir quelque chose de très compliqué si on veut faire les choses bien et pas un truc crade à l'arrache. En théorie, faudrait même tenir compte du fuseau horaire de l'internaute.

Reply

Marsh Posté le 04-12-2010 à 15:18:45    

smaragdus a écrit :

La différence de jour entre 2 dates peut devenir quelque chose de très compliqué si on veut faire les choses bien et pas un truc crade à l'arrache. En théorie, faudrait même tenir compte du fuseau horaire de l'internaute.


9 implémentations sur 10 sont sans doute foireuses, la plupart des développeurs s'imaginant que 1 jour == 24 heures  :D


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed