Pb avec une fonction

Résolu
isu_san Messages postés 63 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 26 juillet 2011 - 5 nov. 2008 à 10:09
isu_san Messages postés 63 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 26 juillet 2011 - 6 nov. 2008 à 17:53
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

cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
6 nov. 2008 à 11:50
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]         
3
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
5 nov. 2008 à 10:36
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 !

@+
0
isu_san Messages postés 63 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 26 juillet 2011
5 nov. 2008 à 12:04
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);
0
nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 36
5 nov. 2008 à 12:07
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
isu_san Messages postés 63 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 26 juillet 2011
5 nov. 2008 à 12:18
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.


 
0
nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 36
5 nov. 2008 à 12:32
alors la, je ne sais pas d'ou ça vient, désolé.

a++

Si la réponse vous convient, pensez : Réponse acceptée !
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
5 nov. 2008 à 12:41
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]
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
5 nov. 2008 à 12:43
il fallait lire :
var i=nbjourmois(year,month);
alert(i);
          Bul [mon Site] [M'écrire]         
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
5 nov. 2008 à 16: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]         
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
5 nov. 2008 à 17:26
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)
0
isu_san Messages postés 63 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 26 juillet 2011
6 nov. 2008 à 11:27
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.
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
6 nov. 2008 à 12:00
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)
0
isu_san Messages postés 63 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 26 juillet 2011
6 nov. 2008 à 12:22
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 ?
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
6 nov. 2008 à 12:43
>>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]          
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
6 nov. 2008 à 12:45
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]         
0
isu_san Messages postés 63 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 26 juillet 2011
6 nov. 2008 à 12:49
ahhhhhh j'avais pas vu le "moins" !!! effectivement tres simple et efficace.
merci
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
6 nov. 2008 à 12:58
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]         
0
isu_san Messages postés 63 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 26 juillet 2011
6 nov. 2008 à 14:04
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>
0
isu_san Messages postés 63 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 26 juillet 2011
6 nov. 2008 à 14:40
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
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
6 nov. 2008 à 14:57
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]        
0
Rejoignez-nous