Comparaison entre 2 dates/algorithme PHP

Comparaison entre 2 dates/algorithme PHP - PHP - Programmation

Marsh Posté le 22-03-2010 à 20:55:50    

Bonjour ;)  
 
J'aimerai trouver le nombre d'année, mois, jours entre deux dates données...
 
Je voudrai ne pas passer par une sorte de timestamp, qui calcule le nombre de seconde depuis une date référence et de faire la différence entre les deux timestamp()
 
J'aimerai dans un premier temps comparer les deux dates en entré pour connaître la plus grande et faire en conséquence le calcul de la plus grande moins la plus petite puis de faire les comparaisons jours/mois/années.  
Qu'en pensez-vous ?  
 
En fait, ça me paraît un peu lourd et je me demande s'il n'y a pas un moyen plus simple qui ne me saute pas aux yeux :/
Je ne trouve pas d'algo là dessus sur Internet ou j'ai du mal chercher :/
 
 
mon code :  

Code :
  1. if (isset($_POST['submit']))
  2. {$date1 = array($_POST["annee1"],$_POST['mois1'],$_POST['jour1']);
  3. $date2 = array($_POST['annee2'],$_POST['mois2'],$_POST['jour2']);
  4. // Quelle est la date la plus grande ? Comparaison année/mois/jour
  5. if($date1[0] > $date2[0])
  6.   {$grand = $date1; $petit = $date2;}
  7. else if($date1[0] > $date2[0])
  8.   {$grand = $date2; $petit = $date1;}
  9. else if ($date1[0] == $date2[0])
  10.  {if($date1[1] > $date2[1])
  11.     {$grand = $date1; $petit = $date2;}
  12.   else if ($date1[1] < $date2[1])
  13.     {$grand = $date2; $petit = $date1;}
  14.       else if ($date1[1] == $date2[1])
  15.         {  if($date1[2] > $date2[2])
  16.    {$grand = $date1; $petit = $date2;}
  17.    else
  18.    {$grand = $date2; $petit = $date1;}
  19.          }
  20.      }
  21. // Différence des dates -------------------------------
  22. // jours
  23.   if($grand[2] >= $petit[2])
  24. {$dj = $grand[2] - $petit[2];}
  25.   else
  26. {$dj = (30-$petit[2]) + $grand[2];}
  27. // mois
  28.   if ($grand[1] >= $petit[1])
  29. {$dm = $grand[1] - $petit[1]-1;
  30.  if($grand[1] == $petit[1] || $grand[2]>$petit[2])
  31.      $dm=$dm+1;
  32.   if($grand[2]==$petit[2])
  33.       $dm=$dm+1;
  34. // années  
  35. $da = $date1[0] - $date2[0];


Hypothèse : les jours sont de 30 pour tous les mois
 
Ciao et thanks à qui m'aidera  :hello: :)


Message édité par ehben le 22-03-2010 à 21:42:38
Reply

Marsh Posté le 22-03-2010 à 20:55:50   

Reply

Marsh Posté le 22-03-2010 à 21:35:19    

si tu prends comme hypothèse que les mois ont 30 jours, autant passer avec des timestamps, ça ira plus vite et le résultat sera le meme  


---------------

Reply

Marsh Posté le 22-03-2010 à 21:44:04    

flo850 a écrit :

si tu prends comme hypothèse que les mois ont 30 jours, autant passer avec des timestamps, ça ira plus vite et le résultat sera le meme  


oué je sais... :/
 
En fait, j'essaie surtout de faire quelque chose au niveau algorithmique (en utilisant PHP) sans passer par des fonctions internes.
En plus je crois que le timestamp est limité dans le passé (pas avant 1970) et pas après une certaine date :/

Reply

Marsh Posté le 22-03-2010 à 21:49:45    

si tu veux le faire correctement :
- regarde le nombre d'année pleine entre tes deux dates
-  regarde le nombre de mois plein  
- enfin regarde le nombre de jours  
 
 
pour avoir le nombre d'année pleine, un truc comme ça devrait le faire :  
difference = 0;
si (année(petite) < annee(grande) -1)
     difference = annee(grande) -1 - annee(petite);
si (mois(petite) <= mois(grande)
     difference ++;
 
 
ensuite, meme approche pour les mois, les jours, les heures et les minutes


---------------

Reply

Marsh Posté le 22-03-2010 à 21:57:49    

:) thanks, je vais tester cela aussi

Reply

Marsh Posté le 23-03-2010 à 13:55:42    

ehben a écrit :

le passé (pas avant 1970) et pas après une certaine date :/


Bonjour,
 
Je pense que tu as tort de ne pas utiliser les fonctions native. Depuis php 5.2 la fourchette de dates utilisables est illimitée avec la classe DateTime.
 
Tu peux essayer le code ci-dessous avec :

  • date début : 1790-01-15
  • date fin : 2045-01-25


Il se peut qu'il reste des bugs, je n'ai pas tout testé.
 

Code :
  1. <?php
  2.   if (isset($_POST['submit']))
  3.   {
  4.     $debut = new DateTime($_POST["annee1"] . '-' . $_POST['mois1'] . '-' . $_POST['jour1']);
  5.     $fin = new DateTime($_POST['annee2'] . '-' . $_POST['mois2'] . '-' . $_POST['jour2']);
  6.     // Quelle est la date la plus grande ? Comparaison année/mois/jour
  7.     if ($fin -> format('Y-m-d') < $debut -> format('Y-m-d'))
  8.     {
  9.       $tmp = $debut;
  10.       $debut = $fin;
  11.       $fin = $tmp;
  12.     }
  13.     //-- calcul écart ----------------------------------------------------------
  14.     //-- nb années -------------------------------------------------------------
  15.     $nbAnnee = $fin -> format('Y') - $debut -> format('Y');
  16.     if($debut -> format('m-d') > $fin -> format('m-d'))
  17.       $nbAnnee --;
  18.     $debut -> modify('+' . $nbAnnee . ' year');
  19.     //-- nb mois ---------------------------------------------------------------
  20.     $nbMois = $debut -> format('m') - $fin -> format('m');
  21.     if($debut -> format('m') > $fin -> format('m'))
  22.     {
  23.       $nbMois = 12 - $nbMois;
  24.     }
  25.     else if($debut -> format('m') < $fin -> format('m'))
  26.     {
  27. //      $nbMois = $nbMois * -1;
  28.       $nbMois = abs($nbMois);
  29.     }
  30.     if($debut -> format('d') > $fin -> format('d'))
  31.     {
  32.       $nbMois --;
  33.     }
  34.     $debut -> modify('+' . $nbMois . ' month');
  35.     //-- nb jours --------------------------------------------------------------
  36.     if($debut -> format('d') < $fin -> format('d'))
  37.     {
  38.       $nbJour = $fin -> format('d') - $debut -> format('d');
  39.     }
  40.     else
  41.     {
  42.       $nbJour = ($debut -> format('t') - $debut -> format('d')) + $fin -> format('d');
  43.     }
  44.    
  45.     echo $nbAnnee . ' années<br />' . $nbMois . ' mois<br />' . $nbJour . ' jours';
  46.   }
  47. ?>
  48. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  49. <html xmlns="http://www.w3.org/1999/xhtml">
  50.   <head>
  51.     <title>test</title>
  52.     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
  53.     <script type="text/javascript">
  54.     </script>
  55.   </head>
  56.   <body>
  57.     <form name="date" method="post" action="">
  58.       <input type="text" name="annee1" />
  59.       <input type="text" name="mois1" />
  60.       <input type="text" name="jour1" /><br />
  61.       <input type="text" name="annee2" />
  62.       <input type="text" name="mois2" />
  63.       <input type="text" name="jour2" /><br />
  64.       <input type="submit" name="submit" value="valider" />
  65.     </form>
  66.   </body>
  67. </html>

Reply

Marsh Posté le 23-03-2010 à 14:10:45    

Question bête : pourquoi tu ne veux pas passer par les timestamp :??: Parce que là, t'as qu'à faire :

Code :
  1. $Date1 = mktime(0, 0, 0, $_POST['jour1'], $_POST['mois1'], $_POST["annee1"]);
  2. $Date2 = mktime(0, 0, 0, $_POST['jour2'], $_POST['mois2'], $_POST["annee2"]);
  3. $PetiteDate = min($Date1, $Date2);
  4. $GrandeDate = max($Date1, $Date2);


 
C'est quand même plus rapide que tout ton code et plus lisible :/


Message édité par rufo le 23-03-2010 à 14:10:58

---------------
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 23-03-2010 à 18:52:15    

si t'as PHP 5.3  regardes du coté de DateTime::diff()
http://php.net/manual/fr/datetime.diff.php

Reply

Marsh Posté le 23-03-2010 à 19:56:12    

thx pour toutes ces infos
 
Je ne voulais pas passer par des fonctions natives, juste pour m'entraîner un peu au niveau algorithmique... Evidemment, ça simplifie le tout et c'est beaucoup plus lisible que ce que j'ai fais en effet :jap:
 
@jeca : je regarde ça, thx ;)

Reply

Marsh Posté le 24-03-2010 à 00:06:21    

ah mince désolé ;)

