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

C# Discussion :

Calculer nombre d'heures selon des plages horaires


Sujet :

C#

  1. #21
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Tout comme le fait que l'employer ne peut pas effectuer une intervention de 48h d'affilé, sur 2 jours.
    C'est juste un algo de principe. Tous les cas ne sont pas pris en compte. Celui que tu cites (48h) ne l'est pas. Mais en même temps, la législation française n'autorise pas cela, donc bon

    Citation Envoyé par ericlm128 Voir le message
    Mis à part le fait que ton script ne gère pas sur deux jours, il peut nous dire combien d'heures travaillés entre 21H-23H ; 23H-00H ; 00H-05H et 05H-06H ?
    Ben il est fait pour ça justement !
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  2. #22
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 85
    Points : 69
    Points
    69
    Par défaut
    Je vais prendre le temps d'analyser ce que vous avez fais, mais je pense que je devrais m'en sortir..

    En effet le problème du 23h 05h est un cas particulier je pense que je vais le gérer en deux fois.


    En tout cas merci énormément pour vos réponse !!

  3. #23
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Citation Envoyé par amalliap Voir le message
    Je vais prendre le temps d'analyser ce que vous avez fais, mais je pense que je devrais m'en sortir..
    En effet le problème du 23h 05h est un cas particulier je pense que je vais le gérer en deux fois.
    En tout cas merci énormément pour vos réponse !!
    Pour info mon script gère ce cas.

  4. #24
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par dorinf Voir le message
    C'est juste un algo de principe. Tous les cas ne sont pas pris en compte. Celui que tu cites (48h) ne l'est pas. Mais en même temps, la législation française n'autorise pas cela, donc bon
    Oui, mais une erreur de saisie est vite arrivée

  5. #25
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    Oui, mais une erreur de saisie est vite arrivée
    Tout à fait !

    Pour preuve : mon algo est incomplet. Le voici corrigé :

    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
    public static double GetHour(int idUser, string date, string startTime, string endTime)
            {
                DateTime period = DateTime.ParseExact(date, "yyyy-MM-dd", null);
                DateTime start = DateTime.ParseExact(startTime, "H:mm:ss", null);
                DateTime end = DateTime.ParseExact(endTime, "H:mm:ss", null);
                double totalHour = 0;
     
     
                foreach (var intervention in InterventionCollection.GetAll(idUser))
                {
                    if (intervention.StartDate.Year == period.Year && intervention.StartDate.Month == period.Month &&
                        intervention.StartDate.DayOfWeek != DayOfWeek.Sunday)
                    {
                        DateTime startPeriod = new DateTime(intervention.StartDate.Year,
                                                            intervention.StartDate.Month,
                                                            intervention.StartDate.Day,
                                                            start.Hour,
                                                            start.Minute,
                                                            start.Second);
                        DateTime endPeriod = new DateTime(intervention.StartDate.Year,
                                                            intervention.StartDate.Month,
                                                            intervention.StartDate.Day,
                                                            end.Hour,
                                                            end.Minute,
                                                            end.Second);
     
                        if (endPeriod < startPeriod)
                        {
                            endPeriod = endPeriod.AddDays(1);
                        }
     
                        if ((startPeriod <= intervention.StartDate && intervention.StartDate <= endPeriod) ||
                            (startPeriod <= intervention.EndDate && intervention.EndDate <= endPeriod) ||
                            (intervention.StartDate <= startPeriod && endPeriod <= intervention.EndDate))
                        {
                            // L'intervention chevauche la plage horaire. Il reste à calculer la plage effective
                            TimeSpan duree;
                            if (startPeriod <= intervention.StartDate)
                            {
                                startPeriod = intervention.StartDate;
                            }
     
                            if (intervention.EndDate <= endPeriod)
                            {
                                endPeriod = intervention.EndDate;
                            }
     
                            duree = endPeriod - startPeriod;
                            totalHour += duree.TotalHours;
                        }
                    }               
                }
     
                return totalHour;
            }
    Il manquait le cas où la période recherchée était complètement incluse durant l'intervention (j'ai eu un flash à la piscine ). Du coup, j'en ai profité pour rajouter le support des périodes à cheval sur 2 journées.

    Après, pour aller au delà, il faudrait changer la signature de la méthode...
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  6. #26
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    J'ai testé ton script par curiosité, voici quelques anomalies afin que tu puisse le modifier et le rendre viable.

    Exception
    Exception sur
    DateTime period = DateTime.ParseExact(date, "yyyy-MM-dd", null);
    Il est vrai que amalliap ne nous as pas donné les séparateurs à utiliser il me semble, pour ma part j'utilise les classiques "/" (ce qui génère l'exception dans ton code).

    Cas concret 1 (a cheval sur deux mois) :
    J'ai une intervention qui début le "30/06/2016 22:00:00" (jeudi) et qui finit le "01/07/2016 05:00:00" (vendredi).
    Je souhaite connaitre pour le mois de Juin les heures travaillés entre "22:00:00" et "04:00:00".
    Avec cette appel à ta fonction il me retourne 6 au lieu de 2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double h = GetHour(1, "2016-06-30", "22:00:00", "04:00:00"); // h = 6
    Cas concret 2 (a cheval sur dimanche) :
    J'ai une intervention qui début le "30/07/2016 22:00:00" (samedi) et qui finit le "31/07/2016 02:00:00" (dimanche).
    Je souhaite connaitre pour le mois de Juillet les heures travaillés entre "20:00:00" et "05:00:00".
    Avec cette appel à ta fonction il me ressort 4 au lieu de 2, car 2 heures était présentent le dimanche (à exclure).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double h = GetHour(1, "2016-07-30", "20:00:00", "05:00:00"); // h = 4

  7. #27
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    J'avais aussi un bug sur les années que j'ai corrigés.

    Dans le même principe tu aura un aussi un bug supplémentaire sur des interventions à cheval sur 2 années. Si l'année de EndDate ne fait pas parti de l’année valide (définit par le paramètre 'date').

    Les paramètres de type string ce n'est pas top comme même ... trop de risque d'erreur.
    Un DateTime pour date, 2 int pour startTime et endTime serais plus fiable et adapté.

    Ou mieux 4 int
    anné
    mois
    startHour
    endHour

  8. #28
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    J'en profite pour informer 'amalliap' qu'il y a déjà des bugs déjà citées dans ton script de départ, donc j’espère que vous ne payer pas les heures de vos intervenants à partir de code.

  9. #29
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Il est vrai que amalliap ne nous as pas donné les séparateurs à utiliser il me semble, pour ma part j'utilise les classiques "/" (ce qui génère l'exception dans ton code).
    Il l'a fait. Dans son code. Il utilise "-" comme séparateur.

    Concernant les remarques sur tes deux cas concrets, c'est tout à fait correct. Tout n'est pas géré. Et il n'a pas la prétention de le faire d'ailleurs. Il avait pour but de montrer une version moins usine à gaz que le code présenté par amalliap. Il n'en fait pas plus, il n'en fait pas moins. Le but n'est pas de faire son travail mais de l'aider.

    Tu pars aussi du principe que toute heure faite un dimanche ne doive pas être comptabilisée, même si l'intervention débute le samedi. Si une intervention est à cheval sur deux mois (ou deux années), tu pars du principe qu'il faut la "couper" en deux. Tu pars également du principe que les heures d'interventions sont forcément pleines. Ce n'est pas à toi de faire ces suppositions mais à amalliap d'agir en conséquence en fonction de ses besoins réels.

    Les paramètres de type string ce n'est pas top comme même ... trop de risque d'erreur.
    Un DateTime pour date, 2 int pour startTime et endTime serais plus fiable et adapté.
    Remarque pertinente à laquelle j'adhère.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [Exchange 2010] Acces selon des plages horaires
    Par SebRo dans le forum Exchange Server
    Réponses: 1
    Dernier message: 19/11/2015, 16h35
  2. [XL-2010] Calcul heures Excel avec plage horaire
    Par lafafmentvotre dans le forum Macros et VBA Excel
    Réponses: 43
    Dernier message: 09/12/2011, 08h22
  3. [XL-2003] calcul de délais selon une plage horaire hebdo
    Par DBO dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/07/2011, 17h38
  4. convertir des heures selon les fuseaux horaires
    Par cyrano_de_bergerac dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 27/05/2008, 11h13
  5. calcul délais entre deux dates avec plages horaires
    Par leila eco dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 03/01/2007, 16h51

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