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

  FORUM HardWare.fr
  Programmation
  PHP

  Comparaison entre 2 dates/algorithme PHP

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comparaison entre 2 dates/algorithme PHP

n°1976115
ehben
Posté le 22-03-2010 à 20:55:50  profilanswer
 

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
mood
Publicité
Posté le 22-03-2010 à 20:55:50  profilanswer
 

n°1976127
flo850
moi je
Posté le 22-03-2010 à 21:35:19  profilanswer
 

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  


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

n°1976134
ehben
Posté le 22-03-2010 à 21:44:04  profilanswer
 

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 :/

n°1976135
flo850
moi je
Posté le 22-03-2010 à 21:49:45  profilanswer
 

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


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

n°1976139
ehben
Posté le 22-03-2010 à 21:57:49  profilanswer
 

:) thanks, je vais tester cela aussi

n°1976281
jeca
Posté le 23-03-2010 à 13:55:42  profilanswer
 

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>

n°1976293
rufo
Pas me confondre avec Lycos!
Posté le 23-03-2010 à 14:10:45  profilanswer
 

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 Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°1976490
stealth35
Posté le 23-03-2010 à 18:52:15  profilanswer
 

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

n°1976506
ehben
Posté le 23-03-2010 à 19:56:12  profilanswer
 

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 ;)

n°1976577
stealth35
Posté le 24-03-2010 à 00:06:21  profilanswer
 

ah mince désolé ;)

mood
Publicité
Posté le 24-03-2010 à 00:06:21  profilanswer
 

n°2278438
plefebvre
Posté le 25-03-2016 à 18:57:23  profilanswer
 

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)


 
 


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

  Comparaison entre 2 dates/algorithme PHP

 

Sujets relatifs
Menu /PHP Lien avec MySQL[PHP] Cookies : une partie disparait inexplicablement -> Plante Apache
[PHP] pour ne pas que 0111 == 111[PHP] Faut-il eviter de "boucler" si possible ?
comparaison de tableSystème de cache PHP et charge CPU
Probleme Log PHP optimisé avec EACCELERATOR[PHP/JS] Séparer un mp3 sans plomber le serveur ?
PHP et IMAP et emailsRecherche de volontaires (WebDesigners, Développeurs PHP,etc...)
Plus de sujets relatifs à : Comparaison entre 2 dates/algorithme PHP


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR