#include <time.h> // <ctime> en C++
struct tm { int tm_sec; /* Seconds. [0-60] 1 leap second */ int tm_min; /* Minutes. [0-59] */ int tm_hour; /* Hours. [0-23] */ int tm_mday; /* Day. [1-31] */ int tm_mon; /* Month. [0-11] */ int tm_year; /* Year - 1900. */ int tm_wday; /* Day of week. [0-6] */ int tm_yday; /* Days in year.[0-365] */ int tm_isdst; /* DST. [-1/0/1] */ # ifdef __USE_BSD long int tm_gmtoff; /* Seconds east of UTC. */ const char *tm_zone; /* Timezone abbreviation. */ # else long int __tm_gmtoff; /* Seconds east of UTC. */ const char *__tm_zone; /* Timezone abbreviation. */ # endif };
Cette structure permet de manipuler une date de manière plus simple, comparé à l'exploitation d'un timestamp de type
time_t
. On obtient une instance de cette structure en invoquant une fonction de conversion
à partir d'un time_t
parmis localtime
ou
gmtime
.
Il est possible de réaliser l'opération inverse, transformer un struct tm
en un time_t
en utilisant la fonction mktime
.
Attention : les fonctions localtime
et gmtime
renvoie toujours
le même pointeur sur une unique zone mémoire précalculée une fois pour toute. Chaque appel modifie les données produites par l'ancien appel.
L'exploitation des données produites par ces deux fonctions n'est donc pas « thread safe ».
De plus, il ne faut surtout pas chercher à désallouer cette zone de mémoire après utilisation.
Remarque : certaines informations sont basées à partir de zéro (numéro de mois, numéro de jours) et, par contre, le jour dans le mois est basé à partir de 1. C'est un choix délibéré. Effectivement dans les deux premiers cas, on aura souvent besoin d'associer la valeur numérique à une entrée dans un tableau : d'où la base 0. Il est important de noter que le premier jour de la semaine sera dimanche (standard anglophone) et que l'année est basée à partir de 1900.
#include <stdio.h> #include <time.h> int main( int argc, char * argv[] ) { const char * months[] = { "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre" }; const char * days[] = { "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" }; time_t timestamp = time( NULL ); struct tm * now = localtime( & timestamp ); printf( "%4d-%02d-%02d %02d:%02d:%02d\n", now->tm_year+1900, now->tm_mon+1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec ); printf( "Nous sommes le %s %d %s %d\n", days[now->tm_wday], now->tm_mday, months[now->tm_mon], now->tm_year+1900); return 0; }
Et voici maintenant les résultats produits par cet exemple.
$> gcc -o Sample Sample.c $> ./Sample 2014-11-22 19:09:56 Nous sommes le Samedi 22 Novembre 2014 $>
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :