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 :

Fonction Calcul automatique de nombre de jours ouvrable entre deux dates


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Points : 57
    Points
    57
    Par défaut Fonction Calcul automatique de nombre de jours ouvrable entre deux dates
    Bonjour à tous !
    Voila à partir de d'un code que j'ai pu trouver sur le net et d'un autre code en javascript que j'ai essayé de faire j'aurais voulu mettre en place un petit script ou lorsque je rentre deux dates j'aurais le nombres de jours ouvrés en tenant compte des jours fériés et des week-end !

    J'ai en effet un premier script en PHP qui me donne bien le nombre de jours ouvrés en tenant compte des jours fériés et week end
    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
     
    <?php
    // Fonction permettant de compter le nombre de jours ouvrés entre deux dates
        function get_nb_open_days($date_start, $date_stop) {
        $arr_bank_holidays = array(); // Tableau des jours feriés
     
        // On boucle dans le cas où l'année de départ serait différente de l'année d'arrivée
        $diff_year = date('Y', $date_stop) - date('Y', $date_start);
        for ($i = 0; $i <= $diff_year; $i++) {
        $year = (int)date('Y', $date_start) + $i;
        // Liste des jours feriés
        $arr_bank_holidays[] = '1_1_'.$year; // Jour de l'an
        $arr_bank_holidays[] = '1_5_'.$year; // Fete du travail
        $arr_bank_holidays[] = '8_5_'.$year; // Victoire 1945
        $arr_bank_holidays[] = '14_7_'.$year; // Fete nationale
        $arr_bank_holidays[] = '15_8_'.$year; // Assomption
        $arr_bank_holidays[] = '1_11_'.$year; // Toussaint
        $arr_bank_holidays[] = '11_11_'.$year; // Armistice 1918
        $arr_bank_holidays[] = '25_12_'.$year; // Noel
     
        // Récupération de paques. Permet ensuite d'obtenir le jour de l'ascension et celui de la pentecote
        $easter = easter_date($year);
        $arr_bank_holidays[] = date('j_n_'.$year, $easter + 86400); // Paques
        $arr_bank_holidays[] = date('j_n_'.$year, $easter + (86400*39)); // Ascension
        $arr_bank_holidays[] = date('j_n_'.$year, $easter + (86400*50)); // Pentecote
        }
        //print_r($arr_bank_holidays);
        $nb_days_open = 0;
        while ($date_start < $date_stop) {
        // Si le jour suivant n'est ni un dimanche (0) ou un samedi (6), ni un jour férié, on incrémente les jours ouvrés
        if (!in_array(date('w', $date_start), array(0, 6))
        && !in_array(date('j_n_'.date('Y', $date_start), $date_start), $arr_bank_holidays)) {
        $nb_days_open++;
         }
         $date_start += 86400;
         }
        return $nb_days_open;
        }
     
        // Exemple : Du 11 au 15 juillet il n'y a qu'un jour ouvré (week-end + 1 jours férié)
         $date_depart = strtotime('2009-03-20');
         $date_fin = strtotime('2009-03-23');
         $nb_jours_ouvres = get_nb_open_days($date_depart, $date_fin);
        echo 'Il y a '.$nb_jours_ouvres.' jours ouvr&eacute;s entre le '.date('d/m/Y', $date_depart).' et le '.date('d/m/Y', $date_fin);
    ?>
    et donc mon deuxième script en javascript qui est sous la forme d'un formulaire me permet de mettre deux dates et davoir dans un textarea le résultat voulu mais ce code ne prend pas en compte ni les jours fériés et week-end

    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
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
     
    <html>
    <head>
    <script language="javascript">
    function strtotime(str, now) {
     
        var i, match, s, strTmp = '', parse = '';
     
        strTmp = str;
        strTmp = strTmp.replace(/\s{2,}|^\s|\s$/g, ' '); // unecessary spaces
        strTmp = strTmp.replace(/[\t\r\n]/g, ''); // unecessary chars
     
        if (strTmp == 'now') {
            return (new Date()).getTime()/1000; // Return seconds, not milli-seconds
        } else if (!isNaN(parse = Date.parse(strTmp))) {
            return (parse/1000);
        } else if (now) {
            now = new Date(now*1000); // Accept PHP-style seconds
        } else {
            now = new Date();
        }
     
        strTmp = strTmp.toLowerCase();
     
        var process = function (m) {
            var ago = (m[2] && m[2] == 'ago');
            var num = (num = m[0] == 'last' ? -1 : 1) * (ago ? -1 : 1);
     
            switch (m[0]) {
                case 'last':
                case 'next':
                    switch (m[1].substring(0, 3)) {
                        case 'yea':
                            now.setFullYear(now.getFullYear() + num);
                            break;
                        case 'mon':
                            now.setMonth(now.getMonth() + num);
                            break;
                        case 'wee':
                            now.setDate(now.getDate() + (num * 7));
                            break;
                        case 'day':
                            now.setDate(now.getDate() + num);
                            break;
                        case 'hou':
                            now.setHours(now.getHours() + num);
                            break;
                        case 'min':
                            now.setMinutes(now.getMinutes() + num);
                            break;
                        case 'sec':
                            now.setSeconds(now.getSeconds() + num);
                            break;
                        default:
                            var day;
                            if (typeof (day = __is.day[m[1].substring(0, 3)]) != 'undefined') {
                                var diff = day - now.getDay();
                                if (diff == 0) {
                                    diff = 7 * num;
                                } else if (diff > 0) {
                                    if (m[0] == 'last') diff -= 7;
                                } else {
                                    if (m[0] == 'next') diff += 7;
                                }
                                now.setDate(now.getDate() + diff);
                            }
                    }
                    break;
     
                default:
                    if (/\d+/.test(m[0])) {
                        num *= parseInt(m[0]);
     
                        switch (m[1].substring(0, 3)) {
                            case 'yea':
                                now.setFullYear(now.getFullYear() + num);
                                break;
                            case 'mon':
                                now.setMonth(now.getMonth() + num);
                                break;
                            case 'wee':
                                now.setDate(now.getDate() + (num * 7));
                                break;
                            case 'day':
                                now.setDate(now.getDate() + num);
                                break;
                            case 'hou':
                                now.setHours(now.getHours() + num);
                                break;
                            case 'min':
                                now.setMinutes(now.getMinutes() + num);
                                break;
                            case 'sec':
                                now.setSeconds(now.getSeconds() + num);
                                break;
                        }
                    } else {
                        return false;
                    }
                    break;
            }
            return true;
        };
     
        var __is =
        {
            day:
            {
                'sun': 0,
                'mon': 1,
                'tue': 2,
                'wed': 3,
                'thu': 4,
                'fri': 5,
                'sat': 6
            },
            mon:
            {
                'jan': 0,
                'feb': 1,
                'mar': 2,
                'apr': 3,
                'may': 4,
                'jun': 5,
                'jul': 6,
                'aug': 7,
                'sep': 8,
                'oct': 9,
                'nov': 10,
                'dec': 11
            }
        };
     
        match = strTmp.match(/^(\d{2,4}-\d{2}-\d{2})(?:\s(\d{1,2}:\d{2}(:\d{2})?)?(?:\.(\d+))?)?$/);
        if (match != null) {
            if (!match[2]) {
                match[2] = '00:00:00';
            } else if (!match[3]) {
                match[2] += ':00';
            }
     
            s = match[1].split(/-/g);
     
            for (i in __is.mon) {
                if (__is.mon[i] == s[1] - 1) {
                    s[1] = i;
                }
            }
            s[0] = parseInt(s[0], 10);
     
            s[0] = (s[0] >= 0 && s[0] <= 69) ? '20'+(s[0] < 10 ? '0'+s[0] : s[0]+'') : (s[0] >= 70 && s[0] <= 99) ? '19'+s[0] : s[0]+'';
            return parseInt(this.strtotime(s[2] + ' ' + s[1] + ' ' + s[0] + ' ' + match[2])+(match[4] ? match[4]/1000 : ''), 10);
        }
     
        var regex = '([+-]?\\d+\\s'
        + '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'
        + '|sun\.?|sunday|mon\.?|monday|tue\.?|tuesday|wed\.?|wednesday'
        + '|thu\.?|thursday|fri\.?|friday|sat\.?|saturday)'
        + '|(last|next)\\s'
        + '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'
        + '|sun\.?|sunday|mon\.?|monday|tue\.?|tuesday|wed\.?|wednesday'
        + '|thu\.?|thursday|fri\.?|friday|sat\.?|saturday))'
        + '(\\sago)?';
     
        match = strTmp.match(new RegExp(regex, 'g'));
        if (match == null) {
            return false;
        }
     
        for (i in match) {
            if (!process(match[i].split(' '))) {
                return false;
            }
        }
     
        return (now.getTime()/1000);
    }
     
    function calcul(total,d1,d2)
    { // on se limite à un prix avec un taux de TVA et des frais de port
    x=document.getElementById(d1);d1=x.value; // DATE 1
    x=document.getElementById(d2);d2=x.value; // DATE 2
     
    r=Math.round((strtotime(d2) - strtotime(d1))/(60*60*24)-1)+1; // On calcule
    x=document.getElementById(total);x.value=r; // On affecte
    }
    </script>
    </head>
    <body>
    <form name="frm">
    DATE 1 : <input type="text" name="d1" id="d1" onBlur="calcul('total','d1','d2')" value="0"><br/>
    DATE 2 : <input type="text" name="d2" id="d2" onBlur="calcul('total','d1','d2')" value="0"><br/>
    <br/>
    Total  : <input id="total" type="text" name="total" readonly="true">
    </form>
    </body>
    </html>
    Donc en gros le but sera de pouvoir fusionner ces deux codes pour obtenir un petit script javascript ! Quelqu'un pour m'aider ???

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    moi aussi je suis interesse par une script de ce type, pour faire une formulaire de reservation, on peux partager les frai ensemble pour commander une chez quelq'un.

  3. #3
    Membre régulier Avatar de jc-macintosh
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Portugal

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2011
    Messages : 75
    Points : 116
    Points
    116
    Par défaut Moi j'utilise cela !!
    Salut !

    J'utilise la même chose qui fonctionne bien !!

    C'est juste le calcul automatique du nbr de jour qui en 'manuel' !

    Je le voudrais automatique !!

    Vous le trouverez ici Formulaire Arrivée - Départ

    Si vous trouvez pour le calcul auto ! Merci de partager...

    A+

    JClaude
    A+
    J-Claude

    PS: Si une réponse vous a permis d'avancer, merci de voter "pouce vers le haut" sur celle-ci. Si votre problème est résolu, cliquer sur le bouton noir "Résolu" en bas.
    Histoire aussi d'aider les autres utilisateurs en recherche de solution.

    Merci.

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/02/2013, 14h16
  2. Calcul de nombre de jours ouvrable entre deux date
    Par etienneborms dans le forum Débuter
    Réponses: 6
    Dernier message: 30/01/2012, 10h53
  3. [PHP 5.2] Fonction qui retourne le nombre de jours compris entre deux dates
    Par zemzoum89 dans le forum Langage
    Réponses: 2
    Dernier message: 18/05/2010, 20h27
  4. Nombre de jours ouvrables entre deux date
    Par taroudant dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 29/05/2008, 11h21
  5. Nombre de jours ouvrables entre deux dates
    Par lenny_ dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 27/10/2006, 12h13

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