Structure tm

Entête à inclure

#include <time.h>  // <ctime> en C++

Structure tm

struct tm {
  int tm_sec;           /* Seconds. [0-60]      */
  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.

Exemple de code

#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
$>

Fonctions et types connexes