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

Delphi Discussion :

Soustraction entre deux dates


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut Soustraction entre deux dates
    Bonjour;

    J'ai deux TDateTime et je souhaiterai calculer le temps écoulé entre ces deux date en nombre de jour:
    j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        date1, date2, date3 : TDateTime;
        date3 := date2-date1;
    si j'ai date1= 14/02/2007
    et date2= 15/02/2007
    je m'attend à avoir: date3 = 1
    mais j'ai: date3=11/05/1899 -> super le retour dans le passé

    Comment dois je m'y prendre

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    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 236
    Par défaut
    Dans l'unité DateUtils tu as des fonctions pour le traitement des dates/heures et une t'interessera DaysBetween
    Modérateur Delphi

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

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,

    Erreur classique, Ô combien !

    Une différence de date n'est pas une date, mais une durée.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut Format des minutes 'mm' changé pour 'nn'!
    +1 thewho

    Losrqu'on parle d'une durée, d'une distance où même d'une température,
    on a toujours une unité qui vient avec...(Minutes, seconde, heure, jours)

    Ce qu'il faut savoir, une TDatetime dans un PC est représenté par
    un chiffre d'on l'entier représente les jours depuis une année de référence,
    et la partie décimale représente les heures,minutes,seconde,miliseconde... autrement dit... des fractions de jours depuis cette même date.

    Donc lorsqu'on soustrait 2 dates, on se retrouve avec une durée.
    La partie entière de cette soustraction représente des jours
    et la partie décimale représente encore des fractions de jours.

    Si on veut simplement savoir le nombre de jour entre 2 date il suffit
    donc de les soustraires, et extraire la partie entière du résultat.
    (Attention de ne pas arrondire car 1.5 ne veux pas dire 2 jours)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    date1, date2: TDateTime;//Date
    DiffDay:integer; //date3 c'est une durée!
     
    DiffDay:=trunc(Date2-Date1) //donne le nombre de jours entre les 2 dates.
    Dans des cas de traitement long... ou simplement pour afficher
    ca fait combien de temps une application fonctionne...
    voici une petite fonction qui retourne la meilleur représentation possible
    pour nous les Humains d'une durée de temps.

    Je m'en sert pour toute sorte de chose...


    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
     
    //==============================================================================
    //==  Helper function to display elipsed time correctly for humain. 
    //==============================================================================
    function TimePassToStr(ElipsedTime: extended): string;
    resourcestring
      strMinSize = '0 second';
      strSec = 'ss';
      strMin = 'nn:ss';
      strHrs = 'hh:nn:ss';
      strSecUnit=' sec.';
      strMinUnit=' min.';
      strHrsUnit=' hrs';
      strDayUnit= ' Day(s) ';
    const
      cstIntFmt='0';
      cstDemiSec=(1/(60*60*24))/2;
      cstOneSec = (1/(60*60*24))-cstDemiSec;
      cstOneMin = (1/(60*24))-cstDemiSec;
      cstOneHour = (1/24)-cstDemiSec;
      cstOneday = (1)-cstDemiSec;
    begin
      Result := strMinSize;
      if (ElipsedTime <= 0) then
        Exit;
      if (ElipsedTime < cstOneMin) then
      begin
        //Plus petit qu'une minutes, affiche des secondes
        Result := FormatDateTime(strSec,ElipsedTime)+strSecUnit;
        Exit;
      end;
      if (ElipsedTime < cstOneHour) then
      begin
        //Plus petit qu'une Heure, affiche des Minutes + secondes
        Result := FormatDateTime(strMin,ElipsedTime)+strMinUnit;
        Exit;
      end;
      if (ElipsedTime < cstOneday) then
      begin
        //Plus petit qu'une Journée, affiche des Heures+Minutes + secondes
        Result := FormatDateTime(strHrs,ElipsedTime)+strHrsUnit;
        Exit;
      end;
      //        Nbr de jour + Heures+Minutes + secondes
      Result := IntToStr(trunc(ElipsedTime))+strDayUnit+FormatDateTime(strHrs,ElipsedTime);
    end;
    Pour faire un test rapide de cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TfrmMain.Button1Click(Sender: TObject);
    var
        Start:TDateTime;
        Stop:TDateTime;
        Diff:extended;
    begin
        Start:=Now();
        sleep(5000);
        Stop:=Now();
        Diff:=Stop-Start;
        Button1.Caption:=TimePassToStr(Diff);
    end;
    Voilà j'espère que tout est conforme.
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  5. #5
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Belle explication Eric, chapeau

  6. #6
    Membre éclairé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Par défaut
    Salut
    Pour compléter les réponses de thewho et Eric Boisvert, je dirais que pour calculer le nombre de jours entre 2 dates, je ferais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      date1, date2: TDateTime;
      diffnbjours: integer;
    begin
      diffnbjours :=trunc(date2-date1);
    end;
    Le trunc sert à éliminer la partie décimale pour ne garder que la partie entière (donc le nombre de jours), sans quoi tu aurais une erreur à la compile de types incompatibles, la différence entre 2 TDateTime étant un extended...

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    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 236
    Par défaut
    La même chose qu'Eric mais en plus cours

    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
     
    procedure TfrmMain.Button1Click(Sender: TObject);
    var
        Start:TDateTime;
        Stop:TDateTime;
        iDays,iHours,iMinutes,iSecondes : integer;
    begin
        Start:=Now();
        sleep(5000);
        Stop:=Now();
        iDays := DaysBetween(Start,Stop) ;
        iHours := HoursBetWeen(Start,Stop) - (iDays * 24);
        iMinutes := MinutesBetWeen(Start,Stop) - (iDays* 24 * 60) - (iHours * 60);
        iSecondes := SecondesBetween(Start,Stop) - (iDays * 24 * 3600) - (iHours * 3600) - (iMinutes * 60);
        Button1.Caption:= Format('%2d Jours %2dH %2dMn %2ds',[iDays, iHours,iMinutes,iSecondes]);
    end;
    Sauf erreur de ma part avec le Format

    [edit] oups grosse correction ^^[/edit]
    Modérateur Delphi

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

  8. #8
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
      date1, date2: TDateTime;
     d:single;
      diffnbjours: integer;
    begin
      d :=date2-date1;
      diffnbjours :=trunc(d);
      if diffnbjours>d then diffnbjours:=diffnbjours-1;
    end;
    sauf erreur

  9. #9
    Membre confirmé Avatar de Morfus
    Inscrit en
    Novembre 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 93
    Par défaut
    Utilise la fonction DaysBetween qui se trouve dans l'unité DateUtils

Discussions similaires

  1. Effectue une soustraction entre deux dates
    Par messi1987 dans le forum Développement
    Réponses: 2
    Dernier message: 05/03/2015, 14h22
  2. [VxiR2] Soustraction (ou différence) entre deux dates
    Par Goodby3 dans le forum Webi
    Réponses: 19
    Dernier message: 22/06/2012, 16h48
  3. soustraction entre deux dates
    Par viny dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/12/2009, 16h37
  4. soustraction entre deux dates en java
    Par zekabyle dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 12/04/2007, 12h12
  5. Soustraction entre deux dates
    Par franculo_caoulene dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 20/01/2006, 10h59

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