Wie bekomme ich die Datums- und Uhrzeitwerte in einem C-Programm?

Lesezeit: 8 Minuten

Benutzeravatar von seg.server.fault
seg.server.fault

Ich habe so etwas:

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

Es druckt den aktuellen Tag und die aktuelle Uhrzeit in der Standardausgabe, aber ich möchte diese Ausgabe erhalten oder sie der zuweisen current_day und current_time Variablen, damit ich diese Werte später verarbeiten kann.

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

Die einzige Lösung, die mir jetzt einfällt, besteht darin, die Ausgabe in eine Datei zu leiten und dann die Datei zu lesen und dann die Werte von Datum und Uhrzeit zuzuweisen current_day und current_time. Aber ich denke, das ist kein guter Weg. Gibt es einen anderen kurzen und eleganten Weg?

  • Sie müssen lesen Zeit(7) Erste…

    – Basile Starynkevitch

    22. Februar 2016 um 9:01 Uhr

Benutzeravatar von Adam Rosenfield
Adam Rosenfield

Verwenden time() und localtime() um die Zeit zu bekommen:

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

int main()
{
  time_t t = time(NULL);
  struct tm tm = *localtime(&t);
  printf("now: %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);
}

  • Wenn ich versuche zu kompilieren, erhalte ich diesen Fehler test.c:13: Warnung: Übergeben von Argument 1 von „localtime“ von inkompatiblem Zeigertyp, was soll ich tun?

    – seg.server.fehler

    18. September 2009 um 1:13 Uhr

  • Ich weiß, dass es in vielen Beispielen so ist, aber es ist wirklich irreführend, “tm” als Namen für die tm-Struktur zu verwenden.

    – Nikko

    23. September 2011 um 15:00 Uhr

  • Die Definition der Funktion time ist time_t time(time_t *); Was ist der Unterschied zwischen den Argumenten und dem Rückgabewert?

    – Itachi

    10. Juli 2013 um 9:34 Uhr


  • @Itachi Kein Unterschied. Wenn der Parameter nicht NULL ist, dann wird der Rückgabewert auch dort gespeichert; siehe die Handbuchseite time(2).

    – Adam Rosenfield

    10. Juli 2013 um 20:11 Uhr

  • interessanterweise, wenn ich ein kleines Programm mit diesem Code mit starte strace Ich sehe das /etc/localtime ist geöffnet. Wenn /etc/localtime nicht existiert, gibt es die UTC-Zeit aus, ohne die aufzurufen time Systemaufruf.

    – dafnahaktana

    21. Juli 2018 um 14:15 Uhr

Ciro Santilli Benutzeravatar von OurBigBook.com
Ciro Santilli OurBigBook.com

strftime (C89)

Martin hat es erwähnt, hier ist ein Beispiel:

Haupt c

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

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-Upstream.

Kompilieren und ausführen:

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

Beispielausgabe:

Thu Apr 14 22:39:03 2016

Das %c Bezeichner erzeugt das gleiche Format wie ctime.

Ein Vorteil dieser Funktion ist, dass sie die Anzahl der geschriebenen Bytes zurückgibt, was eine bessere Fehlerkontrolle ermöglicht, falls die generierte Zeichenfolge zu lang ist:

RÜCKGABEWERT

Vorausgesetzt, dass die Ergebniszeichenfolge, einschließlich des abschließenden Null-Bytes, max bytes nicht überschreitet, gibt strftime() die Anzahl der Bytes (ohne das abschließende Null-Byte) zurück, die im Array s platziert sind. Wenn die Länge der Ergebniszeichenfolge (einschließlich des abschließenden Null-Bytes) max Bytes überschreiten würde, gibt strftime() 0 zurück und der Inhalt des Arrays ist undefiniert.

Beachten Sie, dass der Rückgabewert 0 nicht unbedingt auf einen Fehler hinweist. Beispielsweise ergibt %p in vielen Gebietsschemas eine leere Zeichenfolge. Ein leerer Formatstring ergibt ebenfalls einen leeren String.

asctime und ctime (C89, veraltet in POSIX 7)

asctime ist eine praktische Methode zum Formatieren von a struct tm:

Haupt 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;
}

Beispielausgabe:

Wed Jun 10 16:10:32 2015

Und es gibt auch ctime() was der Standard sagt, ist eine Abkürzung für:

asctime(localtime())

Wie von Jonathan Leffler erwähnt, hat das Format den Nachteil, dass es keine Zeitzoneninformationen enthält.

Posix 7 diese Funktionen als “veraltet” markiert, damit sie in zukünftigen Versionen entfernt werden können:

Die Standardentwickler haben sich entschieden, die Funktionen asctime() und asctime_r() als obsolet zu markieren, obwohl asctime() im ISO-C-Standard enthalten ist, da die Möglichkeit eines Pufferüberlaufs besteht. Der ISO-C-Standard stellt auch die Funktion strftime() bereit, mit der diese Probleme vermieden werden können.

