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

Langage PHP Discussion :

fonction pour jours ouvré dans un mois


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    toulouse
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : toulouse

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Points : 3
    Points
    3
    Par défaut fonction pour jours ouvré dans un mois
    Bonjour j'ai crée un formulaire qui retourne 1 mois et une fonction qui doit me donner le nombre de jours ouvré dans ce mois en prenant en compte les jours fériés.

    Mon problème c est que ma fonction ne marche pas pour septembre avril et juin et je comprend vraiment pas pourquoi.

    merci de votre aide.

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <title></title>
      </head>
      <body>
        <form name="date" action="date2.php" method="POST" >
          <select name="mois">
            <option value="1">janvier</option>
            <option value="2">février</option>
            <option value="3">mars</option>
            <option value="4">avril</option>
            <option value="5">mai</option>
            <option value="6">juin</option>
            <option value="7">juillet</option>
            <option value="8">aout</option>
            <option value="9">septembre</option>
            <option value="10">octobre</option>
            <option value="11">novembre</option>
            <option value="12">décembre</option>
          </select>
          <br />
          <input type="submit" name="valider" value="valider" /><br />
        </form>
      </body>
    </html>
     
    <?php
     
    /**
         * nb_open_days($date_depart, $date_fin);
         *
         * @param string $mois
         *
         *
         *
         * @return $nb_jours_ouvres du mois
         */
     
    $mois=$_POST['mois'];
     
        function get_nb_open_days($date_depart, $date_fin) {
        $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_fin) - date('Y', $date_depart);
        for ($i = 0; $i <= $diff_year; $i++) {
        $year = (int)date('Y', $date_depart) + $i;
        // Liste des jours feriés
        $arr_bank_holidays[] = '1_1_'.date('Y'); // Jour de l'an
        $arr_bank_holidays[] = '1_5_'.date('Y'); // Fete du travail
        $arr_bank_holidays[] = '8_5_'.date('Y'); // Victoire 1945
        $arr_bank_holidays[] = '14_7_'.date('Y'); // Fete nationale
        $arr_bank_holidays[] = '15_8_'.date('Y'); // Assomption
        $arr_bank_holidays[] = '1_11_'.date('Y'); // Toussaint
        $arr_bank_holidays[] = '11_11_'.date('Y'); // Armistice 1918
        $arr_bank_holidays[] = '25_12_'.date('Y'); // Noel
        $arr_bank_holidays[] = '5_06_'.date('Y'); // pp
     
        // Récupération de paques. Permet ensuite d'obtenir le jour de l'ascension et celui de la pentecote
        $easter = easter_date(date('Y'));
     
     
        $arr_bank_holidays[] = date('j_n_'.date('Y'), $easter + 86400); // Paques
        $arr_bank_holidays[] = date('j_n_'.date('Y'), $easter + (86400*39)); // Ascension
        // $arr_bank_holidays[] = date('j_n_'.date('Y'), $easter + (86400*49)); // Pentecote
     
        }
     
        $nb_days_open = 0;
        while ($date_depart < $date_fin) {
                // 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_depart), array(0, 6))
                && !in_array(date('j_n_'.date('Y', $date_depart), $date_depart), $arr_bank_holidays)) {
                $nb_days_open++;
            }
            $date_depart += 86400;
        }
     
         $nb_days_open++;
        return $nb_days_open;
        }
     
        $nb_jour_mois = cal_days_in_month(CAL_GREGORIAN, $mois, date('Y'));
     
     
         $date_depart = strtotime(strval (date('Y'))."-".strval ($mois)."-".strval (1));
         $date_fin = strtotime(strval (date('Y'))."-".strval ($mois)."-".strval ($nb_jour_mois));
         $nb_jours_ouvres = get_nb_open_days($date_depart, $date_fin);
     
        echo 'Il y a '.$nb_jours_ouvres.' jours ouvr&eacute;s entre le '.strval (date('Y'))."-".strval ($mois)."-".strval (1).' et le '.strval (date('Y'))."-".strval ($mois)."-".strval ($nb_jour_mois);
     
     
     
        echo '  nombre jour dans le mois : '.$nb_jour_mois;

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Définis "ne marche pas". Qu'attends-tu et qu'obtiens-tu ?
    Pour avril, ça peut être un problème avec ta fonction pour la date de Pâques.

    Pour débugguer, tu peux décomposer ta vérification et afficher la date, et quelle condition est validée à chaque fois. Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        while ($date_depart < $date_fin) {
            echo date('j_n_Y', $date_depart).' : ';
            // 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_depart) , array(0,6))) {
                echo "week-end<br>";
            } elseif(in_array(date('j_n_' . date('Y', $date_depart) , $date_depart) , $arr_bank_holidays)) {
                echo "férié<br>";
            } else {
                echo "ouvré<br>";
                $nb_days_open++;
            }
            $date_depart+= 86400;
        }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Avril juin et septembre sont des mois de 30 jours sans jour férié. Coïncidence ? Je ne crois pas...
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  4. #4
    Candidat au Club
    Homme Profil pro
    toulouse
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : toulouse

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Spartacusply Voir le message
    Avril juin et septembre sont des mois de 30 jours sans jour férié. Coïncidence ? Je ne crois pas...
    j ai vu le problème c est que je l ai retourné dans tout les sens et impossible de voir ou est l erreur

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Si tu debugues ton script pas à pas forcement tu trouveras.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Sinon tu peux tenter un exorcisme, un sacrifice de poulet, ou de danser sur une jambe autour de ton ordi enroulé dans du jambon.
    A noter que tu ne nous as toujours pas dit quel était le problème : trop de jours, pas assez, une erreur ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    puisque c'est la noyelle, tiens une petite fonction que j'utilise :
    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
    function countFrenchBusinessDays(int $year, int $month, array $weekdays_off = [6, 7]): int
    {
        $holidays = [
            1  => [1],       // jour de l'an
            5  => [1, 8],    // fête du travail et armistice 39-45
            7  => [14],      // fête nationale
            8  => [15],      // Assomption
            11 => [1, 11],   // Toussaint et armistice 14-18
            12 => [25]       // noël
        ];
     
        $easter_day                = (new DateTime("{$year}-03-21"))->modify('+'.easter_days($year, CAL_GREGORIAN).' days');
        $easter_month              = $easter_day->format('n');
        $holidays[$easter_month][] = $easter_day->format('j');
     
        // no business days
        $start = new DateTimeImmutable("{$year}-{$month}-01");
        $end   = $start->modify('first day of next month');
        $days  = new DatePeriod($start, new DateInterval('P1D'), $end);
     
        foreach ($days as $dt) {
            if (in_array($dt->format('N'), $weekdays_off)) {
                $holidays[$month][] = $dt->format('j');
            }
        }
     
        return $start->format('t') - count(array_unique($holidays[$month]));
    }
    Tu peux même indiquer les jours de la semaine non travaillés (1 = lundi, 7 = dimanche)

  8. #8
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Super fonction, avec un bel usage des classes de date. C'est quand même beaucoup élégant d'utiliser DatePeriod et DateInterval que d'ajouter 86400 secondes à la date précédente, sans compter que ça doit gérer beaucoup mieux les trucs alakon comme le passage heure d'été/heure d'hiver et les années bissextiles

    Au passage, dans cette discussion, j'ai découvert easter_​date et easter_​days (bah oui, je manipule pas souvent de calendriers )
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  9. #9
    Membre éclairé Avatar de Geoffrey74
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 515
    Points : 760
    Points
    760
    Par défaut
    Hello,

    je me permets de réponde, même si ce n'est pas pour le sujet initial, mais plutôt pour la fonction de rawsrc

    à quoi sert le : int à la fin de la déclaration de la fonction ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function countFrenchBusinessDays(int $year, int $month, array $weekdays_off = [6, 7]): int

  10. #10
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    C'est le type que retourne la fonction. Bienvenue en PHP 7 !
    PHP Manual - Déclaration des types de retour
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  11. #11
    Membre éclairé Avatar de Geoffrey74
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 515
    Points : 760
    Points
    760
    Par défaut
    Merci !

    Je ne connaissais pas, ça va m'être très utile

Discussions similaires

  1. vba- création de classeurs pour chaque jour ouvré d'un mois
    Par sickos dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/04/2016, 02h14
  2. [XL-2007] Fonction serie.jour.ouvré pour les dates
    Par Nounours1 dans le forum Excel
    Réponses: 6
    Dernier message: 10/09/2012, 10h26
  3. Réponses: 7
    Dernier message: 22/08/2006, 16h01
  4. Excel : Nombre de jours ouvrés dans un mois
    Par repié dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/12/2005, 10h09
  5. Comment utiliser la fonction NBR.JOURS.OUVRES?
    Par MEHCOOPER dans le forum Access
    Réponses: 9
    Dernier message: 20/10/2005, 12h50

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