Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1741 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Lire un TDateTime (delphi)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Lire un TDateTime (delphi)

n°1484864
Inekman
Posté le 01-12-2006 à 12:07:46  profilanswer
 

Salut,
 
Je souhaite lire une valeur TDateTime (Delphi) se trouvant dans l'entête d'un fichier depuis un programme que je code en C. Cependant j'éprouve quelques difficultés sur la manière dont je dois m'y prendre.
 
En cherchant dans la doc, j'ai appris que ce type enregistre la date dans un "double" et que la valeur correspond au nombre de jours écoulés entre la date d'aujourd'hui et le 30 (ou 31)/12/1899.  
 
Je ne sais pas comment m'y prendre, avez-vous une idée ?
 
Merci.

mood
Publicité
Posté le 01-12-2006 à 12:07:46  profilanswer
 

n°1484917
Elmoricq
Modérateur
Posté le 01-12-2006 à 13:45:47  profilanswer
 

  • Solution 1 : se débrouiller pour que le programme delphi enregistre cette date de manière plus portable.


  • Solution 2, bricolage : récupérer la taille d'un double tel qu'il est compris par Delphi et tenter de l'interpréter comme ce langage (par contre je vois pas l'intérêt de stocker une date dans un double :??:)

n°1485210
Inekman
Posté le 01-12-2006 à 19:38:46  profilanswer
 

Elmoricq a écrit :

  • Solution 1 : se débrouiller pour que le programme delphi enregistre cette date de manière plus portable.


  • Solution 2, bricolage : récupérer la taille d'un double tel qu'il est compris par Delphi et tenter de l'interpréter comme ce langage (par contre je vois pas l'intérêt de stocker une date dans un double :??:)

Solution 1 : Je ne peux malheureusement plus toucher au programme Delphi, il est déjà "assez" répendu dans sa version actuelle et je pense que ça va être un gros merdier si une variante sort.
 
Solution 2 : C'est ce que j'ai commencé à faire. Le double tient sur 8 octets.
 
Quand je regarde dans un éditeur hexadécimal, la valeur d'aujourd'hui "01/12/2006" est comme suit : 80 11 E3 40. Mais bon, je capte vraiment pas comment on tombe là-dessus.
 
Extrait de la doc :
 

Delphi syntax:
 
type TDateTime = type Double;
 
Description
 
Most CLX objects represent date and time values using a TDateTime value. In Delphi, TDateTime is a type that maps to a Double. In C++, the TDateTime class corresponds to the Delphi TDateTime type.  
 
The integral part of a Delphi TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of the TDateTime value is fraction of a 24 hour day that has elapsed.  
 
Following are some examples of TDateTime values and their corresponding dates and times:
 
0 12/30/1899 12:00 am
2.75 1/1/1900 6:00 pm
-1.25 12/29/1899 6:00 am
35065 1/1/1996 12:00 am


Si vous avez une piste, n'hésitez pas. Merci :-)

n°1485236
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-12-2006 à 20:50:54  profilanswer
 

Inekman a écrit :

Solution 2 : C'est ce que j'ai commencé à faire. Le double tient sur 8 octets.

 

Quand je regarde dans un éditeur hexadécimal, la valeur d'aujourd'hui "01/12/2006" est comme suit : 80 11 E3 40.

[:arrakys]
Un peu de cohérence ne ferai pas de mal...


Message édité par Emmanuel Delahaye le 01-12-2006 à 20:51:34

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1485238
Inekman
Posté le 01-12-2006 à 21:15:59  profilanswer
 

Oui absolmument, j'ai oublié d'ajouter les 4 octets "00 00 00 00" qui se trouvent avant, ce qui donnent "00 00 00 00 80 11 E3 40".

n°1485245
videaste95
je ne sais rien !
Posté le 01-12-2006 à 21:51:51  profilanswer
 

Si tu le traite comme un double, ça se lit comme 39052,0. soit 3952 jours entiers et 0 fraction de 24 heures à compter du 31/12/1899 à 12 heures. l'avantage du double c'est de pouvoir faire des comparaisons et des différences de dates facilement.

n°1485246
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-12-2006 à 21:52:35  profilanswer
 

Inekman a écrit :

Oui absolmument, j'ai oublié d'ajouter les 4 octets "00 00 00 00" qui se trouvent avant, ce qui donnent "00 00 00 00 80 11 E3 40".


Est-ce que ca signifie 0x40E3118000000000  (LSB first, little endian), et si oui, quel est la définition du format des flottants en Delphi ?

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main (void)
  4. {
  5.    double x;
  6.    unsigned char b[] = { 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, 0xE3, 0x40 };
  7.    memcpy (&x, b, sizeof x);
  8.    printf ("sizeof x = %u. x =%f\n", (unsigned) sizeof x, x);
  9.    return 0;
  10. }

Je trouve bien


sizeof x = 8. x =39052.000000

 

Press ENTER to continue.


mais sans spec, je suis incapable de dire si c'est correct...


Message édité par Emmanuel Delahaye le 01-12-2006 à 21:58:54

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1485858
Elmoricq
Modérateur
Posté le 04-12-2006 à 09:26:54  profilanswer
 

videaste95 a écrit :

Si tu le traite comme un double, ça se lit comme 39052,0. soit 3952 jours entiers et 0 fraction de 24 heures à compter du 31/12/1899 à 12 heures. l'avantage du double c'est de pouvoir faire des comparaisons et des différences de dates facilement.


 
Merci pour l'explication [:romf]


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Lire un TDateTime (delphi)

 

Sujets relatifs
Lire des valeurs hexadecimales(negatives) dans un fichiercomment recuperer le username de la session windows avec delphi 7 !,
Lire un XML (tag spécifique) avec javaVB.net Prob lire première ligne de mon fichier avec mon progr
[RESOLU] Ordre d'execution a la creation dune form ?[résolu...enfin presq]Choix multiple pour une propriété de type string
[delphi]Supprimer un compsant lors d'un evenementscript pour lire une vidéo
installer composants dans delphi[Résolu] Question Poo en delphi
Plus de sujets relatifs à : Lire un TDateTime (delphi)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR