Comprendre et maîtriser les timestamps en C

Dans le monde de la programmation, il est fréquent de travailler avec des dates et des heures pour effectuer diverses opérations. Dans ce contexte, la notion de timestamp prend tout son sens pour les développeurs utilisant le langage C. Dans cet article, nous aborderons les concepts clés liés aux timestamps en C et explorerons les principales fonctions à connaître pour les manipuler efficacement.

Qu’est-ce qu’un timestamp ?

Un timestamp est un moyen de représenter un instant précis dans le temps sous forme d’un nombre entier. Ce nombre correspond généralement au nombre de secondes écoulées depuis un certain point de départ, appelé « epoch ». Cette méthode de représentation est très utile car elle permet de comparer facilement deux instants différents ou de calculer le temps écoulé entre ces moments. Le choix de l’epoch varie selon les systèmes : il s’agit typiquement du 1er janvier 1970 à minuit UTC (Temps Universel Coordonné) pour les ordinateurs compatibles POSIX.

Les principales fonctions pour gérer les timestamps en C

Obtenir l’heure actuelle : time()

La fonction time() est sans doute la première fonction que vous aurez besoin de connaître lorsque vous travaillez avec des timestamps en C. Elle permet de récupérer l’heure actuelle sous forme d’un timestamp :

#include <time.h>

int main() {
    time_t maintenant = time(NULL);
    printf("Timestamp actuel : %lld\n", (long long) maintenant);
    return 0;
}

La fonction time() renvoie un objet de type time_t, qui est un alias pour un type entier pouvant contenir des timestamps.

Convertir un timestamp en struct tm : localtime()

Une fois que vous avez obtenu un timestamp, il est souvent nécessaire de le convertir en une représentation plus lisible. La structure struct tm permet de décrire un instant dans le temps avec des composants tels que le jour, le mois et l’année. La fonction localtime() permet d’effectuer cette conversion :

#include <time.h>

int main() {
    time_t timestamp = time(NULL);
    struct tm *heure_locale = localtime(&timestamp);

    printf("Date et heure locales : %02d/%02d/%04d %02d :%02d :%02d\n",
           heure_locale->tm_mday, heure_locale->tm_mon + 1, 1900 + heure_locale->tm_year,
           heure_locale->tm_hour, heure_locale->tm_min, heure_locale->tm_sec);

    return 0;
}

Il faut noter que les valeurs renvoyées par localtime() sont ajustées selon le fuseau horaire et la règle d’heure d’été du système. Si vous souhaitez effectuer cette conversion sans tenir compte du fuseau horaire, utilisez plutôt la fonction gmtime().

Formater une date et une heure : strftime()

Pour afficher une date et une heure sous un format personnalisé, il est très pratique d’utiliser la fonction strftime(). Cette fonction permet de formater une struct tm à l’aide de chaînes de format spécifiant les parties de la date et de l’heure à inclure dans le résultat. Voici un exemple :

#include <time.h>

int main() {
    time_t timestamp = time(NULL);
    struct tm *heure_locale = localtime(&timestamp);

    char resultat[30];
    strftime(resultat, sizeof(resultat), "%A %d %B %Y - %H :%M :%S", heure_locale);

    printf("Date et heure locales formatées : %s\n", resultat);
    return 0;
}

Dans cet exemple, la chaîne de format "%A %d %B %Y - %H :%M :%S" indique que la date doit être affichée sous la forme « jour de la semaine, numéro du jour, nom du mois, année – heures :minutes :secondes ».

Gérer des durées avec les timestamps en C

Calculer une différence entre deux instants : difftime()

Les timestamps sont particulièrement adaptés pour calculer des durées entre deux instants. En effet, puisque les timestamps sont des nombres entiers représentant des secondes écoulées depuis un point fixe, il suffit de soustraire deux timestamps pour obtenir le nombre de secondes séparant ces instants. La fonction ctime() facilite cette opération :

#include <time.h>

int main() {
    time_t timestamp1 = time(NULL);
    sleep(5);
    time_t timestamp2 = time(NULL);

    double duree = difftime(timestamp2, timestamp1);
    printf("Durée entre les deux timestamps : %.0f secondes\n", duree);
    return 0;
}

Cet exemple calcule la différence de temps entre deux appels à time() espacés de 5 secondes. La fonction difftime() renvoie un double permettant une meilleure précision lors du calcul de durées.

Additionner ou soustraire des unités de temps : mktime()

Pour ajouter ou soustraire des unités de temps à un instant donné, il est nécessaire de travailler avec la structure struct tm. La fonction mktime() permet de convertir une struct tm en timestamp tout en effectuant automatiquement les ajustements nécessaires si certaines valeurs dépassent leurs limites :

#include <time.h>

int main() {
    time_t timestamp = time(NULL);
    struct tm *heure_locale = localtime(&timestamp);

    heure_locale->tm_hour += 3;
    heure_locale->tm_min -= 15;
    time_t nouveau_timestamp = mktime(heure_locale);

    printf("Nouveau timestamp : %lld\n", (long long) nouveau_timestamp);
    return 0;
}

Cet exemple montre comment ajouter 3 heures et soustraire 15 minutes à un timestamp. Grâce à la fonction mktime(), l’opération est réalisée correctement même si ces modifications impliquent de changer de jour, de mois ou d’année.

Retour en haut