Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Trouver l'écart entre deux dates !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » dim. 11 sept. 2016 21:14

Bonsoir à tous,

Toujours sur mon module GSM, je cherche à faire une fonction particulière et je m’emmêle les pinceaux sur la bonne façon de faire. Il s'agit d'un mode réveil.

Le but est de calculé un écart en seconde entre deux dates ! mais le format de ces dates sont particulières.

Je récupère la date de mon module GSM avec une commande à la reception du SMS.
elle est sous la forme AA/MM/JJ HH:MM:SS

Je désire envoyer un texto avec une date et une heure aussi . Je compare ce texto à la date et heure de la reception et je détermine le nombre de secondes séparant les deux .
Bon si c'est pour le lendemain au milieu du mois , je n'ai qu'a rajouter 86400 secondes ( pour 1 jour) . LE Hic c'est pour le changement de mois !

Genre je reçois le texto le 30 septembre à 12h00 pour une activation le 02 octobre a 23H00 ?
Dois je créer un table avec le numéro de chaque mois ? avez vous déjà fait quelques chose dans ce genre ?

Merci à vous si vous avez une piste
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Trouver l'écart entre deux dates !
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#2 Message par Claudius » dim. 11 sept. 2016 21:26

Dois je créer une table avec le numéro de chaque mois ?

Surtout pas...
avez vous déjà fait quelque chose dans ce genre ?

Oh que oui...
Merci à vous si vous avez une piste

Cf. la librairie standard du Langage C en espérant que MikroC l'implémente pour les fonctions difftime et mktime ;-)

Exemples ici: http://www.tutorialspoint.com/c_standard_library/c_function_difftime.htm et http://www.tutorialspoint.com/c_standard_library/c_function_mktime.htm

Trouver l'écart entre deux dates !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » dim. 11 sept. 2016 21:32

Waouhhh !
J'ai effectué une recherche sur l'aide de MikroC sur "time" et je suis tombé sur :
Time_dateDiff

Je crois que j'ai de la chance sur ce coup . Il me reste plus qu'a éplucher cette fonction qui m'as l'air assez compliqué mine de rien !

Un grand merci tu m'as peut être fait échappé à une usine à gaz, comme je sais si bien les faire !
je vous tiens au courant de mes avancées dans ce domaine !
Merci !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Trouver l'écart entre deux dates !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#4 Message par Jérémy » dim. 11 sept. 2016 22:50

Suite aux conseils de Claudius j'ai essayé la fonction Time_dateToEpoch étant donné que la fonction Time_dateDiff n'est pas valable pour PIC18 ( il me semble ma librairie ne la reconnait pas).

j'ai donc créer mes variables et strucutres:

Code : Tout sélectionner


typedef struct
        
