Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
    Inscrit en
    mars 2002
    Messages
    34 907
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2002
    Messages : 34 907
    Points : 56 720
    Points
    56 720

    Par défaut Premier jour de la Semaine

    Suite à une demande sur le forum, voici un petit script qui permet de retourner le premier jour de chaque semaine en fonction du numéro de semaine et de l'année, parfois utile pour des réservations ...

    Attention ce script part de la norme de numérotation des semaines qui veut que la première semaine de l'année commence le premier lundi de l'année !


    [edit] Un membre de devloppez m'ayant fait parvenir cette info:
    ' Recommandations de l'Organisation Internationale de Standardisation
    ' Norme ISO 8601

    ' - Le lundi est considéré comme le premier jour de la semaine.
    ' - Les semaines d'une même année sont numérotées de 01 à 52
    ' (parfois 53).
    ' - La semaine qui porte le numéro 01 est celle qui contient le
    ' premier jeudi de janvier.
    ' - Il peut exister une semaine n°53 (années communes finissant
    ' un jeudi, bissextiles finissant un jeudi ou un vendredi).
    Je rectifie le code comme suit :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <script type="text/javascript">
     
    function FirstDayOfWeek(sem, an){
      var debut=new Date()
      debut.setUTCFullYear(an,0,1);
      var FirstDayOfYear= debut.getDay()
      var FirstBitLength=0
      if (FirstDayOfYear>4){
    	FirstBitLength=  8-FirstDayOfYear
    	}
     else {
      	FirstBitLength=  FirstDayOfYear-7
    	}
     
      adddays=(sem-1)*7+FirstBitLength+1
      finalDate=new Date()
      finalDate.setFullYear(an,0,adddays)
      finalDateEnd=new Date()
      finalDateEnd.setFullYear(an,0,adddays+6)
     
      return (sem==0 || sem>53)?"erreur":"debut de semaine :\t"+finalDate.toLocaleString()+"\nfin de semaine :\t" +finalDateEnd.toLocaleString();
      }
      alert(FirstDayOfWeek(7, 2009))
      </script>
    Ainsi le premier lundi de la semaine 01 de 2009 etait en fait le lundi 29 décembre 2008

    A noter qu'ici la fonction retourne un string mais on peut lui faire retourner une date
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag


    réalisations :www.oxygen-translations.com|www.saftair.com| www.ouestisol.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
    Humour

  2. #2
    Membre à l'essai
    Inscrit en
    juin 2007
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : juin 2007
    Messages : 55
    Points : 20
    Points
    20

    Par défaut

    Bonjour!

    Tout d'abord, merci pour le script, mais j'ai un petit soucis avec!

    Ainsi le premier lundi de la semaine 01 de 2009 etait en fait le lundi 29 décembre 2008
    C'est en effet ce que je retrouve avec votre script.
    En 2010 et 2011, pour la semaine 01, je retrouve les bons résultats.

    Par contre, en 2012, il y a un problème. Même deux qui sont liés. Le jour indiqué n'est pas un lundi (mais un dimanche), et donc pas le premier jour de la semaine.

    D'ailleurs, pour les dates de la première semaine des années suivantes, on retrouve le même problème.

    La date affiché par le script : 2011-12-25
    La date que cela devrait être: 2012-01-02

    Avez vous une idée?

    Merci!

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
    Inscrit en
    mars 2002
    Messages
    34 907
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2002
    Messages : 34 907
    Points : 56 720
    Points
    56 720

    Par défaut

    Bigre !
    Il semble en effet que ce script ne gère pas correctement la première semaine non complète de l'année.
    Ce coup ci je traite cette longueur de semaine de façon plus exhausive
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <script type="text/javascript">
     
    function FirstDayOfWeek(sem, an){
      var debut=new Date()
      debut.setUTCFullYear(an,0,1);
      var FirstDayOfYear= debut.getDay()
      var FirstBitLength=0
      switch(FirstDayOfYear){
         case 0: FirstBitLength=FirstDayOfYear+2;
         			break;
         case 1: FirstBitLength=FirstDayOfYear;
         			break;
         case 2: FirstBitLength=FirstDayOfYear+5;
         			break;
         case 3: FirstBitLength=FirstDayOfYear+3;
         			break;
         case 4: FirstBitLength=FirstDayOfYear+1;
         			break;
         case 5: FirstBitLength=FirstDayOfYear-1;
         			break;
         case 6: FirstBitLength=FirstDayOfYear-3;
         			break;
    }			
     
      adddays=(sem-1)*7+FirstBitLength
      finalDate=new Date()
      finalDate.setUTCFullYear(an,0,adddays)
      finalDateEnd=new Date()
      finalDateEnd.setUTCFullYear(an,0,adddays+6)
     
      return (sem==0 || sem>53)?"erreur":an+" <br/>debut de semaine : "+finalDate.toLocaleString()+"<br/>fin de semaine : " +finalDateEnd.toLocaleString();
      }
     
      function init(){
      liste=""
      for(i=0;i<101;i++){
      liste+=FirstDayOfWeek(1, 2010+i)+"<br/><br/>"
      }
    	document.getElementById('res').innerHTML=liste
    	}
       </script></head>
     
    <body onload="init()">
    <div id="res"></div>
    </body>
     
    </html>
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag


    réalisations :www.oxygen-translations.com|www.saftair.com| www.ouestisol.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
    Humour

  4. #4
    Membre à l'essai
    Inscrit en
    juin 2007
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : juin 2007
    Messages : 55
    Points : 20
    Points
    20

    Par défaut

    C'est super!

    J'ai testé plusieurs années, cela semble désormais fonctionner.

    Merci en tout cas pour l'aide!

  5. #5
    Membre à l'essai
    Inscrit en
    juin 2007
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : juin 2007
    Messages : 55
    Points : 20
    Points
    20

    Par défaut

    Bonjour!

    J'ai encore un soucis avec le script. Il marche parfaitement en ce qui concerne les dates (tout correspond au véritable calendrier), par contre, sur certaines années, la première semaine est décalé (s2 au lieu de s1).

    Par exemple, on a pour 1991, pour la semaine 1 (s1):
    Lundi 1991-01-07 Mardi 1991-01-08 Mercredi 1991-01-09 Jeudi 1991-01-10 Vendredi 1991-01-11 Samedi 1991-01-12 Dimanche 1991-01-13
    Pour 2013
    Lundi 2013-01-07 Mardi 2013-01-08 Mercredi 2013-01-09 Jeudi 2013-01-10 Vendredi 2013-01-11 Samedi 2013-01-12 Dimanche 2013-01-13
    Lundi 2014-01-06 Mardi 2014-01-07 Mercredi 2014-01-08 Jeudi 2014-01-09 Vendredi 2014-01-10 Samedi 2014-01-11 Dimanche 2014-01-12
    Alors que pour 2012 c'est correct
    Lundi 2012-01-02 Mardi 2012-01-03 Mercredi 2012-01-04 Jeudi 2012-01-05 Vendredi 2012-01-06 Samedi 2012-01-07 Dimanche 2012-01-08
    Une solution?

    Merci!

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
    Inscrit en
    mars 2002
    Messages
    34 907
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2002
    Messages : 34 907
    Points : 56 720
    Points
    56 720

    Par défaut

    vérifie ce qu'est une semaine ISO ...
    la première semaine de l'année est la première semaine complète

    Par exemple, on a pour 1991, pour la semaine 1 (s1):
    Lundi 1991-01-07

    => le premier janvier est un mardi ! la semaine n'est pas complète

    il serait inquiétant de voir un lundi 8 janvier par contre ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag


    réalisations :www.oxygen-translations.com|www.saftair.com| www.ouestisol.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
    Humour

  7. #7
    Membre à l'essai
    Inscrit en
    juin 2007
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : juin 2007
    Messages : 55
    Points : 20
    Points
    20

    Par défaut

    D'après wikipédia (j'espère que c'est fiable)

    ISO 8601 :Cette norme ISO a défini de façon stricte une règle de numérotation, reconnue internationalement et couramment utilisée :
    -la semaine commence le lundi ;
    -les jours de chaque semaine sont numérotés de 1 (un) pour le lundi, à 7 (sept) pour le dimanche ;
    -la semaine 1 est celle qui contient le premier jeudi de l'année.
    C'est ce dernier point qui m'interpelle:

    Le 1er jeudi de Janvier 2013 tombe le 3. Donc la semaine numero 1 devrait être du 31 décembre 2012 au 6 janvier 2013 (englobant le jeudi donc), et pas du lundi 7 janvier au dimanche 13 janvier non?

    Ou alors je pige pas un truc




    Il y a aussi:

    La semaine 1 est la première à contenir la majorité de ses jours (au moins 4 jours) dans l'année. Elle contient systématiquement le 4 janvier.
    Voir

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
    Inscrit en
    mars 2002
    Messages
    34 907
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2002
    Messages : 34 907
    Points : 56 720
    Points
    56 720

    Par défaut

    il suffit alors de changer le swicth de sorte à intégrer cette contrainte de 4 jours ...
    là tu modifies les + en conséquence
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    switch(FirstDayOfYear){
         case 0: FirstBitLength=FirstDayOfYear+2;
         			break;
         case 1: FirstBitLength=FirstDayOfYear;
         			break;
         case 2: FirstBitLength=FirstDayOfYear+5;
         			break;
         case 3: FirstBitLength=FirstDayOfYear+3;
         			break;
         case 4: FirstBitLength=FirstDayOfYear+1;
         			break;
         case 5: FirstBitLength=FirstDayOfYear-1;
         			break;
         case 6: FirstBitLength=FirstDayOfYear-3;
         			break;
    }
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag


    réalisations :www.oxygen-translations.com|www.saftair.com| www.ouestisol.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
    Humour

  9. #9
    Membre à l'essai
    Inscrit en
    juin 2007
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : juin 2007
    Messages : 55
    Points : 20
    Points
    20

    Par défaut

    Ok, je te remercie pour ton aide.

    Voici le switch modifié:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    	switch (FirstDayOfYear)
    	{
    	case 0:
    		FirstBitLength = FirstDayOfYear+2;
    		break;
    	case 1:
    		FirstBitLength = FirstDayOfYear;
    		break;
    	case 2:
    		FirstBitLength = FirstDayOfYear-2;
    		break;
    	case 3:
    		FirstBitLength = FirstDayOfYear -4;
    		break;
    	case 4:
    		FirstBitLength = FirstDayOfYear -6;
    		break;
    	case 5:
    		FirstBitLength = FirstDayOfYear -1;
    		break;
    	case 6:
    		FirstBitLength = FirstDayOfYear -3;
    		break;
    	default:
    		break;
    	}

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •