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

  FORUM HardWare.fr
  Programmation
  C++

  Petits calculs sur le temps

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Petits calculs sur le temps

n°2293284
Lt Ripley
Ils ont tout niqué
Posté le 06-12-2016 à 10:40:38  profilanswer
 

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
mood
Publicité
Posté le 06-12-2016 à 10:40:38  profilanswer
 

n°2293294
Farian
Posté le 06-12-2016 à 11:10:31  profilanswer
 

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 !
n°2293297
Lt Ripley
Ils ont tout niqué
Posté le 06-12-2016 à 11:26:51  profilanswer
 

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

n°2293326
Lt Ripley
Ils ont tout niqué
Posté le 06-12-2016 à 19:13:10  profilanswer
 

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

n°2293329
gilou
Modérateur
Modzilla
Posté le 06-12-2016 à 21:38:29  profilanswer
 

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é!  --
n°2293334
Lt Ripley
Ils ont tout niqué
Posté le 07-12-2016 à 09:13:23  profilanswer
 

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

Code :
  1. struct tm * currentD

n°2293337
Lt Ripley
Ils ont tout niqué
Posté le 07-12-2016 à 10:44:33  profilanswer
 

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

n°2293369
gilou
Modérateur
Modzilla
Posté le 07-12-2016 à 21:48:56  profilanswer
 

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é!  --

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

  Petits calculs sur le temps

 

Sujets relatifs
Petits calculs pour les crédits, ne fonctionne pas [noob]besoin de gagner du temps sur le cacul de recherche dans gros fichier
simulation de temps de réponse de file d'attente m/m/1 en foction de tVBA Word prend son temps
Choix du temps avant un reloadEnorme difference de temps de traitement avec / sans debug
Compteur population mondiale en C (en fonction du temps)Valeur de variable aléatoire / intervalle de temps
rafraichir plusieurs images en meme temps[Matlab] Calculs sur machines distantes
Plus de sujets relatifs à : Petits calculs sur le temps


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