web-dev-qa-db-fra.com

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

J'ai quelque chose comme ça:

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

Il affiche le jour et l'heure actuels dans la sortie standard, mais je souhaite obtenir cette sortie ou les affecter aux variables current_day et current_time, afin de pouvoir effectuer ultérieurement un traitement avec ces valeurs.

current_day ==> current day
current_time ==> current time

La seule solution à laquelle je puisse penser maintenant est de diriger la sortie vers un fichier, puis de lire le fichier, puis d'attribuer les valeurs de date et d'heure à current_day et current_time. Mais je pense que ce n'est pas un bon moyen. Y a-t-il un autre moyen court et élégant?

44
seg.server.fault

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

#include <time.h>

time_t t = time(NULL);
struct tm tm = *localtime(&t);

printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
111
Adam Rosenfield
time_t rawtime;   
time ( &rawtime );
struct tm *timeinfo = localtime ( &rawtime );

Vous pouvez également utiliser strftime pour formater l’heure en chaîne.

16
Martin Beckett

strftime (C89)

Martin l'a mentionné , voici un exemple:

principal c

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

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

Compiler et exécuter:

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

Exemple de sortie:

Thu Apr 14 22:39:03 2016

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

L'un des avantages de cette fonction est qu'elle renvoie le nombre d'octets écrits, ce qui permet un meilleur contrôle des erreurs si la chaîne générée est trop longue.

asctime et ctime (C89)

asctime est un moyen pratique de formater un struct tm:

principal c

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

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

Exemple de sortie:

Wed Jun 10 16:10:32 2015

Et il y a aussi ctime() qui, selon la norme, est un raccourci pour:

asctime(localtime())

Comme mentionné par par Jonathan Leffler , le format présente l'inconvénient de ne pas avoir d'informations de fuseau horaire.

POSIX 7 a marqué ces fonctions comme "obsolètes" afin de pouvoir les supprimer dans les versions futures:

Les développeurs standard ont décidé de marquer les fonctions asctime () et asctime_r () comme obsolètes même si asctime () est dans la norme ISO C en raison du risque de débordement de la mémoire 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.

Les réponses données ci-dessus sont de bonnes réponses CRT, mais si vous le souhaitez, vous pouvez également utiliser la solution Win32. C'est presque identique, mais IMO si vous programmez pour Windows, vous pouvez aussi bien utiliser son API (dunno si vous programmez dans Windows mais quoi que ce soit)

char* arrDayNames[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; // Jeez I hope this works, I haven't done this in ages and it's hard without a compiler..
SYSTEMTIME st;
GetLocalTime(&st); // Alternatively use GetSystemTime for the UTC version of the time
printf("The current date and time are: %d/%d/%d %d:%d:%d:%d", st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
printf("The day is: %s", arrDayNames[st.wDayOfWeek]);

Quoi qu'il en soit, ceci est votre solution Windows. J'espère que ça vous aidera un jour!

1
Ori Osherov

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

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

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

Pour développer la réponse par Ori Osherov

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

Vous pouvez obtenir l’heure et la date à l’aide de SYSTEMTIMEstruct. Vous devez également appeler l’une des deux fonctions (GetLocalTime() ou GetSystemTime()) pour renseigner le struct.

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

GetSystemTime() vous donnera l'heure et la date in UTC.

La SYSTEMTIMEstruct a les membres suivants:

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

Vous devez ensuite simplement accéder à la struct de la manière habituelle


Exemple de code actuel:

#include <windows.h> // use to define SYSTEMTIME , GetLocalTime() and GetSystemTime()
#include <stdio.h> // For printf() (could otherwise use WinAPI equivalent)

int main(void) { // Or any other WinAPI entry point (e.g. WinMain/wmain)

    SYSTEMTIME t; // Declare SYSTEMTIME struct

    GetLocalTime(&t); // Fill out the struct so that it can be used

    // Use GetSystemTime(&t) to get UTC time 

    printf("Year: %d, Month: %d, Day: %d, Hour: %d, Minute:%d, Second: %d, Millisecond: %d", t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond, t.wMilliseconds); // Return year, month, day, hour, minute, second and millisecond in that order

    return 0;
}

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

La sortie sera quelque chose comme ça:

Year: 2018, Month: 11, Day: 24, Hour: 12, Minute:28, Second: 1, Millisecond: 572

Références utiles:

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

Un très bon tutoriel pour débutants à ce sujet par Zetcode:

Opérations simples avec date/heure sur Codeproject:


1: Comme indiqué dans les commentaires de la réponse de Ori Osherov ("Given that OP started with date +%F, they're almost certainly not using Windows. – melpomene Sep 9 at 22:17"), l'OP utilise pas sous Windows. Toutefois, cette question ne comportant aucune balise spécifique à la plate-forme ce système particulier), et est l’un des meilleurs résultats lorsque Googling "get time in c" (les deux réponses appartiennent ici), certains utilisateurs recherchant une réponse à cette question peuvent se trouver sur Windows et leur seront donc utiles.

0
Simon