Petits calculs sur le temps

Petits calculs sur le temps - C++ - Programmation

Marsh Posté le 06-12-2016 à 10:40:38    

Salut tout le monde   :)  
 
Je fais un autre petit programme, en parrallèle, pour m'entrainer.
 
Ce programme prend une date entrée par l'utilisateur et donne son âge en secondes, ou minutes, etc par exemple pour qq'un de 40 ans ca fait dans les 14 000 jours
 
Il fonctionne bien, sauf que si on entre une date égale ou inférieur au 1-12-1969 eh bien ça ne marche plus, le programme sort des zeros partout.
 
Voici ma fonction méthode qui récupère la date sur l'ordi et calcul la différence en secondes.  Je l'ai trouvé ici :  http://www.cplusplus.com/reference/ctime/time/
 
Et je l'ai adaptée :
 

Code :
  1. int Birthday::getDate()
  2. {
  3.     time_t timer;
  4.     struct tm y2k = {0};
  5.     y2k.tm_hour = 0;   y2k.tm_min = 0; y2k.tm_sec = 0;
  6.     y2k.tm_year = year-1900; y2k.tm_mon = month; y2k.tm_mday = day;
  7.     time (&timer);  // get current time; same as: timer = time(NULL)
  8.     seconds = difftime(timer, mktime (&y2k));
  9.     return seconds;
  10. }


Merci pour votre aide !


Message édité par Lt Ripley le 06-12-2016 à 11:15:52
Reply

Marsh Posté le 06-12-2016 à 10:40:38   

Reply

Marsh Posté le 06-12-2016 à 11:10:31    

Bonjour !  
 
C'est normal, la fonction time() a comme "temps 0" le 01/01/1970 (EPOCH d'UNIX), à 0h00, et renvoie le nombre de secondes depuis ce moment-là.
 
Les autres fonctions d'UNIX sont basées sur la même référence de temps (notamment mktime).
 
Il n'est donc pas surprenant que leur fonctionnement ne soit pas correct pour des dates antérieures.
 
Bonne continuation !
 
Edit : Le fait que vous ne rencontriez le problème qu'à partir du 01/12/1969 me fait pensez que vous remplissez "mal" le champ "mois" de la structure tm, qui doit être entre 0 et 11 (alors que le jour est entre 1 et 31 :) ). Comme la fonction modifie les valeurs, le transforme le 01/12 et 01/01 de l'année d'après, ce qui correspond au T0.

Message cité 1 fois
Message édité par Farian le 06-12-2016 à 11:18:27

---------------
On n'est jamais très fort pour ce calcul !
Reply

Marsh Posté le 06-12-2016 à 11:26:51    

Merci pour ces infos  :)  
 
Je me demande si je vais pas tout calculer à la mano, mais j'ai du mal juste à obtenir la date, je vais bosser dessus

Reply

Marsh Posté le 06-12-2016 à 19:13:10    

Bon ben j'ai bossé  ;)  
 
Je tente un autre truc, créer 2 struct tm, un pour la date entrée et l'autre pour la date du jour.  De là je pourrai soustraire années, mois, jours pour obtenir les différences.
 
Mais je n'y parviens pas.
 
Voici ma methode :

Code :
  1. int Birthday::getDate2()
  2. {
  3.     time_t currentDate;
  4.     time(&currentDate);  //get current date
  5.     struct tm * currentD = localtime (&currentDate);  // convertir le nb de secondes de currentDate en struct tm
  6.     struct tm birthd = {0};  // date de naissance entrée
  7.     birthd.tm_hour = 0; birthd.tm_min = 0; birthd.tm_sec = 0;
  8.     birthd.tm_year = year; birthd.tm_mon = month; birthd.tm_mday = day;
  9.     yeardiff = currentD.tm_year - birthd.tm_year
  10.     std::cout << yeardiff << std::endl; // debug
  11. }

Ça me fait une erreur en ligne 13 : error: request for member 'tm_year' in 'currentD', which is of pointer type 'tm*' (maybe you meant to use '->' ?)|
 

Code :
  1. time(&currentDate);

Le & c'est pour accéder à l'adresse de currentDate ?  Why ?  Si je l'enlève j'ai une erreur en compilant.
 
Thank you for your help

Reply

Marsh Posté le 06-12-2016 à 21:38:29    

Tu as fait: struct tm * currentD
Donc soit tu fais (*currentD).tm_year soit tu fais currentD->tm_year
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-12-2016 à 09:13:23    

Merci gilou, ça fonctionne.
 
C'est un pointeur ça ?

Code :
  1. struct tm * currentD

Reply

Marsh Posté le 07-12-2016 à 10:44:33    

Farian a écrit :

Edit : Le fait que vous ne rencontriez le problème qu'à partir du 01/12/1969 me fait pensez que vous remplissez "mal" le champ "mois" de la structure tm, qui doit être entre 0 et 11 (alors que le jour est entre 1 et 31 :) ). Comme la fonction modifie les valeurs, le transforme le 01/12 et 01/01 de l'année d'après, ce qui correspond au T0.

Ah d'accord.  Merci pour ces nouvelles infos.  J'ai corrigé mon code et ça fonctionne

Reply

Marsh Posté le 07-12-2016 à 21:48:56    

Lt Ripley a écrit :

Merci gilou, ça fonctionne.
 
C'est un pointeur ça ?

Code :
  1. struct tm * currentD


Oui, *currentD est un struct tm, donc currentD est un pointeur sur un struct tm.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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