vendredi 20 novembre 2020

Le temps en C

Pense-bête des fonctions de date et de temps en C :

 • time_t time(time_t *tloc);

 • time_t mktime(struct tm *tm)

 • struct tm *localtime(const time_t *timep);

 • double difftime(time_t time1, time_t time0)

 • char *strptime(const char *s, const char *format, struct tm *tm)

Préambule

Le type time_t

C'est un point dans le temps, par exemple la naissance de Jésus.

time_t est sous linux un long int.

En C la «natalité» est fixée au 1er janvier 1970 à 0h 0min 0s. Elle est appelée Epoch.

Une date antérieure est représentée par un nombre négatif.

Les fonctions de time.h gèrent bien ces valeurs négatives.

La structure struct tm

La structure struct tm est une représentation humaine du temps.

Voir le man de mktime : man mktime.

Dans l'ordre nous avons :

Je suis en train de rédiger cette ligne le 20 novembre 2020 à 13h57. Je peux informer une variable struct tm tm de cette date ainsi :

#include <stdio.h>
#include <time.h>
 
int main(int argc, char *argv[]) 
{
	struct tm tm = {0, 57, 13, 20, 10, 120, 0, 0, 0};
	char s[64];
	strftime(s, 64, "%d/%m/%Y %T", &tm);
	puts(s);
}

Affiche : 20/11/2020 13:57:00

Note : la fonction strftime traduit une structure tm en chaine de caractère suivant un format donné. Voir strftime.

La fonction time

La fonction time renvoie le temps courant, c'est à dire le nombre de secondes écoulées depuis l'Epoch (1er janvier 1970 à 0h 0min 0s).

time_t t = time(NULL);

Si au lieu de NULL on fournit l'adresse d'une variable de type time_t, la valeur renvoyée est aussi stockée dedans.

Conversions entre time_t et struct tm

Fonction mktime

Cette fonction permet de convertir une struct tm en un time_t

time_t mktime(struct tm *tm);

Elle renvoie (time_t) -1 en cas d'échec.

Il est prudent d'initialiser les champs de tm sauf tm_wday et tm_yday.

Cf. man mktime

Fonctions gmtime et localtime

Les deux fonctions gmtime et localtime convertissent un time_t en une struct tm. Comme leur nom l'indique la première opère en donnant un temps GMT et la seconde le temps local.

struct tm *gmtime(const time_t *timep);
struct tm *localtime(const time_t *timep);

Je ne comprend pas pourquoi l'argument de ces fonctions est fourni par adresse.

En interne les valeurs renvoyées sont statiques, ce qui veut dire qu'un nouvel appel peut les modifier. Il faut donc se dépêcher d'en faire une copie. Il existe deux fonctions similaires qui prennent un deuxième argument struct tm * qui permet d'éviter cet écueil.

Cf. man localtime

Conversions entre char * et struct tm

strftime

Elle permet d'obtenir la représentation sous forme de chaine de caractères à partir d'une structure tm;

size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);

On lui fournit le format souhaité et la struct tm, et elle remplit s en ne dépassant pas max caractères.

Il faut vérifier le nombre de caractères écrits en retour. S'il est nul, c'est que ça s'est mal passé.

Cf. man strftime

strptime

C'est la fonction réciproque de la précédente. Elle convertit une chaine de caractères en struct tm suivant le format donné.

#define _XOPEN_SOURCE 
#include <time.h>
char *strptime(const char *s, const char *format, struct tm *tm);

Elle nécessite la macro _XOPEN_SOURCE ou _GNU_SOURCE.

Cf. man strptime




Réalisé avec Qlam - LGPL