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 :

Conversion de TDateTime en chaîne


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 114
    Points : 70
    Points
    70
    Par défaut Conversion de TDateTime en chaîne
    Bonjour,

    J’essaie de faire une conversion d'un TDateTime en String et conversion du String en TDateTime, mais je ne retombe pas sur mes pattes.
    Voici mon test

    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
     
    procedure Test;
    var
      DateTime1: TDateTime;
      DateTime2: TDateTime;
      StringDate: string;
      st: string;
      FormatSettings1: TFormatSettings;
    begin
      GetLocaleFormatSettings(GetUserDefaultLCID, FormatSettings1);
      DateTime1 := Now;
      StringDate2 := DateTimeToStr(DateTime1, FormatSettings1);
      DateTime2 := StrToDateTime(StringDate2, FormatSettings1);
     
      if (DateTime1 = DateTime2) then
        st := 'pareil'
      else
        st := 'different';
    end;
    DateTime1 et DateTime2 sont différents.
    Je ne vois pas d'où vient le problème.
    Merci de votre aide

  2. #2
    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 Bon sang ! mais c'est bien sur :)
    La conversion en string tronque les millisecondes qui sont réintroduites à la convenance de ton programme dans la conversion inverse

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 114
    Points : 70
    Points
    70
    Par défaut
    J'ai fait une essai en ajoutant les millisecondes, problème identique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      StringDate2 := FormatDateTime('mm/dd/yy hh:nn:ss:zzz', DateTime1);

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 114
    Points : 70
    Points
    70
    Par défaut
    idem même avec la correction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      StringDate2 := FormatDateTime('dd/mm/yyyy hh:nn:ss:zzz', DateTime1);

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 114
    Points : 70
    Points
    70
    Par défaut
    En fait c'est le StrToDateTime qui tronque les millisecondes.
    Si à partir de mon exemple, je reconvertis DateTime2 en String, les millisecondes ont disparu.

  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 Ceci dit
    Ceci dit, si tu as besoin de précision dans la gestion du temps, il y a des solutions en fonction du problème posé.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Salut

    En passant c’est peut-être un problème tout bête d'approximation d'un nombre numérique.. Tu sais dans les cours informatiques ou on demande aux étudiants d'additionner un millionième un million de fois et oups ça ne donne pas un.

    Tu fais la même chose : tu arrondis au milliseconde ensuite surprise ce n'est plus le même nombre

    Fais showmessage(floattostr(DateTime1-DateTime2));

    Tu verras la différences...

    Essaie maintenant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      DateTime1 := Now;
      StringDate2 := DateTimeToStr(DateTime1, FormatSettings1);
      DateTime2 := StrToDateTime(StringDate2, FormatSettings1);
      StringDate3 := DateTimeToStr(DateTime2, FormatSettings1);
      DateTime3 := StrToDateTime(StringDate3, FormatSettings1);
      if (DateTime2 = DateTime3) then
        st := 'pareil'
      else
        st := 'different';
    end;
    Si différent alors chaque fonction induisent une erreur.
    Si égale alors une seule fonction induit une erreur.

    Donc si la dixième de milliseconde est critique. Conserve l'entier provenant de la date multipliée par 1000milisecondes*60secondes*60minutes*24heures (soit 86400000) et tu arrondis a l'entier le plus près... Puis tu divises par 86400000 avant chaque affichage.

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 114
    Points : 70
    Points
    70
    Par défaut
    Merci de vos réponses, mais il suffit que je retire les millisecondes pour résoudre mon problèmes.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Peut-être

    Si une fois sur deux la conversion est fausse dans ton problème originale.

    Avec ta solution, il devrait y avoir statistiquement si je ne m'abuse, une erreur par 5000 conversions.

    Si cette tolérance te convient, ou si ton application n'est pas critique : no problemo.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/07/2009, 14h35
  2. Réponses: 7
    Dernier message: 16/02/2009, 22h20
  3. Problème de conversion d'un type chaîne en type double
    Par Antonin08 dans le forum Windows
    Réponses: 5
    Dernier message: 17/10/2008, 14h17
  4. Erreur conversion valeur datetime à partir chaîne de caractères
    Par goullater dans le forum Développement
    Réponses: 1
    Dernier message: 16/04/2008, 14h55
  5. [SQL Access] Conversion d'entier en chaîne
    Par Neilos dans le forum Access
    Réponses: 2
    Dernier message: 17/06/2005, 10h58

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