IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Obtenir le numéro du jour du lundi de la première semaine


Sujet :

JavaScript

  1. #1
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut Obtenir le numéro du jour du lundi de la première semaine
    Bonjour à tous,

    je lutte avec les dates en JS sur un bug d'affichage au basculement de la prochaine année 2022 dans une application web.
    Je m'explique, en dur dans le code j'ai cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var dstart = (4 + (Week - 1) * 7); // 2021 4 janvier = lundi de la semaine 1
    var dend = (8 + (Week - 1) * 7); // 2021 8 janvier = vendredi de la semaine 1
    le 4 et 8 correspondent au premier lundi et vendredi de la semaine 1 de 2021.
    Hors en 2022, les premiers lundi et vendredi de la semaine 2 seront 3 et 7.
    il faut donc que j'arrive à trouver automatiquement le numéro du jour du premier lundi de la première semaine de l'année.

    Quelqu'un aurait il une idée... ?


    Merci par avance,

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    il te suffit de créer une date au 1/01/2022 et de lire de quel jour de la semaine il s'agit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const d = new Date(2022, 0, 1); // les mois commence à 0
    const numDay = d.getDay();
    console.log(numDay);
    // > 6, c'est donc un samedi,  0 correspondant au dimanche
    après c'est juste du comptage !

  3. #3
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    Voici une idée :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let annee = "2022", jour = 2, date = new Date(annee)
     
    while (date.getDay() != 1) {
        date.setDate(jour++)
    }
    console.log("La date du premier lundi de l'année " + annee + " est:", jour - 1)

    Là c'est pour l'année 2022 (let annee = "2022") mais tu peux changer...

    On peut aussi en faire une fonction (premier_lundi) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function premier_lundi(annee) {
        let date = new Date(annee), jour = 2
        while (date.getDay() != 1) {
            date.setDate(jour++)
        }
        return jour -1
    }
     
    // test :
    annee = "2022"
    console.log("2--La date du premier lundi de l'année " + annee + " est:", premier_lundi(annee))

  4. #4
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    après c'est juste du comptage !
    Je me suis demandé comment faire ce comptage d'une manière concise et rapide et le mieux que j'ai trouvé c'est d'utiliser un tableau ( let date_premier_lundi = [2, 1, 7, 6, 5, 4, 3]) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function premier_lundi(annee) {
        let date_premier_lundi = [2, 1, 7, 6, 5, 4, 3]
        return date_premier_lundi[(new Date(annee, 0, 1)).getDay()]
    }
     
     
    // tests de l'année 2000 à 2033...
    for (let annee = 2000; annee < 2033; annee++) {
        console.log("La date du premier lundi de l'année " + annee + " est:", premier_lundi(annee))
    }
    Je crois bien qu'avec cette idée de NoSmoking on obtient quelque chose de plus rapide* et c'est même plus concis...

    * L'autre code doit être plus lent notamment à cause des appels multiples aux fonctions setDate et getDay...
    Et je pense aussi que l'usage du tableau doit être plus rapide que la boucle while...

    A confirmer...

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Et je pense aussi que l'usage du tableau doit être plus rapide que la boucle while...
    Pas sûr qu'il faille vraiment se soucier de la vitesse sur un si petit nombre de rotations.

    Ceci étant je voyais une approche plus générique, mais il doit bien y en avoir encore d'autres, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function get_1st_jour(searchDay, annee, mois = 0) {
      const numDay = new Date(annee, mois, 1).getDay();
      return ((7 - numDay + searchDay) % 7) + 1;
    }
    // test
    const result = [];
    for (let annee = 2000; annee < 2033; annee += 1) {
      result.push(annee + " :" + get_1st_jour(1, annee));
    }
    console.log(result);
    avec :
    7
    : nbr jours de la semaine
    numDay
    : l'indice du 1st day du mois
    searchDay
    : le jour recherché, 0 dimanche, 1 lundi etc
    % 7
    : évite les débordements, par exemple si le 1st day est un dimanche et que l'on cherche le 1st samedi
    + 1
    : les mois commencent le 1er

  6. #6
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Merci, c'est exactement ce qu'il me fallait !

  7. #7
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    Ceci étant je voyais une approche plus générique, mais il doit bien y en avoir encore d'autres, à savoir :
    Ah oui c'est bien vu la formule que tu as utilisée ! Et c'est plus générique comme tu dis...

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Ah oui c'est bien vu la formule que tu as utilisée ...
    et que tu as utilisée également « inconsciemment », si tu fais tourner cette « formule » dans une boucle tu obtiendras pour le lundi le tableau que tu as utilisé

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const res = {};
    const days = "dimanche lundi mardi mercredi jeudi vendredi samedi".split(" ");
    const nbDays = days.length;
    for (let searchDay = 0; searchDay < nbDays; searchDay += 1) {
      res[days[searchDay]] = [];
      for (let numDay = 0; numDay < nbDays; numDay += 1) {
        res[days[searchDay]].push((((7 - numDay + searchDay) % 7) + 1));
      }
    }
    console.log(res);
    donnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
      "dimanche": [ 1, 7, 6, 5, 4, 3, 2 ],
      "lundi":    [ 2, 1, 7, 6, 5, 4, 3 ],         // <= ton tableau est ICI
      "mardi":    [ 3, 2, 1, 7, 6, 5, 4 ],
      "mercredi": [ 4, 3, 2, 1, 7, 6, 5 ],
      "jeudi":    [ 5, 4, 3, 2, 1, 7, 6 ],
      "vendredi": [ 6, 5, 4, 3, 2, 1, 7 ],
      "samedi":   [ 7, 6, 5, 4, 3, 2, 1 ]
    }

  9. #9
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Oui effectivement on retrouve le tableau mais trouver ce tableau me semble plus facile que de trouver la formule qui fonctionne en plus pour tous les jours de la semaine.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Obtenir numéro de jours suivant le numéro de semaine et l'année
    Par sebfch dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 29/04/2016, 14h07
  2. [VB.NET] Obtenir le numéro de la semaine d'une date
    Par alain&&thomas dans le forum Windows Forms
    Réponses: 9
    Dernier message: 07/09/2009, 17h54
  3. Réponses: 2
    Dernier message: 20/01/2007, 20h42
  4. Réponses: 6
    Dernier message: 25/09/2006, 14h51
  5. [TMemo] Obtenir le numéro de la ligne
    Par JFM dans le forum Composants VCL
    Réponses: 3
    Dernier message: 03/08/2005, 20h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo