Avis pour manipuler horaire

Résolu
Nixeus Messages postés 192 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 octobre 2020 - 25 avril 2007 à 14:41
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 27 avril 2007 à 21:39
Bonjour a tous,

Je developpe une petite appli en MFC, sous visual c++, qui doit aller récupérer un horaire sur une base de donnée, puis le comparer a l'heure actuelle. Je sais récupérer l'heure actuelle sans problème. J'ai juste besoin d'un conseil,  savoir, comment me conseillez vous de stocker mon horaire dans ma base de donnée ( afin que ma comparaison avec l'heure actuelle soit la plus simple possible ).

Actuellement, les dates a saisir dans ma base de donnée, sont sous forme CString ex : 14H36
Me conseillez vous de les "passer" en décimal, donc 14.6 ?

Note: Je récupere l'heure courant sous la forme d'un CSTRING du style hh:mm

Merci a tous !!! Bonne journée

12 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 avril 2007 à 16:00
Les entiers sont toujours plus rapides à traiter que les flottants.

DWORD dtime, v;
dtime = atoi(heure);
v = atoi(minute);
dtime << 16; // 0x00HH00
v <<= 8;
dtime |= v; // 0x00HHMM00
dtime |= atoi(seconde);

voila pour packer.
comparaisons
if(dt1 > dt2)
ou < ou ==, toutes valables.

ciao...
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 avril 2007 à 15:24
Si seulement heure minute seconde, tu 'pack' dans un DWORD:
00HHMMSS
par décalages <<=
et ainsi comparaisons > ou < etx se font illico.

ciao...
BruNews, MVP VC++
0
Nixeus Messages postés 192 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 octobre 2020
25 avril 2007 à 15:54
A oui, registre a décallage, donc tu me conseilles, de packer mes deux horaires ( l'horaire actuel, et l'horaire sur la Base de donnée) dans un DWord, puis de comparer avec des décallage.

En fait, sur ma base de donnée, je récupere deux horaires ( 14H20 et 16H30)
Je doit savoir si l'horaire actuel ( ex : 15H54) est compris entre 14H20 et 16H30

Donc, avec ceci, tu me conseilles d'utiliser décallage ? Ou alors de passer en décimal?

Merci beaucoup!
0
Nixeus Messages postés 192 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 octobre 2020
25 avril 2007 à 16:07
:)

Merci beaucoup, je vais tester tout ca, et donnerais des nouvelles dans la soirée, car beaucoup travail !
En tout cas, c'est appréciable d'avoir des MVP sur le forum :)
Surtout la petite touche des soucis d'allégement du code et de rapidité de code ( chose qu'on néglige de plus en plus aujourd'hui nous les jeunes avec nos bécannes cadencés a 3GHZ et vec 2MO de RAM), mais vous avez raison a mort !!

Encore merci !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Nixeus Messages postés 192 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 octobre 2020
25 avril 2007 à 16:10
Petite question, pour quoi ceci

dtime << 16; // 0x00HH00
v <<= 8;
 
Pourquoi <<16 et <<=8 ?
Merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 avril 2007 à 16:15
heure tient par force sur 1 octet, donc
atoi(heure) donne 0x000000HH
dtime << 16; // 0x00HH0000
logique non ?
Heure est donc dans octet 2.


Je mets minutes dans octet 1 pour ORer ensuite
et en finale on laisse secondes dans octet 0.

ciao...
BruNews, MVP VC++
0
Nixeus Messages postés 192 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 octobre 2020
25 avril 2007 à 16:49
Merci pour l'explication,

Je teste ca ce soir donc :)
0
Nixeus Messages postés 192 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 octobre 2020
27 avril 2007 à 11:02
Désolé de ne pas avoir pu répondre hier,

Je viens donc de regarder a tout cela , je voulais savoir si j'avais moyen de packer ca directement ? Car en réalité, ma fonction GetTime me retourne une CString de la forme HH:MM:SS . Donc puis-je "packer" directement cette CString en un DWORD, ou dois-je faire une traitement afin de découper cela en 3 CString , à savoir Heure, Minute, et Seconde ?

Enfin, quand tu parles de la comparaison avec DT1 et DT2 ( ->  if(dt1 > dt2) )
Dt1 et Dt2 sont mes 2 DWord correspondants a mes deux horaires ?

Merci beaucoup!
0
Nixeus Messages postés 192 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 octobre 2020
27 avril 2007 à 13:54
Ta méthode fonctionne impecablement bien BruNews !
Merci beaucoup !

J'ai bien vérifié si les comparaison d'horaires fonctionnais, et aparemment, tout fonctione !Encore merci
0
Nixeus Messages postés 192 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 octobre 2020
27 avril 2007 à 17:54
Juste une question qui me taraude, ne serais-ce pas plus "performant" et moin lourd, de passer par 2 int pour comparer, que de déclarer 6 DWORD ( 3 par horaires ) ?
0
Nixeus Messages postés 192 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 octobre 2020
27 avril 2007 à 19:29
Comme tu est calé en rapidité d'execution de code, je souhaitais savoir si ceci ne serais pas plus optimisé ( déclaration de 2 int seulement, et non 4 DWord)

CString heure="15";
CString minutes="21";
CString seconde="12";
int nHeureEnSeconde1 = atoi(heure)*3600 + atoi(minutes)*60 + atoi(seconde);

CString heuree="15";
CString minutess="21";
CString secondee="11";
int nHeureEnSeconde2 = atoi(heuree)*3600 + atoi(minutess)*60 + atoi(secondee);

if (nHeureEnSeconde1 < nHeureEnSeconde2 )
{
AfxMessageBox("PLUS PETIT");

}

if (nHeureEnSeconde1 >nHeureEnSeconde2 )
{
AfxMessageBox("PLUS GRAND");

}

}<!-- / message -->
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 avril 2007 à 21:39
C'est quoi cette histoire de 6 DWORDs ???
Les décalages de bits sont nettement plus performants que des multiplications.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous