[C] - Convertir un timestamp en date

- Convertir un timestamp en date [C] - C - Programmation

Marsh Posté le 17-09-2005 à 17:14:17    

bonjour,
 
je suis arrrivé à convertir une date (juste jour, mois, date) avec la fonction mktime, j'obtiens un nombre negatif pour  17 09 05, est ce normal ? -2026253361
 
je n'arrive pas a faire la conversion inverse, quelle fonction faut il utiliser ? vous avez un exemple ?

Reply

Marsh Posté le 17-09-2005 à 17:14:17   

Reply

Marsh Posté le 17-09-2005 à 17:16:22    

dam1330 a écrit :

je suis arrrivé à convertir une date (juste jour, mois, date) avec la fonction mktime, j'obtiens un nombre negatif pour  17 09 05, est ce normal ? -2026253361
 
je n'arrive pas a faire la conversion inverse, quelle fonction faut il utiliser ? vous avez un exemple ?


Montre le code, ma machine à lire dans les pensées est en révision...


---------------
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/
Reply

Marsh Posté le 17-09-2005 à 17:24:22    

Code :
  1. void ajouter_message (TMESSAGE * tabmes, int * nbmes)
  2. {
  3. struct tm temps, tps;
  4. int choix;
  5. int dayd,moisd,anneed,dayf,moisf,anneef;
  6. time_t datedebut, datefin;
  7. //printf("nbmes dans ajouter %d ::::::: \n",*nbmes);
  8. do
  9. {
  10.  puts("Insérez la date de début du  message :" );
  11.  puts("Jour du début :" );
  12.  scanf("%d",&dayd);
  13.  puts("Mois du début :" );
  14.  scanf("%d",&moisd);
  15.  puts("Année du début :" );
  16.  scanf("%d",&anneed);
  17.  init_temps(&tps, dayd,moisd, anneed);
  18.  datedebut = mktime(&tps);
  19.  tabmes[*nbmes].jourd = datedebut;
  20.  puts("Insérez la date de fin du  message :" );
  21.  puts("Jour de fin :" );
  22.  scanf("%d",&dayf);
  23.  puts("Mois de fin :" );
  24.  scanf("%d",&moisf);
  25.  puts("Année de fin :" );
  26.  scanf("%d",&anneef);
  27.  init_temps(&tps, dayf,moisf, anneef);
  28.  datefin = mktime(&tps);
  29.  tabmes[*nbmes].jourf = datefin;
  30.  puts("Insérez votre message :" );
  31.   scanf("%s",tabmes[*nbmes].chaine);
  32.  puts("voulez vous faire un nouvel ajout ?" );
  33.  scanf("%d",&choix);
  34.  *nbmes=*nbmes+1;
  35. }
  36. while(choix != 0);


 
 
je recupere le jour, le mois et l'annee
 

Code :
  1. void init_temps(struct tm *temps, int jour, int mois, int annee)
  2. {
  3.  
  4. temps->tm_sec=0;;
  5. temps->tm_min=0;
  6. temps->tm_hour=0;
  7. temps->tm_mday= jour;
  8. temps->tm_mon= mois;
  9. temps->tm_year=annee;
  10. temps->tm_isdst=-1;
  11. }


 

Reply

Marsh Posté le 17-09-2005 à 18:20:03    


On pourait avoir la version qui compile...


main.c:5: error: syntax error before '*' token
 
main.c:6: warning: function declaration isn't a prototype
main.c: In function `ajouter_message':
main.c:7: error: storage size of 'temps' isn't known
main.c:7: error: storage size of 'tps' isn't known
main.c:11: error: `time_t' undeclared (first use in this function)
main.c:11: error: (Each undeclared identifier is reported only once
main.c:11: error: for each function it appears in.)
main.c:11: error: syntax error before "datedebut"
main.c:18: error: implicit declaration of function `puts'
main.c:18: warning: nested extern declaration of `puts'
<internal>:0: warning: redundant redeclaration of 'puts'
main.c:20: error: implicit declaration of function `scanf'
main.c:20: warning: nested extern declaration of `scanf'
<internal>:0: warning: redundant redeclaration of 'scanf'
main.c:25: error: implicit declaration of function `init_temps'
main.c:25: warning: nested extern declaration of `init_temps'
main.c:26: error: `datedebut' undeclared (first use in this function)
main.c:26: error: implicit declaration of function `mktime'
main.c:26: warning: nested extern declaration of `mktime'
main.c:27: error: `tabmes' undeclared (first use in this function)
 
main.c:27: error: `nbmes' undeclared (first use in this function)
main.c:38: error: `datefin' undeclared (first use in this function)
main.c:53: warning: declaration of 'temps' shadows a previous local
main.c:7: warning: shadowed declaration is here
main.c:54: warning: no previous prototype for 'init_temps'
main.c: In function `init_temps':
main.c:56: error: dereferencing pointer to incomplete type
main.c:57: error: dereferencing pointer to incomplete type
main.c:58: error: dereferencing pointer to incomplete type
main.c:59: error: dereferencing pointer to incomplete type
main.c:60: error: dereferencing pointer to incomplete type
main.c:61: error: dereferencing pointer to incomplete type
main.c:62: error: dereferencing pointer to incomplete type
 
main.c: In function `ajouter_message':
 
main.c:63: error: syntax error at end of input
 
main.c:7: warning: unused variable `temps'
main.c:7: warning: unused variable `tps'


---------------
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/
Reply

Marsh Posté le 17-09-2005 à 18:32:01    

oula tu veux tout ?
 
http://dam1330.free.fr/message.tar
 
j'ai fait un script pour compiler, j'arrive pas a faire les makefile...
oui = 1, non = 0 pour les menu
 
je voudrais donc enregistrer mes dates au format timestamp dans mon fichier

Message cité 1 fois
Message édité par dam1330 le 17-09-2005 à 18:56:52
Reply

Marsh Posté le 17-09-2005 à 18:40:09    


En principe on poste une version réduite au minimum mais compilable qui montre le problème...
(C'est d'ailleurs une technique de déboguage bien connue).
 
Bon Il y a un problème avec la fonction d'init. Comme l'indique la doc du C, les mois vont de 0 à 11 et les années commencent à 1900 :


   temps->tm_mon = mois - 1;
   temps->tm_year = annee - 1900;


Met déjà ça au point...
 
Les entrées sont fragiles.  
 
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers
 
J'ai définitivement reglé le problème comme çà :  
(code manquant ici : http://mapage.noos.fr/emdel/clib.htm)


#include <time.h>
#include <stdio.h>
 
#include "ed/inc/io.h"
 
typedef struct
{
   time_t jourd;
   time_t jourf;
   char chaine[64];
}
TMESSAGE;
 
static void init_temps (struct tm *temps, int jour, int mois, int annee)
{
   temps->tm_sec = 0;;
   temps->tm_min = 0;
   temps->tm_hour = 0;
   temps->tm_mday = jour;
   temps->tm_mon = mois - 1;
   temps->tm_year = annee -1900;
   temps->tm_isdst = -1;
}
 
static void ajouter_message (TMESSAGE * tabmes, int *nbmes, int nbmax)
{
   struct tm tps = {0};
 
   int choix;
   int dayd, moisd, anneed, dayf, moisf, anneef;
   time_t datedebut, datefin;
 
   do
   {
      long n;
 
      puts ("Insérez la date de début du  message :" );
      puts ("Jour du début :" );
      get_l (&n);
      dayd = (int) n;
 
      puts ("Mois du début :" );
      get_l (&n);
      moisd =(int)  n;
 
      puts ("Année du début :" );
      get_l (&n);
      anneed = (int) n;
 
      init_temps (&tps, dayd, moisd, anneed);
      datedebut = mktime (&tps);
       
      tabmes[*nbmes].jourd = datedebut;
 
      puts ("Insérez la date de fin du  message :" );
      puts ("Jour de fin :" );
      get_l (&n);
      dayf=(int) n;
       
      puts ("Mois de fin :" );
      get_l (&n);
                    moisf=(int) n;
                     
      puts ("Année de fin :" );
      get_l (&n);
      anneef=(int) n;
 
      init_temps (&tps, dayf, moisf, anneef);
      datefin = mktime (&tps);
      tabmes[*nbmes].jourf = datefin;
 
      puts ("Insérez votre message :" );
      get_s (tabmes[*nbmes].chaine, sizeof tabmes[*nbmes].chaine);
 
      puts ("voulez vous faire un nouvel ajout ?" );
      get_l (&n);
      choix=(int)n;
       
      *nbmes = *nbmes + 1;
   }
   while (choix != 0 && *nbmes < nbmax);
}
 
int main (void)
{
   TMESSAGE tabmes[10];
   int nbmes = 0;
 
   ajouter_message (tabmes, &nbmes, 10);
   return 0;
}


Message édité par Emmanuel Delahaye le 17-09-2005 à 19:22:24

---------------
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/
Reply

Marsh Posté le 17-09-2005 à 19:37:31    

je n'arrive pas a compiler:
 
fou.c:91:3: warning: no newline at end of file
/tmp/ccALt7nZ.o: dans la fonction « ajouter_message »:
fou.c:(.text+0x90): référence indéfinie vers « get_l »
fou.c:(.text+0xb5): référence indéfinie vers « get_l »
fou.c:(.text+0xda): référence indéfinie vers « get_l »
fou.c:(.text+0x151): référence indéfinie vers « get_l »
fou.c:(.text+0x176): référence indéfinie vers « get_l »
/tmp/ccALt7nZ.o:fou.c:(.text+0x19b): encore plus de références indéfinies suivent vers « get_l »
/tmp/ccALt7nZ.o: dans la fonction « ajouter_message »:
fou.c:(.text+0x219): référence indéfinie vers « get_s »
fou.c:(.text+0x238): référence indéfinie vers « get_l »
collect2: ld returned 1 exit status
make: *** [fou] Erreur 1
damien@shuttle:~/message$  

Reply

Marsh Posté le 17-09-2005 à 19:43:39    

comme il te l'a indiqué :
va sur :
http://mapage.noos.fr/emdel/clib.htm
puis télécharge les différents fichiers pour les mettre en ed/inc/

Reply

Marsh Posté le 17-09-2005 à 19:50:41    

dam1330 a écrit :

je n'arrive pas a compiler:


Normal, j'ai indiqué où était le code manquant. Mais l'essentiel est d'avoir compris ce qui est dit dans les deux liens que je t'ai indiqué :  
 
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers


---------------
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/
Reply

Marsh Posté le 17-09-2005 à 21:25:57    

merci beaucoup de m'avoir aidé, ca fonctionne bien.
 
 
void init_temps(struct tm *temps, int jour, int mois, int annee)
{
 temps->tm_sec=0;              /* secondes (0,59) */
 temps->tm_min=0;              /* minutes (0,59) */
 temps->tm_hour=0;             /* heures depuis minuit (0,23) */
 temps->tm_mday= jour+1;      /* jour du mois (0,31) */
 temps->tm_mon= mois-1;       /* mois depuis janvier (0,11) */
 temps->tm_year=annee-1900;    /* mois depuis janvier (0,11) */
 temps->tm_wday=0;             /* année depuis 1900 */
 temps->tm_yday=0;             /* jour depuis le 1 janvier (0,365) */
 temps->tm_isdst=+1;           /*negatif si pas dispo*/  
}

Message cité 1 fois
Message édité par dam1330 le 17-09-2005 à 21:40:56
Reply

Marsh Posté le 17-09-2005 à 21:25:57   

Reply

Marsh Posté le 17-09-2005 à 23:17:07    

dam1330 a écrit :


 temps->tm_mday= jour+1;      /* jour du mois (0,31) */


Il ne faut pas inventer n'importe quoi. Il faut lire la doc :
 
http://www.linux-france.org/articl [...] ime-3.html

Citation :


       tm_mday
              Le quantième du mois, dans l'intervalle 1 à 31.


 
D'autres commentaires sont faux :  

Citation :


temps->tm_year=annee-1900;    /* mois depuis janvier (0,11) */
 temps->tm_wday=0;             /* année depuis 1900 */



Message édité par Emmanuel Delahaye le 17-09-2005 à 23:19:35

---------------
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/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed