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 :

Calcul sur dates (Optimisation)


Sujet :

JavaScript

  1. #1
    Membre habitué Avatar de Goltar
    Homme Profil pro
    Eternel Etudiant Curieux
    Inscrit en
    Mars 2011
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Eternel Etudiant Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2011
    Messages : 216
    Points : 137
    Points
    137
    Par défaut Calcul sur dates (Optimisation)
    Bonjour à tous,
    Je soumet à votre sagacité la question suivante:
    J'ai une dropdown permettant de sélectionner une durée pour la génération de rapports.
    Les valeurs de sélection sont: Tout, 7 jours, 14 jours, 1 mois, 2 mois, 3mois.
    suivant la sélection j'obtient une date de départ du rapport et la date de fin (date du jour) me permettant de construire mon rapport.
    Mon code qui je le souligne fonctionne PARFAITEMENT est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
     
    function CalculDateDepartRapport()
    {
        G_DateDepartRapport = "";
        G_DateFinRapport = "";
        var ChoixSel = $("#Sel_DurRap").val();
        var NbJ = 0;
        var NbM = 0;
        switch (ChoixSel)
        {
            case "1":      /* Tout */
                {
                    FlgDureeRapports = true;
                    /* Reste à développer */
                }
                break;
            case "2":      /* 7 jours */
                {
                    NbJ = 7;
                    NbM = 0;
                    SousNbJours(NbJ, NbM);
                    FlgDureeRapports = true;
                }
                break;
            case "3":      /* 14 jours */
                {
                    NbJ = 14;
                    NbM = 0;
                    SousNbJours(NbJ, NbM);
                    FlgDureeRapports = true;
                }
                break;
            case "4":      /* 1 Mois */
                {
                    NbJ = 0;
                    NbM = 1;
                    SousNbJours(NbJ, NbM);
                    FlgDureeRapports = true;
                }
                break;
            case "5":      /* 2 Mois */
                {
                    NbJ = 0;
                    NbM = 2;
                    SousNbJours(NbJ, NbM);
                    FlgDureeRapports = true;
                }
                break;
            case "6":      /* 3 Mois */
                {
                    NbJ = 0;
                    NbM = 3;
                    SousNbJours(NbJ, NbM);
                    FlgDureeRapports = true;
                }
                break;
            default:      /* Pas encore sélectionné */
                {
                    $("#MessDurRapp").hide(500);
                    FlgDureeRapports = false;
                }
                break;
        }
    }
    function SousNbJours(NbJ, NbM)
    {
        var d = new Date();
        var J = d.getDate();
        var M = d.getMonth() + 1;
        var Y = d.getFullYear();
        var ND = 0;
        var NM = 0;
        var NY = 0;
        if (NbM > 0)
        {
            if (NbM > M)            /* Le nombre de Mois à soustraire est supérieur au mois en cours */
            {
                NbM = (NbM - M);    /* On calcule le nombre de mois excédant(s) le mois en cours */
                NM = (12 - NbM);    /* On retourne en décembre et on soustrait le(s) mois excédent(s) */
                NY = (Y - 1);       /* On passe à l'année précédente */
                ND = J;             /* Le jour reste le même */
            }
            else if (NbM === M)     /* Le nombre de Mois à soustraire est égal au mois en cours */
            {
                NM = 12;            /* On retourne en décembre */
                NY = Y - 1;         /* On passe à l'année précédente */
                ND = J;             /* Le jour reste le même */
     
            }
                else                /* Si le mois courant est plus grand que le nombre de mois à soustraire */
            {
                NM = (M - NbM);     /* On soustrait le nombre de Mois demandé au mois courant */
                ND = J;             /* Le jour reste le même */
                NY = Y;             /* L'année reste la même */
            }
     
        }
        else
        {
            var nbJM = NbJoursMois(M, Y);
            if (J => NbJ)           /* Si la date (jour) est plus grand que le nb de jours a retirer */
                {
                 ND = J - NbJ;      /* On retire le nb de jour à la date */
                 NM = M;            /* Le mois reste le même */
                 NY = Y;            /* L'année reste la même */
                }
            else
                {
                 if (M => 2)        /* Si le mois est plus grand que 1 (janvier) */
                 {
                     NM = (M - 1);  /* On retire un mois */
                     NY = Y;        /* L'année reste la même */
                 }
                 else
                 {
                     NM = 12;       /* Sinon on retourne en décembre */
                     NY = Y - 1;    /* On enlève une année */
                 }
            var nbJM = NbJoursMois(NM, NY); /* On checke le nombre de jours dans le nouveau mois */
            ND = (nbJM - (NbJ - J));        /* On retire la nombre de jours restants */
                 }
        }
     
        G_DateDepartRapport = ND + "-" + NM + "-" + NY;
        G_DateFinRapport = J + "-" + M + "-" + Y;
        $("#MessDurRapp").html(STxt['TxtDurRapport01'][ValLang] + G_DateDepartRapport + STxt['TxtDurRapport02'][ValLang] + G_DateFinRapport);
        $("#MessDurRapp").show(500);
    }
    //</editor-fold>
    //<editor-fold defaultstate="collapsed" desc="Calcul du nombre de jours dans le mois ">
    /* @param {Number} m = Mois
     * @param {Number} a = Année
     * @returns {Number} */
    function NbJoursMois(m, a)
    {
        var bi = isLeapYear(a);            /* vérication si l'année est bisextile */
        var nbJM = 0;                         /* Nombre de jours du mois en cours */
        if (m === 1 || m === 3 || m === 5 || m === 7 || m === 8 || m === 10 || m === 12)
        {
            nbJM = 31;
        }
        if (m === 4 || m === 6 || m === 9 || m === 11)
        {
            nbJM = 30;
        }
        if (m === 2)
        {
            if (bi)
            {
                nbJM = 29;
            } else
            {
                nbJM = 28;
            }
        }
     
        return nbJM;
    }
    //</editor-fold>
    Par contre j'ai l'impression d'avoir écrit un roman en trois tomes.
    Ma question: Est'il possible de faire plus simple ?
    D'avance merci

  2. #2
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 171
    Points
    17 171
    Par défaut
    Salut

    Un petit tour dans la FAQ JavaScript, chapitre La gestion des dates (l'objet Date) par exemple pour ta fonction NbJoursMois(m, a) te permettrait d'optimiser.
    Tu devrais trouver/adapter d'autres formule de calcul sur les dates se trouvant dans ce même chapitre.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  3. #3
    Membre habitué Avatar de Goltar
    Homme Profil pro
    Eternel Etudiant Curieux
    Inscrit en
    Mars 2011
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Eternel Etudiant Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2011
    Messages : 216
    Points : 137
    Points
    137
    Par défaut
    Merci ProgElecT,
    Je m'en vais investiguer la solution proposée.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var today = new Date();
    var last6 = new Date(today.getFullYear(),today.getMonth()-5,0);
    last6.setDate(Math.min(today.getDate(),last6.getDate()));
    Ce qui semble correspondre à mes besoins en l'adaptant pour les jours!

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

    Jolie code, cela a dû être instructif de le faire soi-même...

    Citation Envoyé par Goltar Voir le message
    Ce qui semble correspondre à mes besoins en l'adaptant pour les jours!
    Pour les jours c'est plus simple, il n'y a pas le problème évoqué pour les mois...

    Après en fait cela dépend de ce que tu entends par "un mois avant", est-ce 30 jours avant la date d'aujourd'hui ? Ou bien c'est le mois précédent avec le même numéro du jour (sauf cas particuliers évoqués dans la faq), exemple aujourd'hui : 03/02/19 ---> un mois avant c'est 03/01/19 ?

  5. #5
    Membre habitué Avatar de Goltar
    Homme Profil pro
    Eternel Etudiant Curieux
    Inscrit en
    Mars 2011
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Eternel Etudiant Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2011
    Messages : 216
    Points : 137
    Points
    137
    Par défaut
    Bonjour Beginner,
    En effet c'est bien 1,2 ou 3 mois précédent(s) en gardant le même jour.

  6. #6
    Membre habitué Avatar de Goltar
    Homme Profil pro
    Eternel Etudiant Curieux
    Inscrit en
    Mars 2011
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Eternel Etudiant Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2011
    Messages : 216
    Points : 137
    Points
    137
    Par défaut
    Mon code ci-dessus corrigé, si ça peut aider quelqu'un.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
     
    function CalculDateDepartRapport()
    {
        G_DateDepartRapport = "";
        G_DateFinRapport = "";
        var ChoixSel = $("#Sel_DurRap").val();
        var NbJ = 0;
        var NbM = 0;
        switch (ChoixSel)
        {
            case "1":      /* Tout */
                {
                    FlgDureeRapports = true;
                    /* Reste à développer */
                }
                break;
            case "2":      /* 7 jours */
                {
                    NbJ = 7;
                    NbM = 0;
                    SousNbJours(NbJ, NbM);
                    FlgDureeRapports = true;
                }
                break;
            case "3":      /* 14 jours */
                {
                    NbJ = 14;
                    NbM = 0;
                    SousNbJours(NbJ, NbM);
                    FlgDureeRapports = true;
                }
                break;
            case "4":      /* 1 Mois */
                {
                    NbJ = 0;
                    NbM = 1;
                    SousNbJours(NbJ, NbM);
                    FlgDureeRapports = true;
                }
                break;
            case "5":      /* 2 Mois */
                {
                    NbJ = 0;
                    NbM = 2;
                    SousNbJours(NbJ, NbM);
                    FlgDureeRapports = true;
                }
                break;
            case "6":      /* 3 Mois */
                {
                    NbJ = 0;
                    NbM = 3;
                    SousNbJours(NbJ, NbM);
                    FlgDureeRapports = true;
                }
                break;
            default:      /* Pas encore sélectionné */
                {
                    $("#MessDurRapp").hide(500);
                    FlgDureeRapports = false;
                }
                break;
        }
    }
    function SousNbJours(NbJ, NbM)
    {
        var d = new Date();
        var J = d.getDate();
        var M = d.getMonth() + 1;
        var Y = d.getFullYear();
        var ND = 0
          , NM = 0
          , NY = 0
          , NbR = 0
          , nbJM = 0;
        if (NbM > 0)
        {
            if (NbM > M)                         /* Le nombre de Mois à soustraire est supérieur au mois en cours */
            {
                NbM = (NbM - M);                 /* On calcule le nombre de mois excédant(s) le mois en cours */
                NM = (12 - NbM);                 /* On retourne en décembre et on soustrait le(s) mois excédent(s) */
                NY = (Y - 1);                    /* On passe à l'année précédente */
                ND = J;                          /* Le jour reste le même */
            }
            else if (NbM === M)                  /* Le nombre de Mois à soustraire est égal au mois en cours */
            {
                NM = 12;                        /* On retourne en décembre */
                NY = Y - 1;                     /* On passe à l'année précédente */
                ND = J;                         /* Le jour reste le même */
     
            }
            else                                /* Si le mois courant est plus grand que le nombre de mois à soustraire */
            {
                NM = (M - NbM);                 /* On soustrait le nombre de Mois demandé au mois courant */
                ND = J;                         /* Le jour reste le même */
                NY = Y;                         /* L'année reste la même */
            }
        }
        else if (NbJ > 0)
        {
             nbJM = NbJoursMois(M, Y);
            if (J === NbJ)
            {
                if (M === 1)
                {
                    NM = 12;                      /* Sinon on retourne en décembre */
                    NY = Y - 1;                   /* On enlève une année */
                    nbJM = NbJoursMois(NM, NY);   /* Récupération du nombre de jours pour le mois ciblé */
                    ND = nbJM;                    /* Le nouveau jour est = au nombre de jours du mois ciblé */
                }
                else
                {
                    NM = (M - 1);                 /* On retire un mois */
                    NY = Y;                       /* L'année reste la même */
                    nbJM = NbJoursMois(NM, NY);   /* Récupération du nombre de jours pour le mois ciblé */
                    ND = nbJM;                    /* Le nouveau jour est = au nombre de jours du mois ciblé */
                }
            }
            if (J > NbJ)                          /* Si la date (jour) est plus grand que le nb de jours a retirer */
                {
                    ND = J - NbJ;                 /* On retire le nb de jour à la date */
                    NM = M;                       /* Le mois reste le même */
                    NY = Y;                       /* L'année reste la même */
                }
            else
                {
                    NbR = (NbJ - J);               /* Nombre de jour restant à retirer */
                    if (M >= 2)                    /* Si le mois est = ou plus grand que 2 (février) */
                    {
                        NM = (M - 1);              /* On retire un mois */
                        NY = Y;                    /* L'année reste la même */
                        nbJM = NbJoursMois(NM, Y); /* Récupération du nombre de jours pour le mois ciblé */
                        ND = (nbJM - NbR);         /* On retire la nombre de jours restants */
                    }
                    else
                    {
                        NM = 12;                    /* Sinon on retourne en décembre */
                        nbJM = NbJoursMois(NM, Y);  /* Récupération du nombre de jours pour le mois ciblé */
                        NY = Y - 1;                 /* On enlève une année */
                        ND = (nbJM - NbR);          /* On retire la nombre de jours restants */
                    }
                 }
        }
     
        G_DateDepartRapport = ND + "-" + NM + "-" + NY;
        G_DateFinRapport = J + "-" + M + "-" + Y;
        $("#MessDurRapp").html(STxt['TxtDurRapport01'][ValLang] + G_DateDepartRapport + STxt['TxtDurRapport02'][ValLang] + G_DateFinRapport);
        $("#MessDurRapp").show(500);
    }
    //</editor-fold>
    //<editor-fold defaultstate="collapsed" desc="Calcul du nombre de jours dans le mois ">
    /* @param {Number} m = Mois
     * @param {Number} a = Année
     * @returns {Number} */
    function NbJoursMois(m, a)
    {
        var bi = isLeapYear(a);            /* vérication si l'année est bisextile */
        var nbJM = 0;                         /* Nombre de jours du mois en cours */
        if (m === 1 || m === 3 || m === 5 || m === 7 || m === 8 || m === 10 || m === 12)
        {
            nbJM = 31;
        }
        if (m === 4 || m === 6 || m === 9 || m === 11)
        {
            nbJM = 30;
        }
        if (m === 2)
        {
            if (bi)
            {
                nbJM = 29;
            } else
            {
                nbJM = 28;
            }
        }
     
        return nbJM;
    }

  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
    Ah ben je croyais que tu allais utiliser les liens fournis par ProgElecT...
    Notamment pour faire la soustraction tenant compte des années bissextiles...

    Ceci dit comme déjà dit c'est vrai que c'est instructif de le faire sois-même...

  8. #8
    Membre habitué Avatar de Goltar
    Homme Profil pro
    Eternel Etudiant Curieux
    Inscrit en
    Mars 2011
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Eternel Etudiant Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2011
    Messages : 216
    Points : 137
    Points
    137
    Par défaut
    Oui oui, j'utilise le lien fourni par ProgElect.

    Mais j'ai peaufiné celle-ci pour le plaisir ;-)
    Note qu'elle tiens également compte des années bissextiles avec la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function NbJoursMois(m, a)
    {
        var bi = isLeapYear(a);            /* vérication si l'année est bisextile */

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

Discussions similaires

  1. [ WinDev ] Calcul sur date dans SQL
    Par Tchupacabra dans le forum Langage SQL
    Réponses: 8
    Dernier message: 28/02/2006, 12h12
  2. Calcul sur date dans SQL
    Par Tchupacabra dans le forum WinDev
    Réponses: 4
    Dernier message: 27/02/2006, 19h23
  3. [débutant] calcul sur date
    Par Regis.C dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 04/01/2005, 10h51
  4. Resutlat de calcul sur date formaté
    Par neness dans le forum SQL
    Réponses: 6
    Dernier message: 16/06/2004, 15h34
  5. Calcul sur date
    Par Thomad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/09/2003, 08h55

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