Nb Jours entre 2 dates - Jours fériés

Nb Jours entre 2 dates - Jours fériés - C#/.NET managed - Programmation

Marsh Posté le 19-01-2005 à 14:40:05    

Voilà mon problème, je dois récupérer le nombre de jours prestés par un travailleur entre 2 dates que je sélectionne dans ma Bd.
Le problème c'est que je reçois un champ de début de période de travail pour un projet et de fin de période.
Je dois donc enlever moi-même les samedis et dimanche  
(et éventuellement les jours fériés, ça on verra bien après).
Avant j'utilisais le TimeSpan ts= DateFin-DateDeb et j'avais donc le nombre de jours d'écart entre les 2 dates. Mais vu que je dois enlever les samedis et dimanche... Est-ce qu'il y a possibilité de faire cela facilement ou dois-je passer en revue tous les jours compris entre ces 2 dates et enlever un jour à chaque fois qu'on tombe sur un samedi ou dimanche? Ce qui risque d'être bien lourd à faire!!

Reply

Marsh Posté le 19-01-2005 à 14:40:05   

Reply

Marsh Posté le 20-01-2005 à 08:52:52    

bah au pire une boucle avec 2 if et hop c'est fait, je vois pas ce qu'il y a de lourd la dedans...

Reply

Marsh Posté le 20-01-2005 à 09:21:50    

Ben si boucler sur tous les jours de date si j'ai un écart de 5 mois, je trouve moi... Je sais pas des fois qu'il y aurait possibilité de récupérer tous les samedis et dimanches par je ne sais quel moyen. Mais si jamais oui je ferai comme ça, pas le choix...

Reply

Marsh Posté le 20-01-2005 à 09:46:37    

Avec une BD, tu peut te faire un calendrier à mettre à jour de temps en temps...
Pour les jours fériés, y'a 2 cas:
- Les dates fixes : facile ;)
- Les fêtes mobiles : Basées sur la date de pâques : voir http://www.surleau.com/hfr/paques.php?A=2005 par exemple
 
Une fois que t'as ton calendrier en base, c'est facile de faire une requête pour compter le nombre de jours ouvrés entre deux dates.
 
Sans base, c'est pas très compliqué non plus:
Une fois que tu as le nombre de jours, il faut enlever :
- Les samedis et dimanches. Normalement y reviennent tous les 7 jours, donc si tu sais quel est le jour de début, en gros il suffit de compter le nombre de fois qu'il y as 7 jours, bref une division quoi ;)
- Les jours fériés (Fixes + calculés pour la période). Compter ceux qui sont dans la période mais qui ne tombent pas un week-end.
Attention au périodes sur plusieurs années...


Message édité par Mara's dad le 20-01-2005 à 09:48:28

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 20-01-2005 à 10:17:44    

Je te remercie, avec tes explications ça devrait aller vite... Juste que c'est pas tout à fait une division car si on commence un projet un jour de semaine autre que le lundi, ce ne sera pas juste de diviser par 7... J'y avais pensé aussi. J'ai trouvé du code VB qui permet de calculer un écart de date de jours ouvrables aussi. Je vais d'avord voir ce que ça donne en le convertissant en c#.
En tout cas encore merci pour ton aide!!

Reply

Marsh Posté le 20-01-2005 à 14:46:14    

C'est sûr qu'il faut pas juste diviser par 7 !
 
Exemple ( je compte les jours de début et de fin )
Début : 20/01/2005
Fin : 16/02/2005
 
Donc :
Nombre de jour : 28
Début est un jeudi, donc 2 jour avant le week-end
=> ( 28 - 4 ) / 7 = 3 reste 3
 
On a donc : le week-end qui vient plus 3 autres week-ends.
 
Donc nombre de jours ouvrés : 28 - ( 1 + 3 ) * 2 = 20 !
 
Y'a plus qu'à écrire ça en C# ;)


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 20-01-2005 à 14:57:11    

Grand merci, c'est bien sympa de ta part...

Reply

Marsh Posté le 21-01-2005 à 09:09:05    

oui c'est de l'algorithmie quoi, aucun rapport avec le C# [:spamafote]

Reply

Marsh Posté le 21-01-2005 à 16:39:21    

Oui mais bon c'est toujours sympa de répondre aux questions et de se préoccuper des problèmes des autres, même si c'est de l'algorithmie... Enfin soit!!

Reply

Marsh Posté le 17-12-2009 à 20:51:14    

       public static int WorkingDays(DateTime FromDate, DateTime ToDate)
        {
            int nbrJours = Convert.ToInt32(ToDate - FromDate);
            int dayofweek = GetDayOfWeekPosition(ToDate);
            int reste = (nbrJours - dayofweek)/7;
            return nbrJours - (1 + reste)*2;
        }
 
        private static int GetDayOfWeekPosition(DateTime ToDate)
        {
            int result;
            switch (ToDate.DayOfWeek)
            {
                case DayOfWeek.Monday:
                    result = 5;
                    break;
                case DayOfWeek.Tuesday:
                    result = 4;
                    break;
                case DayOfWeek.Wednesday:
                    result = 3;
                    break;
                case DayOfWeek.Thursday:
                    result = 2;
                    break;
                case DayOfWeek.Friday:
                    result = 1;
                    break;
                default:
                    result = 0;
                    break;
            }
            return result;            
        }
 
Voilà, c'est une trad en C#...
 
Log.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed