Avis pour manipuler horaire [Résolu]

Nixeus 183 Messages postés jeudi 18 janvier 2007Date d'inscription 5 juin 2018 Dernière intervention - 25 avril 2007 à 14:41 - Dernière réponse : BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention
- 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
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 25 avril 2007 à 16:00
3
Merci
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++

Merci BruNews 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de BruNews
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 25 avril 2007 à 15:24
0
Merci
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++
Commenter la réponse de BruNews
Nixeus 183 Messages postés jeudi 18 janvier 2007Date d'inscription 5 juin 2018 Dernière intervention - 25 avril 2007 à 15:54
0
Merci
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!
Commenter la réponse de Nixeus
Nixeus 183 Messages postés jeudi 18 janvier 2007Date d'inscription 5 juin 2018 Dernière intervention - 25 avril 2007 à 16:07
0
Merci
:)

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 !
Commenter la réponse de Nixeus
Nixeus 183 Messages postés jeudi 18 janvier 2007Date d'inscription 5 juin 2018 Dernière intervention - 25 avril 2007 à 16:10
0
Merci
Petite question, pour quoi ceci

dtime << 16; // 0x00HH00
v <<= 8;
 
Pourquoi <<16 et <<=8 ?
Merci
Commenter la réponse de Nixeus
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 25 avril 2007 à 16:15
0
Merci
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++
Commenter la réponse de BruNews
Nixeus 183 Messages postés jeudi 18 janvier 2007Date d'inscription 5 juin 2018 Dernière intervention - 25 avril 2007 à 16:49
0
Merci
Merci pour l'explication,

Je teste ca ce soir donc :)
Commenter la réponse de Nixeus
Nixeus 183 Messages postés jeudi 18 janvier 2007Date d'inscription 5 juin 2018 Dernière intervention - 27 avril 2007 à 11:02
0
Merci
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!
Commenter la réponse de Nixeus
Nixeus 183 Messages postés jeudi 18 janvier 2007Date d'inscription 5 juin 2018 Dernière intervention - 27 avril 2007 à 13:54
0
Merci
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
Commenter la réponse de Nixeus
Nixeus 183 Messages postés jeudi 18 janvier 2007Date d'inscription 5 juin 2018 Dernière intervention - 27 avril 2007 à 17:54
0
Merci
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 ) ?
Commenter la réponse de Nixeus
Nixeus 183 Messages postés jeudi 18 janvier 2007Date d'inscription 5 juin 2018 Dernière intervention - 27 avril 2007 à 19:29
0
Merci
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 -->
Commenter la réponse de Nixeus
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 27 avril 2007 à 21:39
0
Merci
C'est quoi cette histoire de 6 DWORDs ???
Les décalages de bits sont nettement plus performants que des multiplications.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.