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?
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.
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:
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!
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
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 SYSTEMTIMEstruct. 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.
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)
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.
#include <time.h>
int get_day_of_year(){
time_t t = time(NULL);
struct tm tm = *localtime(&t);
return tm.tm_yday;
}`
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!
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.
Sie müssen lesen Zeit(7) Erste…
– Basile Starynkevitch
22. Februar 2016 um 9:01 Uhr