Problème d'algo pour le jour suivant d'une date

Problème d'algo pour le jour suivant d'une date - PHP - Programmation

Marsh Posté le 13-01-2015 à 15:26:29    

Bonjour,  
Je bloque sur un exercice de programmation en PHP, vous trouverez l'énoncé en dessous
 
1.5. Écrire un algorithme fournissant à partir d'une date donnée sous la forme de 3 entiers ($jour, $mois,
$année) la date du lendemain.
 
J'ai réussi à gérer le passage d'un mois à l'autre au 31 de chaque mois avec le retour au premier du mois mais je ne parviens pas à passer d'une année à l'autre. Au lieu de passer de 31/12/xxxx à 01/01/xxxx+1 mon algo me sort 01/13/xxxx
 
Voilà ce que j'ai programmé :  
 
 
 
 //1.5
  $a=2014;
  $m=12;
  $j=31;  
 
  //Controle validité J M
  if ($j>31) {
   echo "il y à une erreur dans le jour";
  }
  if ($m>12) {  
   echo "il y à une erreur dans le mois";
  }
 
 
 //Si dernier jour du mois
  if ($j<31) {
   $j=$j+1;}
   else {
    if ($j==31) {
       $j=1;
       $m=$m+1;}
       if ($m==12) {
        $m==1;
        $a==$a+1;}
         
    echo "demain nous seront le $j $m $a";}
 
 
 
 
Ca fais quelque heures que je bloque dessus je ne réussis pas à m'en sortir. Pouvez vous me donner un petit coup de main ?  
 
Merci d'avance !

Reply

Marsh Posté le 13-01-2015 à 15:26:29   

Reply

Marsh Posté le 13-01-2015 à 15:36:32    

Et comment tu comptes gérer le changement d'année ? et le passage du 28 février au 29 tous les 4 ans ?
 
Tu peux fixer ton problème de manière fiable en 3 lignes:
 
Transforme ses 3 éléments ($a $m $j) en un objet DateTime.
Ajoute une intervalle d'une journée à ton objet DateTime créé au dessus.
Affiche ton dateTime sous le format de ton choix...
 
Et un peu de lecture, histoire que tu bosses un peu quand même :
http://php.net/manual/fr/class.datetime.php
http://php.net/manual/fr/class.dateinterval.php


Message édité par scull le 13-01-2015 à 15:40:26

---------------
Créer son forum gratuit |  Mon beau blog phpBB caÿ le mal :o
Reply

Marsh Posté le 13-01-2015 à 15:39:37    

Salut,
 
Premièrement je te conseille de te munir d'un calendrier afin d'en étudier son fonctionnement car "au 31 de chaque mois" ne correspond pas vraiment à notre calendrier.
 
Deuxièmement ton problème est causé par le fait que tu fais une vérification après le changement de mois, cela peut se faire, seulement il faut te rappeler que dans ce cas là il faut corriger la valeur et donc qu'elle est fausse. Or tu supposes une valeur de 12 mois pour changer d'année, valeur qui n'est pas erronée puisqu'il y a bien 12 mois dans une année.

Reply

Marsh Posté le 13-01-2015 à 15:41:57    

Merci beaucoup pour ta réponse !
Je sais que je peux le faire à l'aide de cette fonction merci beaucoup :) Mais on me demande d'écrire moi même l'algo permettant cela et de le calculer manuellement sans utiliser les fonction propres à PHP :pfff: ..  
Je sais que ce serais plus simple autrement mais la consigne étant là je peux pas faire autrement :(

Reply

Marsh Posté le 13-01-2015 à 15:59:08    

Si tu bloques toujours, il te suffit de simuler toi-même ton algorithme, à chaque ligne tu écris les valeurs de tes variables et tu regardes ce que ça donne. Tu trouveras vite le problème.

Reply

Marsh Posté le 14-01-2015 à 17:23:10    

Petit conseil : tu peux définir un tableau qui contient pour chaque n° de mois, le nb de jours max.
Ex : $NBJ = array(1 => 31, 2 => 28, 3 => 31, 4 => 30...);
Ainsi, pour avoir le nb de jours d'un mois : $NBJ[$mois]
Avec le cas particulier de février à gérer. Une année est bissextile si elle est :
* divisible par 4 mais non divisible par 100.
* divisible par 400.
Si ton année répond à l'un de ces 2 critères, le mois à 29 jours.
 
Après, y'a plus que le cas du 31/12 à gérer pour le changement d'année.


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

Sujets relatifs:

Leave a Replay

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