C++-Version dieser Frage: Wie bekomme ich die aktuelle Uhrzeit und das aktuelle Datum in C++?

Getestet unter Ubuntu 16.04.

  • Dies assert ist eine schlechte Idee: im Release-Modus (-DNDEBUG), das strftime Der Anruf geht einfach verloren!

    – Michel de Ruiter

    16. August um 9:51 Uhr

Benutzeravatar von Martin Beckett
Martin Beckett

time_t rawtime;   
time ( &rawtime );
struct tm *timeinfo = localtime ( &rawtime );

Sie können auch verwenden strftime um die Zeit in einen String zu formatieren.

  • Oder tatsächlich, ctime() auf der time_t Wert.

    – Café

    18. September 2009 um 1:20 Uhr

  • ctime() erzeugt ein schmuddeliges, nicht internationalisiertes Datums-/Zeitformat. Das vergisst man am besten.

    – Jonathan Leffler

    18. September 2009 um 1:45 Uhr

Benutzeravatar von Xantium
Xantium

Um die Antwort von Ori Osherov zu erweitern

Du kannst den … benutzen WinAPI Um das Datum und die Uhrzeit zu erhalten, ist diese Methode spezifisch für Windows, aber wenn Sie nur auf Windows abzielen oder bereits die WinAPI verwenden, ist dies definitiv eine Möglichkeit1:

Sie können sowohl die Uhrzeit als auch das Datum abrufen, indem Sie die verwenden SYSTEMTIME struct. Sie müssen auch eine von zwei Funktionen aufrufen (entweder GetLocalTime() oder GetSystemTime()) zum Ausfüllen Struktur.

GetLocalTime() wird Ihnen die Zeit und das Datum geben spezifisch für Ihre Zeitzone.

GetSystemTime() wird Ihnen die Zeit und das Datum geben in koordinierte Weltzeit.

Das SYSTEMTIME struct hat folgende Mitglieder:

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

Sie müssen dann nur noch auf die zugreifen Struktur auf die reguläre Art und Weise


Tatsächlicher Beispielcode:

#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;
}

(Der Einfachheit und Klarheit halber codiert, siehe die ursprüngliche Antwort für eine besser formatierte Methode)

Die Ausgabe wird in etwa so aussehen:

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

Nützliche Referenzen:

Die gesamte WinAPI-Dokumentation (die meisten bereits oben aufgeführt):

Ein extrem gutes Einsteiger-Tutorial zu diesem Thema von ZetCode:

Einfache Operationen mit datetime auf Codeproject:


1: Wie in den Kommentaren in Ori Osherovs Antwort erwähnt (“Given that OP started with date +%F, they're almost certainly not using Windows. – melpomene Sep 9 at 22:17“) das OP ist nicht Verwenden von Windows, da diese Frage jedoch kein plattformspezifisches Tag hat (nirgendwo erwähnt wird, dass die Antwort für dieses bestimmte System gelten sollte) und eines der Top-Ergebnisse beim Googeln von “get time in c” ist, gehören beide Antworten hierher, einige Benutzer, die nach einer Antwort auf diese Frage suchen, befinden sich möglicherweise unter Windows und sind daher für sie nützlich.

Timespec hat den Tag des Jahres eingebaut.

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;
}`

Benutzeravatar von burntsugar
verbrannter Zucker

Die oben gegebenen Antworten sind gute CRT-Antworten, aber wenn Sie möchten, können Sie auch die Win32-Lösung dafür verwenden. Es ist fast identisch, aber meiner Meinung nach, wenn Sie für Windows programmieren, können Sie auch einfach seine API verwenden (obwohl ich nicht weiß, ob Sie in Windows programmieren).

char* arrDayNames[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; 
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]);

Jedenfalls ist dies eine Windows-Lösung. Ich hoffe, es wird dir irgendwann hilfreich sein!

Benutzeravatar von Sam B
Sam B

Ich habe den Befehlszeilen-C-Compiler verwendet, um diese zu kompilieren, und es hat mich völlig verrückt gemacht, als es sich weigerte, zu kompilieren.

Aus irgendeinem Grund hasste mein Compiler, dass ich die Funktion in einer Zeile deklarierte und verwendete.

struct tm tm = *localtime(&t);

test.c
test.c(494) : error C2143: syntax error : missing ';' before 'type'
Compiler Status: 512

Deklarieren Sie zuerst Ihre Variable und rufen Sie dann die Funktion auf. So habe ich es gemacht.

char   todayDateStr[100];
time_t rawtime;
struct tm *timeinfo;

time ( &rawtime );
timeinfo = localtime ( &rawtime );
strftime(todayDateStr, strlen("DD-MMM-YYYY HH:MM")+1,"%d-%b-%Y %H:%M",timeinfo);
printf("todayDateStr = %s ... \n", todayDateStr );

1419900cookie-checkWie bekomme ich die Datums- und Uhrzeitwerte in einem C-Programm?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy