Avis pour manipuler horaire [Résolu]

Signaler
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
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
A voir également:

12 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

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!
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

:)

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 !
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

Petite question, pour quoi ceci

dtime << 16; // 0x00HH00
v <<= 8;
 
Pourquoi <<16 et <<=8 ?
Merci
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

Merci pour l'explication,

Je teste ca ce soir donc :)
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

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!
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

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
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

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 ) ?
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

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 -->
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
C'est quoi cette histoire de 6 DWORDs ???
Les décalages de bits sont nettement plus performants que des multiplications.

ciao...
BruNews, MVP VC++