{
        
unsigned char   ss ;    // seconds
        
unsigned char   mn ;    // minutes
        
unsigned char   hh ;    // hours
        
unsigned char   md ;    // day in month, from 1 to 31
        
unsigned char   wd ;    // day in week, monday=0, tuesday=1, .... sunday=6
        
unsigned char   mo ;    // month number, from 1 to 12 (and not from 0 to 11 as with unix C time !)
        
unsigned int    yy ;    // year Y2K compliant, from 1892 to 2038
        
TimeStruct ;

unsigned int Gdh_AnGdh_MoisGdh_Jour ,Gdh_Heure ,Gdh_Minutes ,Gdh_Secondes ;
unsigned int Rev_An ,Rev_Mois ,Rev_Jour ,Rev_Heure ,Rev_Minutes ,Rev_Secondes ;

TimeStruct ts1ts2 ;

long epoch1epoch2 ;
long diff 


Ensuite dans une routine , je récupère mon Gdh et mon texto réveil et je stocke les valeurs lues dans des variables après conversion de string en int .

J'affecte mes valeurs aux structures pour obtenir mon epoch grace à la fonction.
Epoch c'est la durée en secondes depuis le 1 janvier 1970 . c'est donc un simple chiffre de type long.

Ainsi je devrais avoir deux chiffres de type long indiquant le temps en seconde écoulé depuis 1970.
En faisant la soustraction je devrais obtenir l'écart en seconde entre ces deux dates.

Je convertis les valeurs en string pour les envoyer par SMS .

Le résultat me donne n'importe quoi .

Code : Tout sélectionner

void Configure_Reveil(){  // reveil 25/02/16 11/05/12

       
Gdh_An 2000 + ((((Gdh[0])-48)*10)+(((Gdh[1])-48))) ;
       
Gdh_Mois = (((Gdh[3])-48)*10)+(((Gdh[4])-48));
       
Gdh_Jour = (((Gdh[6])-48)*10)+(((Gdh[7])-48));
       
Gdh_Heure = (((Gdh[9])-48)*10)+(((Gdh[10])-48));
       
Gdh_Minutes = (((Gdh[12])-48)*10)+(((Gdh[13])-48));
       
Gdh_Secondes = (((Gdh[15])-48)*10)+(((Gdh[16])-48));
       
       
Rev_An 2000 + ((((SMS_Recu[7])-48)*10)+(((SMS_Recu[8])-48))) ;
       
Rev_Mois = (((SMS_Recu[10])-48)*10)+(((SMS_Recu[11])-48));
       
Rev_Jour = (((SMS_Recu[13])-48)*10)+(((SMS_Recu[14])-48));
       
Rev_Heure = (((SMS_Recu[16])-48)*10)+(((SMS_Recu[17])-48));
       
Rev_Minutes = (((SMS_Recu[19])-48)*10)+(((SMS_Recu[20])-48));
       
Rev_Secondes = (((SMS_Recu[22])-48)*10)+(((SMS_Recu[23])-48));

       
ts1.ss Gdh_Secondes ;
       
ts1.mn Gdh_Minutes ;
       
ts1.hh Gdh_Heure ;
       
ts1.md Gdh_Jour ;
       
ts1.mo Gdh_Mois ;
       
ts1.yy Gdh_An ;

       
ts2.ss Rev_Secondes ;
       
ts2.mn Rev_Minutes ;
       
ts2.hh Rev_Heure ;
       
ts2.md Rev_Jour ;
       
ts2.mo Rev_Mois ;
       
ts2.yy Rev_An ;
       
      
epoch1 Time_dateToEpoch(&ts1) ;
      
epoch2 Time_dateToEpoch(&ts2) ;
      
diff =  epoch2 epoch1 ;


      
LongToStr(diffVal_diff);
      
LongToStr(epoch1Val_epoch1);
      
LongToStr(epoch2Val_epoch2);

     } 
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Trouver l'écart entre deux dates !
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#5 Message par Guest » lun. 12 sept. 2016 10:31

Bonjour

Je ne comprends pas trop, ce qui est simple devient très vite complique ou on le rend compliqué.

TU as cela : 02 octobre a 23H00

Déjà le format: pas des secondes, mais des minutes il n'y en a pas dans le texto ,pas d'année dans ton texto il n'y en a pas non plus .
il ne te reste que le mois donc une table de 12 valeurs pour sortie le format MM octobre->10 le format JJ HH MM il est dans ton texto

Enfin je dis cela apres tu vois

A+

PS cela fonctionne bien sur si le format général de ton texto est standardisé JOUR MOIS HEURE MINUTE car si c'est MOIS JOUR HEURE MINUTE pas bon :wink:

Trouver l'écart entre deux dates !
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#6 Message par paulfjujo » lun. 12 sept. 2016 10:36

bonjour Jeremy, et tous les autres


une bibliotheque de gestion de date qui m'avait rendu de bon service dans les annees 90
en turbo C2.00
algorithme utilisée meme sur un SOLAR 16_65 en Fortran!
usage du Calendrier Julien..
CALENDRI.zip

Cela pourrait etre transposable en MikroC.
oops encore faut-il gerer l'heure d' été / hiver !!!

et La librairie Mikroc ?
elle s'en preoccupe ?
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Trouver l'écart entre deux dates !
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#7 Message par Guest » lun. 12 sept. 2016 10:41

bonjour Paul

Oui mais la ,on est sur de la chaîne de caractères et ce qui coince, c'est la conversion chaîne ("octobre" ) en une autre chaîne ("10")
Reste plus que la soustraction, facile sans passer pas char->INT trop lourd ,un simple and 0X30 doit faire le bonheur :sifflotte: ou une comparaison de chaîne doit faire aussi

Trouver l'écart entre deux dates !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#8 Message par Jérémy » lun. 12 sept. 2016 11:33

Bonjour à tous,

Désolé pas très présent , je suis dans le train ( aller -retour sur Paris dans la journee).

L'heure du module est de ce format la : AA/MM/JJ HH/MM/SS . mais je peux le mettre dans n'importe quel format suffit d'enregistrer ce que je veux !
L'heure que la personne devra envoyer par texto devra être la même que pour le chrono afin de garder une certaine logique tout en rajoutant le date .
A l'heure actuelle le texto à envoyer est de la forme chrono H01 M30 S00 . avec ceci le PIC c'est qu'il devra allumer la prise dans 1h30 .
Donc je souhaite partir sur le même principe mais en rajoutant la date .
Il faudra envoyer : reveil 02/10/16 23/00/00 . pour que la prise se déclenche le 2 OCTOBRE à 23h00 .

Il est vrai que les années peuvent être zappé dans cette histoire, ainsi que le changement d'heure ; faut pas abuser j'aurais vraiment pas de chance .

La librairie de MikroC a l'air bien mais j'ai pas réussis , en même temps j'ai essayé hier soir , il était tard :sifflotte:

Je galère déjà a transformer mes chaines de caractères en chiffre . il faut que je sois sur .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Trouver l'écart entre deux dates !
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#9 Message par Guest » lun. 12 sept. 2016 16:40

donc si j'ai bien compris

Tu vas envoyer une CHAÎNE type 02/10/16 23:00:00 enfin peu importe le format je suppose que tu vas, l'adapter à ta CHAÎNE de ton chrono?
Si OUI affaire réglé.Comparaison de 2 chaîne de caractères

il y a une fonction (voir 2) qui compare 2 chaînes et retourne zéro si elle sont égales ou "+1" -1 si >< .
C'est Strcmp et Strncmp, la 2eme est sympa c'est le NB de caractères a tester.Regarde de ce coté la plutôt que de partir dans des conversions puis une soustraction et reconversion

il y a cela, vers la fin optimisation . Je ne connais pas votre compil, sinon en ASM c'est simple https://fr.wikipedia.org/wiki/Strcmp

Trouver l'écart entre deux dates !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#10 Message par Jérémy » lun. 12 sept. 2016 16:53

oui tu as compris ! mais je ne vois comment en comparant les deux chaines je pourrais déterminer une duree en secondes ?

IUl faudrait faire des calculs de fou la aussi ! non .

Si les mois ne sont pas pareils et il faudra faire un truc de tordu . pour les heures pas trop dur je pense . La méthode mikroC a l'air bien mais faut juste que j'arrive à la mettre en place .

J'ai relu mon code dans le train. Je pense que j'ai des problèmes de cast déjà avec les int et les char .

Pour toi ce n'est pas viable cette méthode ?
J'avoue que j'ai le donc de faire des compliquées alors qu'elles pourraient etre simple ; Mais ca c'est par ce que je veux tout comprendre et faire à ma façon :-D
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 86 invités