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 Delphi Discussion :

Problème d'interval entre deux heures


Sujet :

Langage Delphi

  1. #1
    ILP
    ILP est déconnecté
    Membre confirmé
    Avatar de ILP
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2002
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 258
    Points : 610
    Points
    610
    Par défaut Problème d'interval entre deux heures
    Bonjour,
    J'ai à effectuer le calcul du nombre d'heure entre deux dates. Sur une fiche j'ai donc quatre TDateTimePicker (deux pour les dates et deux pour les heures.
    Dans le OnChange de ces composants j'ai mis ce code :
    Code Pascal : 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
    procedure TFODP_Occupation.DATE_Change(Sender: TObject);
    var
      Annee, Mois, Jour, Heure, Minute, Seconde, MSeconde: Word;
      DateDebut, DateFin: TDateTime;
      Interval: Double;
    begin
      DecodeDate(DATE_DebutPrevu.Date, Annee, Mois, Jour);
      DecodeTime(TIME_DebutPrevu.Time, Heure, Minute, Seconde, MSeconde);
      DateDebut := EncodeDateTime(Annee, Mois, Jour, Heure, Minute,
        Seconde, MSeconde);
     
      DecodeDate(DATE_FinPrevu.Date, Annee, Mois, Jour);
      DecodeTime(TIME_FinPrevu.Time, Heure, Minute, Seconde, MSeconde);
      DateFin := EncodeDateTime(Annee, Mois, Jour, Heure, Minute,
        Seconde, MSeconde);
     
      Interval := HourSpan(DateDebut, DateFin);
     
      TXT_DureePrevu.FloatValue := Interval;
    end;

    Le problème c'est que la valeur retournée dans la variable Interval n'est pas toujours celle que j'attend.
    Par exemple, si je mets l'heure de début à 12:00 et celle de fin à 13:00, je récupère une valeur d'interval de 0,99999999994 au lieu de 1.
    Quelqu'un aurait une idée d'une solution ?

  2. #2
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    @Salut,

    As-tu essayé HoursBetween


  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     DecodeDate(DATE_DebutPrevu.Date, Annee, Mois, Jour);
      DecodeTime(TIME_DebutPrevu.Time, Heure, Minute, Seconde, MSeconde);
      DateDebut := EncodeDateTime(Annee, Mois, Jour, Heure, Minute,
        Seconde, MSeconde);
     
      DecodeDate(DATE_FinPrevu.Date, Annee, Mois, Jour);
      DecodeTime(TIME_FinPrevu.Time, Heure, Minute, Seconde, MSeconde);
      DateFin := EncodeDateTime(Annee, Mois, Jour, Heure, Minute,
        Seconde, MSeconde);
    simplifiable en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DateDebut := Int(DATE_DebutPrevu.Date) + Frac(TIME_DebutPrevu.Time);
    DateFin := Int(DATE_FinPrevu.Date) + Frac(TIME_FinPrevu.Time);
    Int et Frac pour la parano, mais normalement Date et Time ne sont pas sensés être parasité, quoi qu'il est possible que cela contiennent pour Time au moins la date du jour !

    Pour tout ce qui calcul sur Float, il faut utiliser les fonctions gérant un Epsilon comme IsZero ou SameValue de l'unité Math

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if SameValue(0,99999999994, 1, EncodeTime(0,0,0,1)) then
      ...
    EncodeTime(0,0,0,1) = 1 / 24 / 60 / 60 / 1000 =~ 0,0000000157
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    ILP
    ILP est déconnecté
    Membre confirmé
    Avatar de ILP
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2002
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 258
    Points : 610
    Points
    610
    Par défaut
    Je pense avoir trouvé une solution en fouillant un peut dans l'unité Math.
    J'utilise les fonctions SetRoundMode et SetPrecisionMode.
    C'est peut être pas la meilleur des solutions, mais elle a l'air de marcher
    Code Pascal : 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
    procedure TFODP_Occupation.DATE_Change(Sender: TObject);
    var
      SavedRoundMode:     TFPURoundingMode;
      SavedPrecisionMode: TFPUPrecisionMode;
      DateDebut, DateFin: TDateTime;
      Interval:           Double;
    begin
      SavedRoundMode     := GetRoundMode();
      SetRoundMode(rmNearest);
      SavedPrecisionMode := GetPrecisionMode();
      SetPrecisionMode(pmDouble);
     
      DateDebut := DATE_DebutPrevu.Date + TIME_DebutPrevu.Time;
      DateFin   := DATE_FinPrevu.Date + TIME_FinPrevu.Time;
      Interval  := HourSpan(DateDebut, DateFin);
     
      TXT_DureePrevu.FloatValue := RoundTo(Interval, -6);
     
      SetRoundMode(SavedRoundMode);
      SetPrecisionMode(SavedPrecisionMode);
    end;

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par ILP Voir le message
    C'est peut être pas la meilleur des solutions, mais elle a l'air de marcher
    Oui, surtout que dans l'unité DateUtils il y a tout ce qu'il faut pour faire mumuse avec les dates et comme l'avait précisé plus haut BuzzLeclair, il y a la fonction HoursBetween
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  6. #6
    ILP
    ILP est déconnecté
    Membre confirmé
    Avatar de ILP
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2002
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 258
    Points : 610
    Points
    610
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Oui, surtout que dans l'unité DateUtils il y a tout ce qu'il faut pour faire mumuse avec les dates et comme l'avait précisé plus haut BuzzLeclair, il y a la fonction HoursBetween
    Bah, la fonction HoursBetween ne retourne qu'un entier et moi je voulais aussi avoir les fractions d'heures, par exemple s'il n'y a qu'une demie heure entre deux valeurs. C'est pour ça que la fonction HourSpan m'intéressait.

  7. #7
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    HourSpan renvois un double
    oups javais pas tout lu
    Akim Merabet

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Problème de soustraction toute simple entre deux heures
    Par voyel dans le forum VBA Access
    Réponses: 7
    Dernier message: 20/06/2011, 09h54
  2. problème différence entre deux heures
    Par gwenhael dans le forum Langage
    Réponses: 2
    Dernier message: 14/09/2006, 15h16
  3. [Dates] Calcul d'une différence entre deux heures
    Par loreleï85 dans le forum Langage
    Réponses: 12
    Dernier message: 28/06/2006, 11h43
  4. Problème de relation entre deux tables + autre chose
    Par Goth_sensei dans le forum Langage SQL
    Réponses: 7
    Dernier message: 30/03/2006, 20h49
  5. Problème de compatibilité entre deux scripts
    Par frutix dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/01/2006, 14h24

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