Gestion du temps en C |
![]() Le fichier d'en tête time.h propose au programmeur plusieurs méthodes permettant la gestion du temps. Il existe deux moyen de manipuler le temps en C :
|
Sommaire
2. time
5. difftime
6. strftime
|
Manipulation de la date et / ou de l'heure |
Les fonctions asctime, time,
cmtime, difftime, gmtime, localtime, mktime, strftime,
vous nous permettre un traitement efficace. Voyons les en détail.
|
/* Function prototypes */ _CRTIMP char * __cdecl asctime(const struct tm *); _CRTIMP char * __cdecl ctime(const time_t *); _CRTIMP clock_t __cdecl clock(void); _CRTIMP double __cdecl difftime(time_t, time_t); _CRTIMP struct tm * __cdecl gmtime(const time_t *); _CRTIMP struct tm * __cdecl localtime(const time_t *); _CRTIMP time_t __cdecl mktime(struct tm *); _CRTIMP size_t __cdecl strftime(char *, size_t, const char *, const struct tm *); _CRTIMP char * __cdecl _strdate(char *); _CRTIMP char * __cdecl _strtime(char *); _CRTIMP time_t __cdecl time(time_t *); |
time |
La routine time a pour prototype :
|
time_t time(time_t *ptr); |
Le type time_t est en fait un typedef pour
unsigned long défini ainsi dans time.h :
|
#ifndef _TIME_T_DEFINED typedef long time_t; /* time value */ #define _TIME_T_DEFINED /* avoid multiple def's of time_t */ #endif |
En fait la fonction time retourne le temps
passé depuis le 1er janvier 1970 en secondes (norme POSIX). Elle retourne -1 en cas
d'echec.
Si ptr n'est pas egal à null alors la valeur retourneée par la fonction est aussi affectée à *ptr. |
ctime, gmtime, localtime |
Les fonctions ctime, gmtime et
localtime sont très similaires dans leur fonctionnement. Elles ont pour prototype :
|
char *ctime(const time_t *ptr); struct tm *gmtime(const time_t*ptr); struct tm *localtime(const time_t *timeptr); |
Toutes ces fonctions comme on le voit acceptent
une valeur de type time_t (en fait un unsigned long comme vu
précédemment) retournée par la méthode time.
Voyons ce que ces trois méthodes réalisent à partir de cette valeur ctime La routine ctime retourne sous la forme d'uine chaine de caractère la date d'une manière formatée et plus explicite par exemple : |
Sat Dec 15 12 : 02 : 41 2001 |
ce qui est plus lisible que :
|
36578367 |
gmtime et cmtime Ces deux fonctions retourne un pointeur sur une structure tm initialisée. La structure tm dispose d'un grand nombre de champs contenant des valeurs pouvant être exploitée par le programmeur |
#ifndef _TM_DEFINED struct tm { int tm_sec; /* secondes dans la minute courante - [0,59] */ int tm_min; /* minutes dans l'heure courante - [0,59] */ int tm_hour; /* heures depuis minuit - [0,23] */ int tm_mday; /* jours du mois - [1,31] */ int tm_mon; /* nb de mois depuis janvier- [0,11] */ int tm_year; /* nb d'années depuis 1900 */ int tm_wday; /* jours depuis dimanche - [0,6] */ int tm_yday; /* jours depuis le 1 janvier 1 - [0,365] */ int tm_isdst; /* heure d'été (1 : oui, 0 : non */ }; #define _TM_DEFINED #endif |
Cette structure sera initialisée selon le
temps universel (GMT) en utilisant la fonction gmtime et selon le temlps local avec la fonction
localtime.
Voyons un premier exemple : |
#include <stdio.h> #include <stdlib.h> #include <time.h> int main( void ) { //valeur qui va contenir le temps en secondes //écoulé depuis le 01/01/1970 time_t time_of_day; //on cherche le temps écoulé time_of_day = time( NULL ); //on affiche ce temps d'une manière explicite sous la forme // d'une string grâce à ctime printf( "Nous sommes le : %s", ctime( &time_of_day ) ); return 0; } |
produit la sortie
|
Nous sommes le: Wed Jun 30 09:09:33 1999 |
et un second :
|
#include <stdio.h> #include <time.h> #include <stdlib.h> int main( void ) { //notre temps en secondes depuis 01/01/1970 time_t temps; //la structure contenant bcp d'infos sur le temps struct tm *infos; //la chaine qui va conteir la date d'une manière explicite char * date; //récuperer le temps écoulé depuis le 01/01/1970 temps = time(NULL); //inscrire cette date d'une manière explicite dans la chaine date date = ctime(&temps); //récuper les infos sur le temps infos = localtime(&temps); //afficher le tout printf("temps passes depuis le 01/01/1970 en secondes : %ld\n", temps); printf("Nous sommes le : %s\n", date); printf("seconde : %d\n", infos->tm_sec); printf("minute : %d\n", infos->tm_min); printf("heure : %d\n", infos->tm_hour); printf("jour dans le mois : %d\n", infos->tm_mday); printf("jour dans l'annee : %d\n", infos->tm_yday); printf("mois : %d\n", infos->tm_mon); printf("annee : %d\n", infos->tm_year); printf("jours depuis dimanche : %d\n", infos->tm_wday); printf("heure d'ete : 0 non, 1 oui : %d\n", infos->tm_isdst); return 0; } |
qui produit la sortie
|
Lord Asriel : gcc temps.c -o temps Lord Asriel : temps temps passes depuis le 01/01/1970 en secondes : 984789417 Nous sommes le : Sat Mar 17 00:36:57 2001 seconde : 57 minute : 36 heure : 0 jour dans le mois : 17 jour dans l'annee : 75 mois : 2 annee : 101 jours depuis dimanche : 6 heure d'ete : 0 non, 1 oui : 0 Lord Asriel : |
asctime, mktime |
Les fonctions asctime et mktime ont
pour prototype :
|
char * asctime(const struct tm *ptr); time_t *mktime(const struct tm *ptr); |
Ces fonctions acceptent toutes les deux un
pointeur sur une structure de type tm préalablement intialisée.
asctime La fonction asctime retourne l'adresse d'une chaîne de caractère contenant la représentation de la date d'une manière explicite (comme vu précédemment avec cmtime). mktime La fonction mktime retourne le tmeps correspondant au contenu de la structure tm. Elle effectue l'opération inverse des fonctions gmtime et localtime en revnoyant une valeur de type time_t (en fait unsigned long). |
difftime |
La fonction difftime a pour prototype :
|
double difftime(time_t a, time_t b); |
Elle retourne la différence de temps entre
a et b (a-b) exprimés en secondes.
|
#include <stdio.h> #include <time.h> #include <stdlib.h> /** * fonction contenant des boucles * inutiles faisant un traitement * inutile permettant de perdre du temps */ void compute( void ) { int i, j; //boucles inutiles for( i = 1; i <= 20; i++ ) { for( j = 1; j <= 20; j++ ) { printf( "%3d ", i * j ); } printf( "\n" ); } } int main( void ) { //valeurs contenant le temps de départ //et de fin du programme time_t start_time, end_time; //on récupere la date de départ start_time = time( NULL ); //on fait un traitement compute(); //on récupère la date de fin end_time = time( NULL ); //et on affiche le temps passé printf("temps passé : %f secondes\n", difftime( end_time, start_time ) ); return 0; } |
Renvoie la sortie
|
Lord Asriel : gcc temps.c -o temps Lord Asriel : temps 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 114 120 7 14 21 28 35 42 49 56 63 70 77 84 91 98 105 112 119 126 133 140 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128 136 144 152 160 9 18 27 36 45 54 63 72 81 90 99 108 117 126 135 144 153 162 171 180 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 11 22 33 44 55 66 77 88 99 110 121 132 143 154 165 176 187 198 209 220 12 24 36 48 60 72 84 96 108 120 132 144 156 168 180 192 204 216 228 240 13 26 39 52 65 78 91 104 117 130 143 156 169 182 195 208 221 234 247 260 14 28 42 56 70 84 98 112 126 140 154 168 182 196 210 224 238 252 266 280 15 30 45 60 75 90 105 120 135 150 165 180 195 210 225 240 255 270 285 300 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240 256 272 288 304 320 17 34 51 68 85 102 119 136 153 170 187 204 221 238 255 272 289 306 323 340 18 36 54 72 90 108 126 144 162 180 198 216 234 252 270 288 306 324 342 360 19 38 57 76 95 114 133 152 171 190 209 228 247 266 285 304 323 342 361 380 20 40 60 80 100 120 140 160 180 200 220 240 260 280 300 320 340 360 380 400 temps passé: 20.000000 secondes Lord Asriel : |
strftime |
La fonction strftime dont le prototype est :
|
size_t strftime(char *s, size_t max, const char *format, const struct tm *ptr); |
fonctionne d'une manière analogue à
sprintf mais en plus compliqué.
la fonction strftime transforme les informations contenue dans la structure de type tm suivant le format fmt (analogue à celui de printf) et place le résultat dans la chaîne de caractère s. La chaine format consiste en une suite de 0 ou plusieurs directives et de caractères ordinaires. Rappeons que, comme avec printf, une directive consiste d'un % suivit d'un caractère qui détermine la subtitution qui doit être opéré. Tous les caractères ordinaires sont recopiés tels quels dans la chaîne s. Cette dernière étant terminée par nu '\0'. La maximum de caractères copiés dans s ne devant pas dépasser la valeur contenue dans maxsize. Les différentes directives %a nom du jours en abrévié %A nom du jour complet. %b nom du mois en abrévié. %B nom du mois complet. %c représentation appropriée de la date et l'heure locale. %d jour du mois sous la forme d'un entier (01-31). %D date avec le format mm/dd/yy (mois, jours, an). %e jours du moi sous la forme d'un entier (1-31); les digits simples sont précédés par un espace. %F Le standard ISO pour le format de date (équivalent à écrire %Y-%m-%d). %g Les deux derniers digits de l'année sous la forme d'nu entier (00-99) %G L'année sous la forme d'un entier (ex. 1998). %h nom local du mois en abrévié. %H heure (24-heures) sous la forme d'un entier (00-23). %I heure (12-heures) sous la forme d'un entier (01-12). %j jours de l'année sous la forme d'un entier (001-366). %m mois sous la forme d'un entier (01-12). %M mois sous la forme d'un entierr (00-59). %n nouvelle ligne. %p heure localede l'équivalent AM ou PM. %r temps sous la forme du système 12-heures (01-12) utilisant la notation AM/PM dans le format HH:MM:SS (AM|PM). %R notation 24-heures ; %H:%M. %S secondes sous la forme d'un entier (00-59). %t caractère tabulation. %T système 24-heures dans le format HH:MM:SS. %u jours de la semaine sous la forme d'un entier (1-7), ou lundi est preprésenté par 1. %U Semaine de l'année sous la forme d'un entier (00-52) ou dimanche est le premier jours de la semaine %V Semaine de l'année sous la forme d'un entier (00-52) ou lundi est le premier jours de la semaine.La semaine contenant le 1er janvier 1 se trouve dans la nouvelle année si au plus 4 jours de cette semaine sont dans la nouvelle année. %w jours de la semaine sous la forme d'un entier (0-6), ou 0 est dimanche. %W numéro de la semaine dans l'année sous la forme d'un entier (00-52), où lundi est le premier jours de la semaine %x représentation lcoale de la date. %X représentation locale du temps %y Année sans les centaines sous la forme d'un entier (00-99). %Y Year with century, as a decimal number. %z décalage depuis le fuseau UTC-0430 (4h 30 minutes de décalage vers l'ouest de Greenwich) ou aucun... %Z nom du fuseau horaire, ou aucun caractère si le fuseau n'est pas précisé. %% Caractère %. La fonction renvoie 0 si le nombre de caractères exède la valeur de maxsize, et bien un entier indiquant le nombre de caractère copié dans s. Il est à noter qu'en cas d'erreur la variable errno est définie. Exemple: |
|
#include <stdio.h> #include <stdlib.h> #include <time.h> int main( void ) { //valeur contenant le temps écoulé depuis //le 01/01/1970 time_t time_of_day; //buffer contenant la chaine finale char buffer[ 150 ]; //récuperer le temps passé time_of_day = time( NULL ); //inscrire dans la chaine buffer notre string //telle que nous la voulons strftime( buffer, 150, "Aujourd'hui nous sommes le is %A %d %B , %Y", localtime( &time_of_day ) ); //afficher la chaine printf( "%s\n", buffer ); return 0; } |
qui produit la sortie
|
Aujourd'hui nous sommes le Thursday 10 December , 2001 |
Temps utilisé par le processeur |
C'est la fonctoin clock_t qui va nous
permettre de traiter ce genre de cas. Celle-ci a pour prototype :
|
clock_t clock(void); |
Tout comme time_t, clock_t est un
aurte nom pour unsigned long :
|
#ifndef _CLOCK_T_DEFINED typedef long clock_t; #define _CLOCK_T_DEFINED #endif |
La routine clock renvoie le temps
utilisé par le préprocesseur en microsecondes où le symbole CLOCK_PER_SEC
représente le nombre d'unités par secondes :
|
/* Clock ticks macro - ANSI version */ #define CLOCKS_PER_SEC 1000 |
Ainsi en faisant deux appels à
clock, l'un au départ d'un programme, et l'autre à la fin, on obtient par
différence le temps utilisé par le programme.
|
#include <stdio.h> #include <time.h> #include <stdlib.h> /** * fonction contenant des boucles * inutiles faisant un traitement * inutile permettant de perdre du temps */ void compute( void ) { int i, j; double x; x = 0.0; //boucles inutiles for( i = 1; i <= 10000; i++ ) { for( j = 1; j <= 10000; j++ ) { x += i + j ; } } printf( "%16.7f\n", x ); } int main( void ) { //temps au départ et à la fin clock_t start_time, end_time; //récuperer la date au départ start_time = clock(); //faire un traitement compute(); //récuperer le temps à la fin end_time = clock(); //afficher la différence printf( "Le temps d'exécution est de %lu secondes\n", (long) ((end_time - start_time) / CLOCKS_PER_SEC) ); return 0; } |
Le programme ci-dessus donne la sortie :
|
Lord Asriel : gcc temps.c -o temps Lord Asriel : temps 1000100000000.0000000 Le temps d'exécution est de 2 secondes Lord Asriel : |
par Valentin BILLOTTE vbillotte@programmationworld.com http://www.programmationworld.com Dernière mise à jour: |