C++ Datum und Uhrzeit
Datum und Uhrzeit (Date und Time)
Die <ctime>
-Bibliothek ermöglicht es uns, mit Datums- und Uhrzeitangaben zu arbeiten.
Um es zu verwenden, müssen Sie die Header-Datei <ctime>
importieren:
Beispiel
#include <ctime> // Importieren Sie die ctime-Bibliothek
Aktuelles Datum und aktuelle Uhrzeit anzeigen
Die <ctime>
-Bibliothek verfügt über eine Vielzahl von Funktionen zum Messen von Datum und Uhrzeit.
Die Funktion time()
gibt uns einen Zeitstempel, der das aktuelle Datum und die aktuelle Uhrzeit darstellt. Wir können die Funktion ctime()
verwenden, um das Datum und die Uhrzeit anzuzeigen, die ein Zeitstempel darstellt:
Beispiel
Aktuelles Datum anzeigen:
// Rufen Sie den Zeitstempel für das aktuelle Datum und die aktuelle Uhrzeit ab
time_t timestamp;
time(×tamp);
// Zeigt das durch den Zeitstempel dargestellte Datum und die Uhrzeit an
cout << ctime(×tamp);
Try it Yourself »
Zwei Möglichkeiten, die Funktion time() zu verwenden
Die Funktion time()
schreibt einen Zeitstempel an den durch den Parameter angegebenen Speicherort, gibt aber auch den Wert des Zeitstempels zurück.
Eine alternative Möglichkeit, die Funktion time()
zu verwenden, besteht darin, einen NULL-Zeiger zu übergeben und stattdessen den Rückgabewert zu verwenden.
time_t timestamp = time(NULL);
Datentypen
Es gibt zwei verschiedene Datentypen, die zum Speichern von Datum und Uhrzeit verwendet werden: time_t
für Zeitstempel und struct tm
für datetime-Strukturen.
Zeitstempel stellen einen Zeitpunkt als einzelne Zahl dar, was dem Computer die Berechnung erleichtert.
Datetime-Strukturen sind Strukturen, die als Mitglieder verschiedene Komponenten des Datums und der Uhrzeit darstellen. Dies erleichtert uns die Angabe von Terminen. Datetime-Strukturen haben die folgenden Mitglieder:
tm_sec
– Die Sekunden innerhalb einer Minutetm_min
– Die Minuten innerhalb einer Stundetm_hour
– Die Stunde innerhalb eines Tages (von 0 bis 23)tm_mday
– Der Tag des Monatstm_mon
– Der Monat (von 0 bis 11, beginnend mit Januar)tm_year
– Die Anzahl der Jahre seit 1900tm_wday
– Der Wochentag (von 0 bis 6, beginnend mit Sonntag)tm_yday
– Der Tag des Jahres (von 0 bis 365, wobei 0 der 1. Januar ist)tm_isdst
– Positiv, wenn die Sommerzeit in Kraft ist, Null, wenn sie nicht in Kraft ist, und negativ, wenn die Sommerzeit unbekannt ist
Beachten Sie immer die Art und Weise, wie Datumskomponenten dargestellt werden:
- Die Stunden werden im 24-Stunden-Format dargestellt. 23 Uhr würde als 23 dargestellt.
- Die Monate reichen von 0 bis 11. Beispielsweise würde Dezember als 11 statt als 12 dargestellt.
- Jahre werden relativ zum Jahr 1900 dargestellt. Das Jahr 2024 würde als 124 dargestellt, da seit 1900 124 Jahre vergangen sind.
Zeitstempel erstellen
Die Funktion time()
kann nur einen Zeitstempel für das aktuelle Datum erstellen, aber wir können einen Zeitstempel für jedes Datum erstellen, indem wir die Funktion verwenden mktime()
.
Die Funktion mktime()
wandelt eine Datetime-Struktur in einen Zeitstempel um.
Beispiel
Erstellen Sie einen Zeitstempel mit der Funktion mktime()
:
struct tm datetime;
time_t timestamp;
datetime.tm_year = 2023 - 1900; // Anzahl der Jahre seit 1900
datetime.tm_mon = 12 - 1; // Anzahl der Monate seit Januar
datetime.tm_mday = 17;
datetime.tm_hour = 12;
datetime.tm_min = 30;
datetime.tm_sec = 1;
// Die Sommerzeit muss angegeben werden
// -1 Verwendet die Zeitzoneneinstellung des Computers
datetime.tm_isdst = -1;
timestamp = mktime(&datetime);
cout << ctime(×tamp);
Try it Yourself »
Hinweis: Für die Funktion mktime()
müssen diese Mitglieder einen Wert haben: tm_year
, tm_mon
, tm_mday
, tm_hour
, tm_min
, tm_sec
und tm_isdst
.
Erstellen von Datetime-Strukturen
Die Funktion mktime()
füllt auch tm_wday
und tm_yday
aus Mitglieder der datetime-Struktur mit den richtigen Werten, wodurch die Struktur vervollständigt wird und eine gültige datetime-Struktur bereitgestellt wird. Es kann beispielsweise verwendet werden, um den Wochentag eines bestimmten Datums zu ermitteln:
Beispiel
Finden Sie den Wochentag eines bestimmten Datums:
// Erstellen Sie die Datetime-Struktur und füllen Sie die fehlenden Elemente mit mktime aus
struct tm datetime;
datetime.tm_year = 2023 - 1900; // Anzahl der Jahre seit 1900
datetime.tm_mon = 12 - 1; // Anzahl der Monate seit Januar
datetime.tm_mday = 17;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
mktime(&datetime);
string weekdays[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
cout << "Das Datum steht auf " << weekdays[datetime.tm_wday];
Try it Yourself »
Die Funktionen localtime()
und gmtime()
können Zeitstempel in Datetime-Strukturen konvertieren.
Die Funktion localtime()
gibt einen Zeiger auf eine Struktur zurück, die die Zeit in der Zeitzone des Computers darstellt.
Die Funktion gmtime()
gibt einen Zeiger auf eine Struktur zurück, die die Zeit in der GMT-Zeitzone darstellt.
Diese Funktionen geben einen Zeiger auf eine Datetime-Struktur zurück. Wenn wir sicherstellen möchten, dass sich sein Wert nicht unerwartet ändert, sollten wir eine Kopie davon erstellen, indem wir den Zeiger dereferenzieren. Weitere Informationen zur Dereferenzierung finden Sie auf der Seite C++-Dereferenzierung.
Beispiel
Rufen Sie eine Datetime-Struktur ab und geben Sie die aktuelle Stunde aus:
time_t timestamp = time(×tamp);
struct tm datetime = *localtime(×tamp);
cout << datetime.tm_hour;
Try it Yourself »
Termine anzeigen
Bisher haben wir die Funktion ctime()
verwendet, um das in einem Zeitstempel enthaltene Datum anzuzeigen. Um Daten aus einer Datetime-Struktur anzuzeigen, können wir die Funktion asctime()
verwenden.
Beispiel
Zeigt das Datum an, das durch eine Datetime-Struktur dargestellt wird:
time_t timestamp = time(NULL);
struct tm datetime = *localtime(×tamp);
cout << asctime(&datetime);
Try it Yourself »
Hinweis: Die Funktion asctime()
korrigiert keine ungültigen Datumsangaben. Wenn Sie beispielsweise den Tag des Monats auf 32 festlegen, wird 32 angezeigt. Die Funktion mktime()
kann diese Art von Fehlern korrigieren:
Beispiel
Korrigieren Sie ein Datum, bevor Sie es anzeigen:
// Erstellen Sie die Datetime-Struktur und verwenden Sie mktime, um Fehler zu korrigieren
struct tm datetime;
datetime.tm_year = 2022 - 1900; // Anzahl der Jahre seit 1900
datetime.tm_mon = 0; // 0 ist Januar
datetime.tm_mday = 32;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
mktime(&datetime);
cout << asctime(&datetime);
Try it Yourself »
Mit den Funktionen ctime()
und asctime()
können wir das Datum anzeigen, aber nicht um auszuwählen, wie es angezeigt wird.
Um auszuwählen, wie ein Datum angezeigt wird, können wir die Funktion strftime()
verwenden.
Beispiel
Stellen Sie das aktuelle Datum auf unterschiedliche Weise dar:
time_t timestamp = time(NULL);
struct tm datetime = *localtime(×tamp);
char output[50];
strftime(output, 50, "%B %e, %Y", &datetime);
cout << output << "\n";
strftime(output, 50, "%I:%M:%S %p", &datetime);
cout << output << "\n";
strftime(output, 50, "%m/%d/%y", &datetime);
cout << output << "\n";
strftime(output, 50, "%a %b %e %H:%M:%S %Y", &datetime);
cout << output << "\n";
Try it Yourself »
Die Funktion strftime()
formatiert ein Datum und schreibt es als Zeichenfolge im C-Stil in ein char
-Array. Es hat vier Parameter:
- Der erste Parameter zeigt auf das char-Array, in das das formatierte Datum geschrieben wird.
- Der zweite Parameter gibt den im Array verfügbaren Platz an.
- Mit dem dritten Parameter können wir mithilfe von Formatbezeichnern auswählen, wie das Datum formatiert wird.
- Der letzte Parameter ist ein Zeiger auf die Datetime-Struktur, die das Datum enthält, das wir anzeigen möchten.
Die folgende Tabelle enthält einige nützliche Formatspezifizierer. Eine vollständigere Liste finden Sie auf der Seite strftime()-Referenz.
Formatbezeichner | Beschreibung | Beispiel |
---|---|---|
%a |
Kurze Darstellung des Wochentags | Fri |
%b |
Kurze Darstellung des Monatsnamens | Dec |
%B |
Vollständige Darstellung des Monatsnamens | December |
%d |
Tag des Monats mit führender Null | 09 |
%e |
Tag des Monats mit führenden Leerzeichen | 9 |
%H |
24-Stunden-Format einer Stunde | 14 |
%I |
12-Stunden-Format einer Stunde | 02 |
%M |
Minuten innerhalb einer Stunde | 30 |
%p |
AM oder PM | PM |
%S |
Sekunden innerhalb einer Minute | 01 |
%y |
2-stellige Jahresdarstellung | 23 |
%Y |
4-stellige Jahresdarstellung | 2023 |
Zeit messen
Es gibt zwei verschiedene Funktionen, mit denen Zeitunterschiede gemessen werden können.
Die Funktion difftime()
misst die Anzahl der Sekunden, die zwischen zwei verschiedenen Zeitstempeln verstrichen sind. Dies ist nützlich, wenn Sie Zeitunterschiede zwischen Datumsangaben messen.
Beispiel
Messen Sie den Zeitunterschied zwischen zwei Zeitstempeln
time_t now;
time_t nextyear;
struct tm datetime;
now = time(NULL);
datetime = *localtime(&now);
datetime.tm_year = datetime.tm_year + 1;
datetime.tm_mon = 0;
datetime.tm_mday = 1;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.is_dst = -1;
nextyear = mktime(&datetime);
int diff = difftime(nextyear, now);
cout << diff << " seconds until next year";
Try it Yourself »
Die Funktion clock()
ist nützlich, um kurze Zeitintervalle während der Programmausführung zu messen. Sie ist präziser als die Funktion difftime()
.
Jeder Aufruf der Uhrfunktion gibt einen speziellen Zeitstempel zurück, der in Uhren gemessen wird (eine Zeiteinheit, die davon abhängt, wie die Bibliothek implementiert wurde) und den Datentyp clock_t
hat. Um einen Zeitunterschied zu messen, speichern Sie einen Zeitstempel zu zwei verschiedenen Zeitpunkten und subtrahieren Sie diese dann. Der Zeitunterschied wird in Uhren gemessen, Sie können ihn jedoch in Sekunden umrechnen, indem Sie ihn durch die Konstante CLOCKS_PER_SEC
dividieren.
Beispiel
Messen Sie, wie lange es dauert, bis das Programm ausgeführt wird:
clock_t before = clock();
int k = 0;
for(int i = 0; i < 100000; i++) {
k += i;
}
clock_t duration = clock() - before;
cout << "Duration: " << (float)duration / CLOCKS_PER_SEC << " seconds";
Try it Yourself »
Hinweis: Stellen Sie sicher, dass Sie den Wert vor der Division in einen Typ float
oder double
umwandeln, andernfalls dies kann zu einer ganzzahligen Division führen, die dazu führen würde, dass der Dezimalteil abgeschnitten wird.
Vollständige <ctime>Referenz
Eine vollständige Referenz der <ctime>-Funktionen finden Sie in unserer C++-ctime-Referenz.