L'horloge-Gestion de la date et de l'heure
Récupérer la date système
Pour récupérer l'heure système ou la date, il faudra utiliser l'include <time.h>
Il existe deux fonctions qui retournent le nombre de secondes écoulées entre aujourd'hui et une certaine date fixée par le système (ici les deux fonctions retournent le temps écoulé en seconde depuis le 1er janvier 1970 à 0h00).
time_t time(
time_t *timer
);
ou
__time64_t _time64(
__time64_t *timer
);
Le type de ces variables font que ces fonctions ne fonctionneront plus à partir d'une certaine date (après, le compteur reviendra à 0).
la première fonction ne fonctionnera plus après le 18 janvier 2038 à 19:14:07 !
Alors que la seconde fonction va planter après le 31 décembre 3000 à 23:59:59 !
Je sais, c'est un peu juste tout cela !!!
Le problème est de pouvoir exploiter cette information ! Heureusement, il existe des fonctions permettant de convertir ce temps en journée, mois, année, ...
Conversion de ce temps écoulé en secondes en quelque chose de plus clair:
Les fonctions localtime ou _localtime64 utilise les structures suivantes pour convertir ce temps:
struct tm *localtime(
const time_t *timer
);
struct tm *_localtime64(
const __time64_t *timer
);
les membres de tm seront alors:
tm_sec pour les secondes de 0 à 59
tm_min pour le minutes de 0 à 59
tm_hour l'heure de 0 à 23
tm_mday le jour du mois de 1 à 31
tm_mon le numéro de mois commençant à
0 pour janvier jusqu'à 11 pour décembre
tm_year année - 1900
tm_wday jour de la semaine de 0 à 6 avec dimanche à
0
tm_yday jour dans l'année de 0 à 365 avec le
premier janvier à 0
tm_isdst jamais utilisé...
Voici un exemple d'appel:
struct tm *newtime;
time_t aclock;
time( &aclock ); // Récupération de la date et de l'heure
en secondes
newtime = localtime( &aclock ); // Conversion dans une structure de type
tm pour affichage
Puis le code
if (newtime->tm_hour >= ...
Il est possible de convertir une structure tm en nombre de secondes écoulées
Vous utiliserons pour cela les fonctions:
time_t mktime(
struct tm *timeptr
);
__time64_t _mktime64(
struct tm *timeptr
);
conversion d'une date au format ASCII
size_t strftime(
char *strDest,
size_t maxsize,
const char *format,
const struct tm *timeptr
);
size_t wcsftime(
wchar_t *strDest,
size_t maxsize,
const wchar_t *format,
const struct tm *timeptr
);
Les paramètres sont alors
strDest Chaîne de caractères qui recevra la date au format ASCII.
maxsize Nombre de caractères maxi. que peut recevoir strDest
format Chaîne de caractères dans lequel vous pourrez indiquer le
format de conversion. Fonctionne comme dans printf()
timeptr contient la date à convertir au format tm
En sortie:
Nombre de caractères ou de wide contenu dans strDest. Ou 0 si la taille de la chaîne en sortie serait plus grande que la taille de strDest.
Les différentes valeurs que vous pourez passer dans la chaîne de format sont:
Valeur | Format |
%a | Jour de la semaine abrégé |
%A | Jour de la semaine complet |
%b | Mois abrégé |
%B | Mois complet |
%c | Représentation de la date et heure locale |
%d | Numéro du jour dans le mois (01-31) |
%m | Numéro du mois dans l'année (01-12) |
%y | année de (00 à 99) |
%Y | année avec le siècle |
%j | Numéro du jour dans l'année (001-366) |
%w | Numéro du jour dans la semain (0-6) avec:0 pour le dimanche, le premier jour de la semaine |
%U | Semaine dans l'année avec dimanche comme premier jour de la semaine |
%W | Semaine dans l'année avec lundi comme premier jour de la semaine |
%H | Heure en 24H (00-23) |
%I | Heure sur 12 H (01-12) |
%p | A.M ou P.M sur 12H |
%M | Minute (00-59) |
%S | Seconde (00-59) |
%x | Date en représentaion locale |
%X | Heure en représentation locale |
%z ou %Z | Autre représentation |
%% | Pour permettre l'affichage du signe % |
Vous pourrez passer par exemple "%d/%m/%Y" pour obtenir une date au format jj/mm/aaaa
Structure de la date horloge et de la date des fichiers
Il n'est pas facile de comparer des dates d'un fichier et celle de l'horloge. Et pour cause, elles ne sont pas codées de la même manière !
La date d'un fichier utilise une structure FILETIME. Cette structure étant évidemment incompatible avec une structure time_t !
Heureusement, il est possible de convertir une structure de type FILETIME en structure SYSTEMTIME. qui reste incompatible, mais qui est plus facilement manipulable car ressemblant à une structure de type tm !
Vous pourrez ensuite facilement convertir ce format SYSTEMTIME en tm moyennant quelques petites manipulations.
Par exemple sur le mois: de 1 à 12 en SYSTEMTIME, de 0 à 11 en tm !!!
Ensuite conversion de la structure tm en tim_t.
Voici un exemple de code permettant de comparer la date d'un fichier sur une période tDateDebut et tDateFin en structure time_t: