vendredi 20 novembre 2020
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)
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
est une représentation humaine du temps.
Voir le man de mktime : man mktime
.
Dans l'ordre nous avons :
tm_sec
Les secondes de 0 à 59 tm_min
Les minutes de 0 à 59 tm_hour
Les heures de 0 à 23 tm_mday
Le jour du mois de 1 à 31. tm_mon
Le mois de 0 à 11. tm_year
L'année est comptée à partir de 1900. (e.g. tm_years = 120, correspond à 2020) tm_wday
Le jour de la semaine 0 = dimanche, ..., 6 = samedi tm_yday
Le jour dans l'année de 0 à 355. (e.g 2 janvier = 1) tm_isdst
L'heure d'été : 0 pas d'heure d'été. 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
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.
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
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
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
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