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 :

Comparaison de dates : le retour est faux


Sujet :

Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut Comparaison de dates : le retour est faux
    Bonsoir à tous

    Lorsque je compare deux dates de dernier accès en écriture à deux fichiers avec cette routine, ça fonctionne nickel. Y compris sur de très légères différences (quelques minutes, voire moins) :

    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
     
    procedure TForm1.Btn_1Click(Sender: TObject);
    Var   Date_F_Source, Date_F_Dest : TDateTime;
          F_Source, F_Dest : string;
     
    begin
          F_Source := 'Unit1.dfm';  // Même jour que F_Dest, l'EXE "fraîchement" recompilé
          Date_F_Source := TimeModificationFichier(F_Source);
          Form1.Lab_Aff_F_Source.Caption := F_Source;
          Form1.Lab_Aff_Date_F_Source.Caption := DateToStr(Date_F_Source);
     
          F_Dest := 'Project1.exe';
          Date_F_Dest := TimeModificationFichier(F_Dest);
          Form1.Lab_Aff_Date_F_Dest.Caption := DateToStr(Date_F_Dest);
          Form1.Lab_Aff_F_Dest.Caption := F_Dest;
     
          if Date_F_Source > Date_F_Dest then
            begin
                Form1.StatusBar.Panels[0].Text := 'Date ' + UpperCase(F_Source) +' (' +DateToStr(Date_F_Source) + ') SUPERIEURE à ' + DateToStr(Date_F_Dest) +' ' + UpperCase(F_Dest) ;
            end
          Else
            begin
                Form1.StatusBar.Panels[0].Text := 'Date ' + UpperCase(F_Source) +' (' +DateToStr(Date_F_Source) + ') INFERIEURE à ' + DateToStr(Date_F_Dest) +' ' + UpperCase(F_Dest);
            end;
    end;
    Les dates des fichiers sont initialisées comme ceci :
    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
     
    Function TimeModificationFichier(fichier: string): TDateTime; //  Routine empruntée à M. Bardou
     
    {===========================================================================}
    { fonction renvoyant la date et heure de la dernière modification du fichier}
    {===========================================================================}
     
    var SearchRec : TSearchRec;
        Resultat : longint;
     
    begin
      Result:=0;
     
      Resultat:=FindFirst(fichier, FaAnyFile, SearchRec);
     
      if Resultat = 0 then Result := FileDateToDateTime(SearchRec.Time); // FileDateToDateTime transforme une date de type dos en format TDateTime
     
      FindClose(SearchRec);
    end;
    Là, par contre, le résultat de la comparaison est faux :

    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
     
    Function F_Source_Plus_Recent_Que_F_Dest(Date_F_Source, Date_F_Dest : TDateTime) : boolean;
    Var   Val_Retour : boolean;
     
    begin
        Val_Retour := False; // Par défaut, on considère que la date du F_Source n'est PAS PLUS RECENTE
        // Si date inférieur, alors date ANTERIEURE
     
        if Date_F_Source = Date_F_Dest then
          begin
              F_Source_Plus_Recent_Que_F_Dest := Val_Retour;
              Exit;
          end;
     
        if Date_F_Source < Date_F_Dest then
          begin
              F_Source_Plus_Recent_Que_F_Dest := Val_Retour;
              Exit;
          end;
     
        if Date_F_Source > Date_F_Dest then
          begin
              Val_Retour := TRue;
              F_Source_Plus_Recent_Que_F_Dest := Val_Retour;
          end;
    end;
    Pourtant, leurs dates sont initialisées avec la même routine TimeModificationFichier().

    Comprends pas. Ca devrait me sauter aux yeux, je le sens. Mais je ne vois rien. Ca vous parle ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    CompareDate de l'unité DateUtils ne conviendrait-il pas mieux pour comparer 2 TDateTime ?

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Bonsoir.

    Je vais le refaire avec CompareDate, mais je l'ai déjà fait et ça ne marchait pas comme je le voulais. J'ai trouvé ici-même cette idée de comparer deux TDateTime avec les opérateurs < et > ...

    Je donne le retour

  4. #4
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par bvsud Voir le message
    Bonsoir.

    Je vais le refaire avec CompareDate, mais je l'ai déjà fait et ça ne marchait pas comme je le voulais. J'ai trouvé ici-même cette idée de comparer deux TDateTime avec les opérateurs < et > ...

    Je donne le retour
    Le source de la fonction 'FileDateToDateTime' dans l'unité SysUtils te donne la structure du nombre entier qui décrit le format date-heure de l'age du fichier. Tu peux donc directement comparer le deux SearchRec.Time.

    Optimisation1 de la fonction Function F_Source_Plus_Recent_Que_F_Dest
    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
     
    Var
      Val_Retour: boolean;
     
    begin
      if Date_F_Source = Date_F_Dest then
      begin
        F_Source_Plus_Recent_Que_F_Dest := false;
        Exit;
      end;
     
      if Date_F_Source < Date_F_Dest then
      begin
        F_Source_Plus_Recent_Que_F_Dest := false;
        Exit;
      end;
     
      if Date_F_Source > Date_F_Dest then
      begin
        F_Source_Plus_Recent_Que_F_Dest := true;
      end;
    end;
    Optimisation2 de cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      if (Date_F_Source = Date_F_Dest) or (Date_F_Source < Date_F_Dest) then
      begin
        F_Source_Plus_Recent_Que_F_Dest := false;
        Exit;
      end;
      if Date_F_Source > Date_F_Dest then
        F_Source_Plus_Recent_Que_F_Dest := true;
    Optimisation3 de cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      if (Date_F_Source <= Date_F_Dest) then
      begin
        F_Source_Plus_Recent_Que_F_Dest := false;
        Exit;
      end;
      if Date_F_Source > Date_F_Dest then
        F_Source_Plus_Recent_Que_F_Dest := true;
    Et enfin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        F_Source_Plus_Recent_Que_F_Dest := Date_F_Source > Date_F_Dest

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    je me permets de contester (un peu). On ne compare pas les dates ainsi. Dans certains cas, cela peut(?) fonctionner (? car je ne sais pas puisque je ne pratique pas ainsi). Je vous conseille d'essayer une comparaison directe avec des fichiers (rapatriés) ou placés sur un serveur FTP (en général Linux) où les problèmes de synchronisation sont très usuels. S'il y a une unité DatetUtils, on peut penser qu'il y a une raison et qu'elle est spécialisée. Je préconise son utilisation et ses méthodes... à moins qu'elle ne soit obsolète évidemment.

    Evidemment, on peut considérer que si cela marche, c'est "bon"...
    Dernière modification par Invité ; 08/07/2015 à 08h36.

  6. #6
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par selzig Voir le message
    Bonjour,

    je me permets de contester (un peu). On ne compare pas les dates ainsi. Dans certains cas, cela peut(?) fonctionner (? car je ne sais pas puisque je ne pratique pas ainsi). Je vous conseille d'essayer une comparaison directe avec des fichiers (rapatriés) ou placés sur un serveur FTP (en général Linux) où les problèmes de synchronisation sont très usuels. S'il y a une unité DatetUtils, on peut penser qu'il y a une raison et qu'elle est spécialisée. Je préconise son utilisation et ses méthodes... à moins qu'elle ne soit obsolète évidemment.

    Evidemment, on peut considérer que si cela marche, c'est "bon"...
    Bonjour, la solution proposée fonctionne effectivement dans l'univers MS-Windows.
    Pour être multi OS j'aurai tendance à utiliser une fonction ressemblant à cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function TempsModificationFichier(fichier: string): Integer ;
    var
      SR: TSearchRec;
      D1 : TDateTime ;
    begin
      Result := 0;
      if FindFirst(fichier, FaAnyFile, SR) = 0 then
      begin
        D1 := FileDateToDateTime(SR.Time);
        Result := floor (D1 * 24 * 60 * 60) ; // uses math
      end;
      FindClose(SR);
    end;

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il est vrai que je fonctionne en permanence en multi-OS. Et je préfère utiliser les méthodes les plus portables (notamment en Lazarus autrefois, et avec Qt maintenant). Je me souviens avoir rencontré de gros problèmes de gestion des DateTime en Lazarus... effectivement en fonction des OS clients à "l'attaque" de serveurs FTP hébergés Nux et locaux Win. Cela évite les problèmes inexpliqués que l'on n'imagine même pas d'ailleurs... avant de les avoir rencontrés.

    Mais d'une manière générale, les comparaisons méritent toujours une attention particulière même si leur principe paraît simple.

    Bonne journée.

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    Le source de la fonction 'FileDateToDateTime' dans l'unité SysUtils te donne la structure du nombre entier qui décrit le format date-heure de l'age du fichier. Tu peux donc directement comparer le deux SearchRec.Time.

    Optimisation1 de la fonction Function F_Source_Plus_Recent_Que_F_Dest
    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
     
    Var
      Val_Retour: boolean;
     
    begin
      if Date_F_Source = Date_F_Dest then
      begin
        F_Source_Plus_Recent_Que_F_Dest := false;
        Exit;
      end;
     
      if Date_F_Source < Date_F_Dest then
      begin
        F_Source_Plus_Recent_Que_F_Dest := false;
        Exit;
      end;
     
      if Date_F_Source > Date_F_Dest then
      begin
        F_Source_Plus_Recent_Que_F_Dest := true;
      end;
    end;
    Optimisation2 de cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      if (Date_F_Source = Date_F_Dest) or (Date_F_Source < Date_F_Dest) then
      begin
        F_Source_Plus_Recent_Que_F_Dest := false;
        Exit;
      end;
      if Date_F_Source > Date_F_Dest then
        F_Source_Plus_Recent_Que_F_Dest := true;
    Optimisation3 de cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      if (Date_F_Source <= Date_F_Dest) then
      begin
        F_Source_Plus_Recent_Que_F_Dest := false;
        Exit;
      end;
      if Date_F_Source > Date_F_Dest then
        F_Source_Plus_Recent_Que_F_Dest := true;
    Et enfin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        F_Source_Plus_Recent_Que_F_Dest := Date_F_Source > Date_F_Dest
    Bonjour.

    J'ai reprise cette optimisation, et elle marche :
    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
     
    Function F_Source_Plus_Recent_Que_F_Dest (Date_F_Source : TDateTime; Date_F_Dest : TDateTime) : boolean;
    Var
      Val_Retour: boolean;
     
    begin
     
      if Date_F_Source = Date_F_Dest then
      begin
        F_Source_Plus_Recent_Que_F_Dest := false;
        Exit;
      end;
     
      if Date_F_Source < Date_F_Dest then
      begin
        F_Source_Plus_Recent_Que_F_Dest := false;
        Exit;
      end;
     
      if Date_F_Source > Date_F_Dest then
      begin
        F_Source_Plus_Recent_Que_F_Dest := true;
      end;
    end;
    Elle marche sur deux fichiers précis . Et encore dans les mêmes répertoires que j'utilise. Merci pour l'info

    Donc, pas de doute. C'est donc ailleurs que je dois encore dénicher un bug.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/03/2012, 17h53
  2. [XL-2002] Comparaison de dates si cellule de référence est vide
    Par Domi2 dans le forum Excel
    Réponses: 6
    Dernier message: 24/09/2009, 12h12
  3. comparaison de date
    Par nickoshiba dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 15/03/2005, 15h48
  4. Comparaison de dates
    Par Tapioca dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/06/2004, 15h55
  5. Problème de comparaison de dates
    Par MiJack dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/03/2004, 21h43

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