Pb avec une fonction [Résolu]

Signaler
Messages postés
63
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
26 juillet 2011
-
Messages postés
63
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
26 juillet 2011
-
Bonjour à tous,
j'ai essayé de trouver une fonction javascript pour calculer la date du dernier dimanche d'un mois donné. j'ai bien trouvé quelque chose mais je n'arrive pas à m'en servir. Est ce que vous pourriez m'indiquer ce qui cloche.
D'avance merci

<script language="javascript">
function dDimanche(year,month) {
        var dimanche;
  var dateTest;
        for( var i=nbjourmois(year,month); i > 0; i-- ){
         dateTest = new Date(year, month, i);
         if( dateTest.getDay() == 0 ) {
    dimanche = dateTest;
          break;
   }
        }
  return dimanche;
}


function nbjourmois(year,month){
     var jourmois = [31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
     var nbjour;
     nbjour = jourmois[month];
     if( nbjour == -1 )  {
         if( year % 4 == 0 && year % 100 != 0 ) {
          nbjour = 29;
         }
   else {
                nbjour = 28;
            }
  return nbjour;
  document.write(nbjour);
}  


dDimanche(dateNow.getYear(),2);
document.write(dimanche);
</script>

25 réponses

Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
appel :     var toto=nom( valeur_1, valeur_2... )

valeur_1, valeur_2 ce sont les paramètres que l'on "passe" à la fonction
var toto=    fera que ce que renvoie cette fonction ira dans toto

mais on peut faire "bien sûr"  :   if ( nom( valeur_1, valeur_2... ) ...  ) ....  ou autre
       on fait directement un test sur ce que retourne la fonction

fonction nom( paramètre_1, paramètre_2, ... )

{   on traite paramètre_1, paramètre_2....  
                        ( qui seront ici, égal à valeur_1, valeur_2... de l'appel )

    return "résultat de la fonction"; 
                       ( donc toto sera = à "résultat de la fonction"
                         derrière l'appel )

}

c'est "quasi" la même choses avec tous les langages

remarque, la boucle pour trouver le dernier dimanche est probablement inutile   on peut obtenir le n° de jour dans la semaine ( de 0 dimanche à 6 samedi )
   dernier jour du mois - le n° de jour dans la semaine de ce dernier jour = dernier dimanche

regarde chez selfHTML pour ce qui concerne Date

          Bul [mon Site] [M'écrire]         
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
bonjour,

sans tenir compte des résultats (!) :

dDimanche(dateNow.getYear(),2);
c'est quoi dateNow ?
document.write(dimanche);
c'est quoi dimanche ? il y a bien une variable dimanche
définie. dans la fonction dDimanche, donc locale à cette fonction
compte le nombre de { et de } dans la fonction nbjourmois

return nbjour;
document.write(nbjour); ne sera jamais exécuté

attention à document.write, s'il est utilisé lorsque la page
a été totalement interprétée ( cas d'une function appelée sur
un évênement par exemple ), ça efface toute la page, y compris
le javascript

après...( s'il n'y a pas d'autres erreurs de syntaxe déjà )
reste à contrôler les résultats !

@+
Messages postés
63
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
26 juillet 2011

Merci de te pencher sur mon probleme (enfin c'est surtout moi le probleme ;)   )
apres correction des erreurs que tu as soulevées, je n'ai toujours rien du tout en retour.
il y a quelque chose que je pense ne pas saisir, c'est l'utilisation de "return"

function dDimanche(year,month) {
        var dateTest;
        for( var i=nbjourmois(year,month); i > 0; i-- ){
            dateTest = new Date(year, month, i);
            if( dateTest.getDay() == 0 ) {
                   dimanche = dateTest;
                   break;
            }
        }
  return dimanche;
}


function nbjourmois(year,month){
           var jourmois = [31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
           var nbjour;
           nbjour = jourmois[month];
           if( nbjour == -1 )  {
                  if( year % 4 == 0 && year % 100 != 0 ) {
                            nbjour = 29;
                  }
                  else {
                              nbjour = 28;
                  }
             return nbjour;
             }
}  

djour=new Date();
dDimanche(djour.getYear(),2);
alert(dimanche);
Messages postés
3472
Date d'inscription
lundi 16 juillet 2007
Statut
Membre
Dernière intervention
28 février 2014
33
Salut,

Moi ce que je n'arrive pas a comprendre ni a voir, c'est est déclaré la variable dimanche, parce qu'on dirai que tu l'utilise sans la déclarer avec le mot clée "var" !

a++

Si la réponse vous convient, pensez : Réponse acceptée !
Messages postés
63
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
26 juillet 2011

d'accord, donc je declare


var dimanche


en dehors des fonctions.
Dans la fonction dDimanche elle est censée prendre la valeur de dateTest, et avec "return dimanche" je voulais recuperer le resultat mais j'ai un joli undifined qui apparait.


 
Messages postés
3472
Date d'inscription
lundi 16 juillet 2007
Statut
Membre
Dernière intervention
28 février 2014
33
alors la, je ne sais pas d'ou ça vient, désolé.

a++

Si la réponse vous convient, pensez : Réponse acceptée !
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
quand on met au point il faut faire du "débugging"
<!-- pour validation w3c ok ;o)) -->----
Chrome
, contrôler page actuelle / Options pour développeurs
/ Console Javascript, ----
FireFox
, Outils / Console d'erreurs
et mieux : télécharger mon Site][M'écrire]
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
il fallait lire :
var i=nbjourmois(year,month);
alert(i);
          Bul [mon Site] [M'écrire]         
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
tu as trouvé ?

sinon... est-ce qu'à tous les coups, ta fonction
          nbjourmois retourne ce qu'il faut quand il faut et toujours ?
( toujours sans préjuger du reste )

          Bul [mon Site] [M'écrire]         
Messages postés
3426
Date d'inscription
lundi 26 décembre 2005
Statut
Membre
Dernière intervention
14 janvier 2011
14
Bonjour,
en accord avec ce qui précéde je
rajouterais que...
<table bgcolor= "#e6effe" border="0" cellpadding="5" cellspacing="0" width="100%">----, sinon... est-ce qu'à tous les coups, ta
fonction
          nbjourmois retourne ce qu'il faut quand il faut et
toujours
?</td>
</td></tr></tbody></table>
Dans ta
fonction nbjourmois regarde
à quel niveau tu as placé ton return

Si je ne m'abuse il est dans la condition
if( nbjour == -1 )

en d'autres termes tu
auras un résultat différent de undefined SI et
SEULEMENT SI tu demandes le nombre de jours du mois de février et qui plus est
d'une année non bisextile UNIQUEMENT

Un code bien indenté permet souvent
de voir la coquille, cela se joue à un q prés...
;O)
Messages postés
63
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
26 juillet 2011

Bonjour,
bon j'ai fini par reussir a la faire tourner, mais bcp de chose m'echappe encore.
cette fonction vous aurez bien compris que ce n'est pas moi qui l'ai ecrite aussi il y a des choses que je ne comprends pas. la voila en entier qui fonctionne :

<script language="javascript">
function inDST(dateNow) {
        var dmar;
        var doct;
        var dateTest;
       
        dmar = dDimanche(dateNow.getYear(), 2);
        doct = dDimanche(dateNow.getYear(), 9);
      
  djour=new Date()
  
     dureemar=Date.parse(dmar)
  dureeoct=Date.parse(doct)
  dureejour=Date.parse(djour)


  compmar = dureejour - dureemar
  compoct = dureejour - dureeoct


  if ((compmar>0) && (compoct<0 ))
   {
   alert("été");
        }
  else
  { 
   alert("hiver");
  }
}
function dDimanche(year,month) {
        var dimanche;
        var dateTest;
        for( var i=nbjourmois(year,month); i > 0; i-- ) {
                dateTest = new Date(year, month, i);
                if( dateTest.getDay() == 0 ) {
                        dimanche = dateTest;
                        break;
                }
        }
        return dimanche;
}
function nbjourmois(year,month) {
        var jourmois = [31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
        var nbjour;
        nbjour = jourmois[month];
        if( nbjour == -1 ) {
                if( year % 4 == 0 && year % 100 != 0 ) {
                        nbjour = 29;
                } else {
                        nbjour = 28;
                }
        }
        return nbjour;
}
inDST(new Date());
</script>

je pige pas a quel niveau la fonction nbjourmois(year,month) recupere les parametres.
Messages postés
3426
Date d'inscription
lundi 26 décembre 2005
Statut
Membre
Dernière intervention
14 janvier 2011
14
Bonjour,
tout ce passe dans cette fonction

function dDimanche( year, month) {

  var dimanche;
  var dateTest;
  //-- boucle
du dernier jour du mois au premier, en ordre decroissant
  for(
var i = nbjourmois ( year, month); i >
0; i-- ) {
    //-- Init date pour recuperation de
l'indice du jour
    dateTest = new Date( year, month, i);

    //-- Recup indice du jour si o alors dimanche

    if( dateTest.getDay() == 0 ) {
      dimanche = dateTest;

      //-- mets fin a la boucle

      break;
    }
  }
  return dimanche;

}

;O)
Messages postés
63
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
26 juillet 2011

Et bien merci pour votre aide et vos explications

A propos du dernier jour, si j'ai bien compris, ta methode ne peut fonctionner que pour le dimanche (0) puisqu'il debute la semaine. dans tous les autres cas il est necessaire de faire cette boucle puisque la fin de la semaine peut etre au dela du dernier jour du mois. c'est bien ca ?
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
>>ta methode ne peut fonctionner que pour le dimanche (0)

ben non !
exemple :
dernier jour du mois d'octobre 2008  : vendredi, soit le 5ème jour de la semaine
31/10/2008 - 5 = 26/10/2008  le dernier dimanche quoi

          Bul [mon Site] [M'écrire]          
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
exemple pour ce mois-ci ?
30/11/2008, le jour 0 de la semaine
30/11/2008 - 0 ===> dernier dimanche = 30/11/2008

          Bul [mon Site] [M'écrire]         
Messages postés
63
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
26 juillet 2011

ahhhhhh j'avais pas vu le "moins" !!! effectivement tres simple et efficace.
merci
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
nickel si tout baigne.

la gestion des dates est top (?) en js, y'a tout (?) ce qu'il faut
tous les langages ne permettent pas de faire
        date + ou - une valeur = nouvelle date
        faut  parfois se le "faire à la main", et là, une boucle
                ferait probablement l'affaire.

          Bul [mon Site] [M'écrire]         
Messages postés
63
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
26 juillet 2011

Merci beaucoup, avec ta méthode j'arrive à ça, qui fonctionne parfaitement, avec en plus la satisfaction de l'avoir fait moi meme... Ca doit surement pouvoir se simplifier avec d'autres choses que j'ignore....

<script language="javascript">
var jour=new Date();
var annee=jour.getFullYear();
var dmar=new Date(annee,2,31) ;
var doct=new Date(annee,9,31) ;


var mar;
var dnmar=dmar.getDay();


if (dnmar==0) {
 mar=dmar;
}
else {
 var nmar=31-dnmar;
 mar=new Date(annee,2,nmar);
}




var oct;
var dnoct=doct.getDay();


if (dnoct==0) {
 oct=doct;
}
else {
 var noct=31-dnoct;
 oct=new Date(annee,9,noct);
}
if (jour.getTime()-mar.getTime()>0 && jour.getTime()-oct.getTime()<0)  {
 alert("été");
}
else {
 alert("hiver");
}




</script>
Messages postés
63
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
26 juillet 2011

Et voila, j'ai reussi a en faire une fonction.

<script type="text/javascript">
jour=new Date();
oct=dDimanche(jour.getFullYear(),9,31);
mar=dDimanche(jour.getFullYear(),2,31);


function dDimanche(year,month,day) {
 var dateTest=new Date(year,month,day);
 var nbj = dateTest.getDay();
 
 if (nbj==0) {
  result=dateTest;
  return result;
 }
 else {
  njour=31-nbj;
  result=new Date(jour.getFullYear(),month,njour);
  return result;
 }
}


if (jour.getTime()-mar.getTime()>0 && jour.getTime()-oct.getTime()<0)  {
 alert("été");
}
else {
 alert("hiver");
}
</script>

Merci encore pour ton aide
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
le ch'tiot 31  :  dans  njour=31-nbj;
pas toujours 31 jours le mois...
      si tu réutilisais la fonction pour autre chose que l'heure d'été/hiver !
      pour ici effectivement c'est ok.

je n'aurais pas testé le cas nbjour=0
  puisque valeur-0=valeur, alors...

mais bon...  chacun fait comme il le sent là
                et je ne sais pas si ce serait plus mieux...

manque quelques var  devant les variables.

          Bul [mon Site] [M'écrire]