Reply

Marsh Posté le 24-03-2010 à 00:06:21   

Reply

Marsh Posté le 25-03-2016 à 18:57:23    

Eh ben il est sympa, ton problème d'algo, ehben... ;-)  
 
J'ai le même problème en PHP4 (le serveur dicte sa loi): Donc pas de diff sur des objets de classe date (PHP > 5.3).  
 
Le code de rufo est sympa mais il y a une (grosse) erreur dans l'ordre des arguments de mktime():

Code :
  1. $Date1 = mktime(0, 0, 0, $_POST['jour1'], $_POST['mois1'], $_POST["annee1"]);


En fait c'est  

Code :
  1. $Date1 = mktime(0, 0, 0, $_POST['mois1'], $_POST['jour1'], $_POST["annee1"]);


car l'ordre des arguments est l'anglo-saxon mois-jour-année.  
 
mktime() retourne un nombre de secondes depuis le 1/1/1900, pour obtenir le nombre de jours il faut effectuer la division entière par 86400 (secondes par jour).
 

Code :
  1. //   function NbJours($an, $mois, $jour)
  2. //     renvoie le nombre de jours écoulés depuis le 1/1/1900  
  3. function NbJours($an, $mois, $jour)
  4. {   $Date1 = mktime(0, 0, 0, mois, $jour, $an);
  5.     return floor($Date1/86400);
  6. }   //   function NbJours($an, $mois, $jour)
  7. //   function DateDiff ($an1, $mois1, $jour1, $an2, $mois2, $jour2)
  8. //     renvoie le nombre de jours entre les deux dates  
  9. //     supprimez le abs si vous voulez aussi les comparer  
  10. function DateDiff ($an1, $mois1, $jour1, $an2, $mois2, $jour2)
  11. {   return abs (NbJours($an1, $mois1, $jour1)-NbJours($an2, $mois2, $jour2));
  12. }   //   function DateDiff ($an1, $mois1, $jour1, $an2, $mois2, $jour2)


 
 

Reply

Sujets relatifs:

Leave a Replay

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