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

Algorithmes et structures de données Discussion :

Nombre de jours ouvrables entre deux dates


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Nombre de jours ouvrables entre deux dates
    Bonjour tout le monde,
    Je suis à la recherche d'un bon algorithme (ou d'une manière de penser) qui calcule le nombre de jours ouvrables entre deux dates entrées. J'ai déjà écrit les fonctions suivantes (en C) :

    - Fonction Bissextile : Teste si une année est bissextile
    - Fonction DateValide : Teste si une date est valide
    - Fonction DateToJour : Transforme une date en jours de la semaine
    renvoit 0 pour dimanche
    1 pour lundi
    ...
    6 pour samedi
    - Fonction DatePaques : Renvoit la date de Paques (jour et mois)
    - Fonction JCJ : Renvoit le nombre de jours du calendrier julien d'une date

    Je sais que je dois traiter les années complètes, puis alors les deux morceaux d'années restants. J'ai calculé, en admettant que l'on récupère les jours fériés, qu'un année contient 52 week-end et 11 jours fériés (pas besoins de plus de précision).

    Je m'emmele complètement les pinceaux à partir du moment où il faut calculer le nombre de jours ouvrables entre deux dates d'un meme année.
    Merci à l'âme charitable qui m'éclairera.

    Bonne journée,
    Julien

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 121
    Points
    28 121
    Par défaut
    Bonjour,

    Une idée un peu parallèle : pourquoi ne pas considérer un temps de base (mettons le 1er janvier 1970 à 00:00:00 pour être super original), et calculer le temps écoulé en seconde entre cette date et tes deux dates ?
    Ensuite, tu fais la différence entre les deux nombres obtenus, et tu obtiens un nombre de seconde, qu'il te suffit de diviser par 86 400 (nombre de seconde par jour sauf erreur de ma part) pour obtenir le nombre de jour.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    il y a un petit algo qui en fonction d'une date te donne le jour de la semaine correspondant.
    C'est un bon début pour ton problème.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 192
    Points : 231
    Points
    231
    Par défaut
    Une manière simple de procéder (suffisante ?) :
    - construire une liste de jours "spéciaux" (fériés...) grâce à ta fonction pacques... le 25/12,01/01... qui tombent entre lundi et vendredi
    - calculer le nombre de semaines complètes entre les deux dates (entre le lundi de la semaine suivant la date début et le vendredi précédant la date fin)
    - le multiplier par le nombre de jours ouvrés "normal" par semaine (5?)
    - ajouter le nombre de jours résidus (entre le jour début et le vendredi de la même semaine et entre le lundi de la semaine du jour fin et le jour fin)
    - parcourir la liste de jours "spéciaux" (fériés...). Si le jour appartient à ta plage de dates, décrémenter le nombre de jours.
    Tu peux traiter le 29/02 comme un jour spécial pour lequel on doit incrémenter au lieu de décrémenter.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    j'utilisais ceci dans le passé mais aujourdhui tous les langages donnent ceci en direct
    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
     
    FUNCTION FACTJOUR(J,M,A:INTEGER):longint;
    (*transforme une date en un nombre*)
    VAR FACT:REAL;
          BEGIN
    IF M IN[1,2] THEN
    BEGIN
    FACT:=(1.0*365*A)+1*J;
     FACT:=FACT+(1.0*(31*(M-1)));
     FACT:=FACT+(1.0*INT(((A-1)/4)));
    FACT:=FACT-(1.0*INT(3/4*INT(((A-1)/100)+1)));
       END
    ELSE
       BEGIN
    FACT:=(1.0*365*A)+J;
    FACT:=FACT+(1*(31*(M-1)));
    FACT:=FACT+(1.0*INT((A/4)));
    FACT:=FACT-INT(3/4*INT((A/100)+1));
    FACT:=FACT-INT(((0.4*M)+2.3));
       END;
    FACTJOUR:=round(FACT);
       END;
     
     
    function jourclair(j,m,a:integer):jou;
    (*donne en clair le nom du jour d'une date*)
    var u:integer;
    begin
    u:=factjour(j,m,a) mod 7;
    case u of
     
    0 :  jourclair:='samedi';
    1 :  jourclair:='dimanche';
    2 :  jourclair:='lundi';
    3 :  jourclair:='mardi';
    4 :  jourclair:='mercredi';
    5 :  jourclair:='jeudi';
    6 :  jourclair:='vendredi';
     
    end;
    end;
    il te reste l'algo de paques à mettre en oeuvre l'ago est partout
    et à y ajouter les fetes^fixes comme le 14 juillet
    Elle est pas belle la vie ?

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. Fonction Calcul automatique de nombre de jours ouvrable entre deux dates
    Par KiMbOoO dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/04/2011, 09h23
  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. Compter le nombre de jours écoulés entre deux dates
    Par koKoTis dans le forum VBScript
    Réponses: 8
    Dernier message: 07/08/2006, 19h44

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