108 votes

Comment obtenir les valeurs de date et d'heure dans un programme C ?

J'ai quelque chose comme ceci:

char *current_day, *current_time;
system("date +%F");
system("date +%T");

Il imprime le jour et l'heure actuels dans le stdout, mais je veux obtenir cette sortie ou les affecter aux variables current_day et current_time, afin de pouvoir effectuer un traitement avec ces valeurs plus tard.

current_day ==> jour actuel
current_time ==> heure actuelle

La seule solution à laquelle je peux penser maintenant est de rediriger la sortie vers un fichier, puis de lire le fichier et ensuite d'assigner les valeurs de la date et de l'heure à current_day et current_time. Mais je pense que ce n'est pas une bonne façon de faire. Y a-t-il un autre moyen court et élégant?

229voto

Adam Rosenfield Points 176408

Utilisez time() et localtime() pour obtenir l'heure :

#include <stdio.h>
#include <time.h>

int main()
{
  time_t t = time(NULL);
  struct tm tm = *localtime(&t);
  printf("maintenant : %d-%02d-%02d %02d:%02d:%02d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
}

27voto

Ciro Santilli Points 3341

strftime (C89)

Martin l'a mentionné, voici un exemple :

main.c

#include 
#include 
#include 

int main(void) {
    time_t t = time(NULL);
    struct tm *tm = localtime(&t);
    char s[64];
    size_t ret = strftime(s, sizeof(s), "%c", tm);
    assert(ret);
    printf("%s\n", s);
    return 0;
}

GitHub amont.

Compiler et exécuter :

gcc -std=c89 -Wall -Wextra -pedantic -o main.out main.c
./main.out

Sortie d'exemple :

jeu. avr. 14 22:39:03 2016

Le spécificateur %c produit le même format que ctime.

Un avantage de cette fonction est qu'elle renvoie le nombre d'octets écrits, permettant un meilleur contrôle des erreurs au cas où la chaîne générée est trop longue :

Valeur de retour

À condition que la chaîne de résultat, y compris l'octet nul de terminaison, ne dépasse pas max octets, strftime() renvoie le nombre d'octets (à l'exclusion de l'octet nul de terminaison) placés dans le tableau s. Si la longueur de la chaîne de résultat (en incluant l'octet nul de terminaison) dépasse max octets, alors strftime() renvoie 0, et le contenu du tableau est indéfini.

Notez que la valeur de retour 0 n'indique pas nécessairement une erreur. Par exemple, dans de nombreux paramètres régionaux %p produit une chaîne vide. Une chaîne de format vide produira également une chaîne vide.

asctime et ctime (C89, obsolète dans POSIX 7)

asctime est un moyen pratique de formater un struct tm :

main.c

#include 
#include 

int main(void) {
    time_t t = time(NULL);
    struct tm *tm = localtime(&t);
    printf("%s", asctime(tm));
    return 0;
}

Sortie d'exemple :

mer. juin 10 16:10:32 2015

Et il y a aussi ctime() que la norme dit être un raccourci pour :

asctime(localtime())

Comme mentionné par Jonathan Leffler, le format a comme inconvénient de ne pas avoir d'information sur le fuseau horaire.

POSIX 7 a marqué ces fonctions comme "obsoletes" afin qu'elles puissent être supprimées dans les versions futures :

Les développeurs de normes ont décidé de marquer les fonctions asctime() et asctime_r() comme obsoletes même si asctime() est dans la norme ISO C en raison de la possibilité de débordement de tampon. La norme ISO C fournit également la fonction strftime() qui peut être utilisée pour éviter ces problèmes.

Version C++ de cette question : Comment obtenir l'heure et la date actuelles en C++ ?

Testé sous Ubuntu 16.04.

19voto

Martin Beckett Points 60406
time_t rawtime;   
time ( &rawtime );
struct tm *timeinfo = localtime ( &rawtime );

Vous pouvez également utiliser strftime pour formater le temps en une chaîne de caractères.

6voto

Simon Points 5692

Pour développer la réponse de Ori Osherov

Vous pouvez utiliser le WinAPI pour obtenir la date et l'heure, cette méthode est spécifique à Windows, mais si vous ciblez uniquement Windows ou si vous utilisez déjà le WinAPI, alors c'est certainement une possibilité1:

Vous pouvez obtenir à la fois l'heure et la date en utilisant la struct SYSTEMTIME. Vous devez également appeler l'une des deux fonctions (soit GetLocalTime() soit GetSystemTime()) pour remplir la struct.

GetLocalTime() vous donnera l'heure et la date spécifiques à votre fuseau horaire.

GetSystemTime() vous donnera l'heure et la date _en UTC_.

La struct SYSTEMTIME a les membres suivants:

wYear, wMonth, wDayOfWeek, wDay, wHour, wMinute, wSecond et wMilliseconds

Ensuite, vous devez simplement accéder à la struct de manière régulière


Exemple de code actuel:

#include  // utilisé pour définir SYSTEMTIME , GetLocalTime() et GetSystemTime()
#include  // Pour printf() (on pourrait sinon utiliser l'équivalent WinAPI)

int main(void) { // Ou n'importe quel autre point d'entrée WinAPI (par exemple WinMain/wmain)

    SYSTEMTIME t; // Déclarer la struct SYSTEMTIME

    GetLocalTime(&t); // Remplir la struct pour qu'elle puisse être utilisée

    // Utiliser GetSystemTime(&t) pour obtenir l'heure UTC 

    printf("Année: %d, Mois: %d, Jour: %d, Heure: %d, Minute:%d, Seconde: %d, Milliseconde: %d", t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond, t.wMilliseconds); // Renvoyer l'année, le mois, le jour, l'heure, les minutes, les secondes et les millisecondes dans cet ordre

    return 0;
}

(Codé pour la simplicité et la clarté, voir la réponse originale pour une méthode mieux formatée)

La sortie ressemblera à quelque chose comme ceci:

Année: 2018, Mois: 11, Jour: 24, Heure: 12, Minute:28, Seconde: 1, Milliseconde: 572

Références utiles:

Toute la documentation WinAPI (la plupart déjà listée ci-dessus):

Un tutoriel très bon pour les débutants sur ce sujet par ZetCode:

Opérations simples avec la date et l'heure sur Codeproject:


1: Comme mentionné dans les commentaires de la réponse d'Ori Osherov ("Étant donné que l'OP a commencé avec la date +%F, ils n'utilisent presque certainement pas Windows. - melpomene 9 sept à 22:17"), l'OP n'utilise pas Windows, cependant, comme cette question n'a pas de balise spécifique à la plate-forme (ni ne mentionne nulle part que la réponse devrait être pour ce système particulier), et qu'il s'agit l'un des résultats les plus pertinents lorsque l'on google "obtenir l'heure en c", les deux réponses sont utiles ici, certains utilisateurs recherchant une réponse à cette question peuvent être sur Windows et il leur sera donc utile.

2voto

RooterTooter Points 154

Timespec a le jour de l'année intégré.

http://pubs.opengroup.org/onlinepubs/7908799/xsh/time.h.html

#include 
int get_day_of_year(){
    time_t t = time(NULL);
    struct tm tm = *localtime(&t);
    return tm.tm_yday;
}`

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X