Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3028 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2033910
GaelGael
Vit bien les déconvenues
Posté le 03-11-2010 à 22:08:26  profilanswer
 

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;
}
?>

mood
Publicité
Posté le 03-11-2010 à 22:08:26  profilanswer
 

n°2033945
jeca
Posté le 04-11-2010 à 09:39:06  profilanswer
 

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. ?>

n°2033996
sligor
Posté le 04-11-2010 à 14:34:03  profilanswer
 

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
n°2034017
rufo
Pas me confondre avec Lycos!
Posté le 04-11-2010 à 15:32:23  profilanswer
 

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
n°2034074
GaelGael
Vit bien les déconvenues
Posté le 04-11-2010 à 22:42:41  profilanswer
 

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

n°2034306
sircam
I Like Trains
Posté le 05-11-2010 à 16:59:30  profilanswer
 

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}
n°2039304
smaragdus
whores, drugs & J.S. Bach
Posté le 30-11-2010 à 18:06:07  profilanswer
 

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

n°2039314
NewsletTux
&lt;Insérez ici votre vie /&gt;
Posté le 30-11-2010 à 20:21:46  profilanswer
 

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
n°2039443
smaragdus
whores, drugs & J.S. Bach
Posté le 01-12-2010 à 16:17:20  profilanswer
 

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.

n°2040021
sircam
I Like Trains
Posté le 04-12-2010 à 15:18:45  profilanswer
 

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}

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
Aide sur l'execution d'un code en perlChaine de lettre aléatoire
exercice algo "code barre"code source en Cpp
code en c qui lis un fileassocier cellule à un code
documenter du code python 3 avec Sphinx ?recherche de date
Requete SQL sur date PHPCode qui fait crasher excel??
Plus de sujets relatifs à : Age - Code calculant la différence entre deux date en lettre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR