| Der Umgang mit Datum und Zeit - Daten ist fixer Bestandteil aller modernen Programmiersprachen. | In C/C++ werden alle benötigten Resourcen von der Header-Datei <time.h> bereitgestellt. |
C/C++ |
Klassiker der modernen Programmiersprachen |
| <time.h> | Konstanten, Typen und Funktionen |
| Aktuelle Zeit | als UNIX Timestamp |
| Zerlegung | in die Bestandteile: Jahr, Monat, Tag, Stunde, Minute, Sekunde, ... |
| Zusammensetzung | aus den Bestandteilen: Jahr, Monat, Tag, Stunde, Minute, Sekunde |
| String | Erzeugung und Ausgabe von Datum & Zeit - Strings (Text) |
| Ticks | Genaue Messung kurzer Zeit-Intervalle |
| Verwandte Themen | Datum und Zeit (Standards), in den Programmiersprachen Javascript, Perl, PHP, SQL, VBA, in den Betriebssystemen Linux, Windows, an der Windows-Konsole + Cygwin, Christliche Feiertage (Ostern...) |
<time.h> |
|
| Die Header-Datei <time.h> definiert alle Konstanten, Typen und Funktionen zur Ermittlung und Manipulation von Datum & Zeit. |
Einbindung in ein C-Programm:
#include <time.h>
Die Header-Datei ist Voraussetzung für alle Beispiele dieser Seite.
|
Objekte und FunktionenDie Grafik zeigt einige Objekte und Funktionen zur Verwendung mit Datum & Zeit.● Ein Objekt vom Typ time_t repräsentiert einen Zeitpunkt - in der Praxis einen → Unix-Timestamp in Sekunden seit 1970-01-01 Damit kann man u.a. Zeit-Differenzen berechnen. Mit ↓ Funktion time() wird der aktuelle Zeitpunkt zugewiesen. ● Strukturen vom ↓ Typ tm enthalten die einzelnen Bestandteile eines Zeitpunkts (Jahr...Sekunde) Diese lassen sich mit tm Strukturen gut manipulieren. |
● Strings werden zur Ausgabe verwendet. Sinnvoll ist nur die ↓ Funktion strftime(); die beiden anderen Funktionen erzeugen US-spezifische Strings. ♣ Alle modernen Browser zeigen die → SVG Objekt-Grafik (oben) an. |
Aktuelle Zeit mit Funktion time() |
|
|
Die Funktion time() liefert ein time_t
Objekt des aktuellen Zeitpunkts (Datum + Zeit) in der
→
Weltzeit UTC (ohne lokale Zeitzone oder Sommerzeit). In der Praxis wird das Objekt durch eine ganze Zahl vom Typ unsigned long dargestellt. Der Inhalt ist ein → UNIX-Timestamp = Sekunden seit 1970-01-01 00:00:00 (Weltzeit UTC). ● Direkte Anwendung von time_t Objekten: Ausgabe als positive ganze Zahl mit dem Format-String "%ld" ● Eine Zeit-Dauer in Sekunden entspricht der Differenz von 2 Timestamps: Beispiel bei Vorstellung der Funktion mktime() ● Addition und Subtraktion: Man kann auf ein time_t Objekt einfache Rechnungen anwenden, z.B. (rechts demonstriert) die Addition von +1 Tag = +24*60*60 = +86400 Sekunden |
Beispiel:
#include <stdio.h>
int main() {
#include <time.h>
time_t uts,vts;
}
uts = time(NULL); printf("UTS = %ld\n",uts); uts += 86400; printf("+ 1 Tag = %ld\n",uts); time(&vts); printf("VTS = %ld\n",vts);
UTS = 0
+1 Tag 0 VTS = 0 |
Funktion time()Diese Funktion liefert den aktuellen Zeitpunkt.Argument: Meist wird diese Funktion mit einem NULL-Pointer als Argument verwendet. Man kann optional auch einen Pointer auf ein time_t Objekt angeben. Rückgabe: Die Funktion gibt ein time_t Objekt zurück. Wenn man als Argument einen Pointer verwendet, dann braucht man keinen Rückgabe-Wert, weil der Pointer bereits auf dessen Adresse zeigt. |
Das Beispiel oben zeigt beide Varianten der Anwendung: • Bei Anwendung mit NULL-Pointer wird das Ergebnis an eine Variable (hier uts) zugewiesen. • Bei Anwendung mit einem Pointer (hier &vts) ist keine Zuweisung erforderlich, man findet das Ergebnis in der adressierten Variablen (hier vts). |
Zerlegung von Datum & Zeit |
|
| In <time.h> ist ein Struktur-Typ definiert, der die Bestandteile eines Datum-und-Zeit Objekts verwaltet: | |
|
Struktur vom Typ tm
struct tm {
int tm_sec; // Sekunden (0..59)
};
int tm_min; // Minuten (0..59) int tm_hour; // Stunden (0..23) int tm_mday; // Tag des Monats (1..31) int tm_mon; // Monat (0..11) int tm_year; // Jahr (Kalenderjahr - 1900) int tm_wday; // US-Wochentag (0..6, So=0) int tm_yday; // Tag des Jahres (0..365) int tm_isdst; // US-Sommerzeit (0..1) Ausgabe des Beispiels (rechts):
Datum: 0, 0, 0
Weltzeit UTC: 0, 0, 0 Lokalzeit: 0, 0, 0 TimeZone Offset = 0h |
Beispiel:
#include <stdio.h>
int main() {
#include <time.h>
int yy,mo,dd,h0,h1,mi,ss;
}
time_t uts; struct tm ts, *pts; time(&uts); ts = *(gmtime(&uts)); yy = ts.tm_year+1900; mo = ts.tm_mon+1; dd = ts.tm_mday; h0 = ts.tm_hour; mi = ts.tm_min; ss = ts.tm_sec; printf("Datum: %d, %d, %d\n",yy,mo,dd); printf("Weltzeit UTC: %d, %d, %d\n",h0,mi,ss); pts = localtime(&uts); h1 = pts->tm_hour; printf("Lokalzeit: %d, %d, %d\n",h1,mi,ss); printf("TimeZone Offset = %dh\n",h1-h0); |
Funktion gmtime()Diese Funktion zerlegt ein Datum-Zeit Objekt in die (ganzzahligen) Bestandteile der → Weltzeit UTC (früher GMT):Argument: Die Funktion erwartet einen Pointer auf ein time_t Objekt, welches meistens unmittelbar davor mit der ↑ Funktion time() auf die aktuellen Daten gesetzt wurde. Rückgabe: Die Funktion gibt einen Pointer auf eine tm Struktur zurück. Die Elemente der Struktur enthalten die gewünschten Daten. Funktion localtime()Diese Funktion arbeitet genauso wie gmtime(), liefert jedoch die Bestandteile der lokalen Zeitzone. |
Das Beispiel oben zeigt 2 Varianten der Anwendung: • Das Ergebnis der Funktion gmtime() wird de-referenziert und an die Variable ts zugewiesen. Danach werden die Elemente von ts an weitere Variable (yy...ss) zugewiesen und ausgegeben. • Das Ergebnis der Funktion localtime() wird direkt an die Pointer-Variable pts zugewiesen. Danach wird lediglich das Element tm_hours der damit angegebenen Struktur an die Variable h1 zugewiesen. • Aus der Differenz der Stunden von Lokalzeit und UTC (h1-h0) wird die Zeit-Differenz der Zeitzone (TimeZone Offset) berechnet und ausgegeben. |
LokalZeitEin Programm wird leichter durchschaubar, wenn man Teil-Arbeiten in Funktionen oder Klassen auslagert. Hier wird vorgestellt, wie man die Berechnung der Zeit-Bestandteile übersichtlich auslagern kann.Die Funktion current_hms() sollte Stunden, Minuten und Sekunden als ganze Zahlen zurückgeben. Da eine C-Funktion nur einen einzigen Wert zurückgeben kann, verwendet man (so wie in allen ähnlichen Fällen) Pointer, und zwar aus Sicht des Programms main() die Pointer &hh,&mi,&ss, aus Sicht der Funktion die (zur Unterscheidung anders benannten) Argumente ph,pmi,ps Die Funktion arbeitet so wie oben beschrieben und schreibt die Ergebnisse in jene Adressen, welche durch die 3 Pointer angegeben werden, z.B. die Stunden Lokalzeit an die mit dem Pointer ph angegebene Adresse, usw. Nach der einfachen Ausgabe als ganze Zahlen (Platzhalter %d ) wird gezeigt, wie man die gleichen Daten im Standard-Format → ISO-8601 mit optional führenden Nullen (Platzhalter %02d) formatieren kann. ♦ Details zur Funktion printf() |
Beispiel: Die C/C++ Funktion current_hms()
liefert die Bestandteile der aktuellen LokalZeit:
#include <stdio.h>
#include <time.h> void current_hms(int*,int*,int*); int main(void) {
int hh,mi,ss;
}current_hms(&hh,&mi,&ss); printf("Zeit: %d,%d,%d\n",hh,mi,ss); printf("ISO: %02d:%02d:%02d\n",hh,mi,ss); void current_hms(int *ph,int *pmi,int *ps) {
time_t uts;
}
struct tm ts,*pts; time(&uts); ts = *(gmtime(&uts)); pts=localtime(&uts); *ph=pts->tm_hour; *pmi = ts.tm_min; *ps = ts.tm_sec; Ausgabe:
Zeit: 0,0,0
ISO: 00:00:00 |
Wochentag:Den Tag der Woche nach Standard → ISO-8601 muss man selbst berechnen, z.B. so:
int iso_dow(int us_dow) {
if(us_dow) {return us_dow;}
}
else{return 7;} |
Zeitzone und SommerzeitDie Angabe der US-Sommerzeit ist in Europa wertlos.Auch die Zeitdifferenz der lokalen Zeitzone wird (je nach Betriebssystem und Compiler) nicht immer richtig angegeben. In diesen Fällen muss man sich selbst helfen: Man erhält die Daten entweder vom Betriebssystem (Konsolen-Programme, Umgebungs-Variable, Windows-Registry) oder man muss (Normalzeit oder Sommerzeit) selbst berechnen. |
Zusammensetzung von Datum & Zeit |
|
| Die Zusammensetzung von ganzzahligen Datum und Zeit-Elementen erfolgt in Strukturen vom Typ tm ( ↑ Zerlegung). | Anschließend erfolgt meistens mit Funktion mktime() eine Umwandlung in ein Objekt vom Typ time_t |
Funktion mktime()Diese Funktion setzt ein Datum-Zeit-Objekt aus seinen ganzzahligen Bestandteilen zusammen.Argument: Die Funktion erwartet einen Pointer auf eine Struktur vom Typ tm Rückgabe: Die Funktion gibt einen Wert vom Typ time_t zurück. |
Beispiel: Heute Mitternacht und heuer Neujahr:
#include <stdio.h>
int main() {
#include <time.h>
double dif;
}
char iso[60]; time_t t0,t1,t2; struct tm *pt0,*pt1,*pt2; time(&t2); // Jetzt pt2 = localtime(&t2); strftime(iso,60,"%Y-%d-%m %H:%M:%S",pt2); printf("Jetzt: %s\n",iso); pt1 = localtime(&t2); pt1->tm_hour = 0; pt1->tm_min = 0; pt1->tm_sec = 0; t1 = mktime(pt1); // Mitternacht strftime(iso,60,"%Y-%m-%d %H:%M:%S",pt1); printf("Mitternacht: %s",iso); dif = double(t2-t1)/3600; printf(" (vor %f Stunden)\n",dif); pt0 = localtime(&t1); pt0->tm_mon = 0; pt0->tm_mday = 1; t0 = mktime(pt0); // Neujahr strftime(iso,60,"%Y-%m-%d %H:%M:%S",pt0); printf("Neujahr: %s",iso); dif = double(t1-t0)/86400; printf(" (vor %f Tagen)\n",dif); |
|
Der Ausgangspunkt des Beispiels (rechts) ist ein time_t Objekt
der ↑ aktuellen Zeit
in der Variablen t2 Daraus werden mit ↑ Funktion localtime() die Daten der Struktur *pt2 vom Typ tm zugewiesen. Zur Ausgabe der Ergebnisse wird jeweils die ↓ Funktion strftime() verwendet. Die tm Struktur *pt1 wird zunächst auf die aktuellen Daten gesetzt. Danach werden Stunden, Minuten und Sekunden auf =0 (Mitternacht) gesetzt. Aus dieser Struktur wird mit Funktion mktime() ein time_t Objekt von 'Heute Mitternacht' erzeugt und an die Variable t1 zugewiesen. Die tm Struktur *pt0 wird zunächst auf 'Heute Mitternacht' gesetzt. Danach werden Monat und Tag auf den Jahresbeginn gesetzt. Aus dieser Struktur wird ein time_t Objekt von 'Neujahr' erzeugt und an die Variable t0 zugewiesen. |
|
DifferenzenObjekte vom Typ time_t eignen sich zur Berechnung von Datum- und Zeit-Differenzen. Bei Subtraktion der Variablen ergibt sich die Zeit-Dauer in Sekunden.Im Beispiel (oben) wird durch Division /3600 die Anzahl der Stunden seit Mitternacht und durch Division /86400 die Anzahl der Tage seit Neujahr berechnet. Die Differenz (t1-t0) ergibt ganze Tage, (t2-t0) zusätzlich den Anteil des aktuellen Tags. |
Ausgabe des Beispiels:
Jetzt: YYYY-MO-DD
HH:MI:SS
Mitternacht: YYYY-MO-DD 00:00:00 (vor 0 Stunden)
Neujahr: YYYY-MO-DD 00:00:00
(vor 0 Tagen)
|
Erzeugung von Datum & Zeit - Strings (Text) |
|||||||||||||||||||||||||||||||||||||||||||
| Die Funktion strftime() wird in allen modernen Programmiersprachen verwendet, um Datum und Zeit-Strings zu erzeugen. Darüber hinaus gibt es (auch in C/C++) spezielle Funktionen für die in den USA verwendeten Formate, die im Rest der Welt zumindest als 'exotisch' gelten. | Besonderheit von C/C++: Man verwendet nicht (wie in den meisten anderen Programmiersprachen) den Rückgabe-Wert der Funktion, sondern übergibt einen Pointer auf den zu erzeugenden String. | ||||||||||||||||||||||||||||||||||||||||||
Funktion strftime()Diese Funktion erzeugt aus einem time_t Objekt einen String, dessen Formatierung alle üblichen Anforderungen abdeckt.Argumente: Die Funktion erwartet 4 Argumente: • Pointer auf ein Array vom Typ *char - In diesem String wird das Ergebnis abgelegt. • Maximimale Länge des Ausgabe-Strings. • Ein Format-String, der das Fortmat der Ausgabe regelt. • Ein Pointer auf eine tm Struktur. Rückgabe: Wird normalerweise nicht verwendet. Wenn die angegebene maximale String-Länge ausreicht, die tatsächlich verwendete Länge des Ausgabe-Strings, ansonsten die Zahl 0. Im deutsch-sprachigen Bereich sind nur wenige Formate sinnvoll. ♥ Empfohlen werden hier nur die Standard-Formate nach → ISO-860, die - neben anderen Vorteilen - als einzige international eindeutig sind (Beispiel rechts). |
Beispiel:
#include <stdio.h>
int main() {
#include <time.h> time_t uts;
}
struct tm *ptm; char iso[20]; time(&uts); ptm = localtime(&uts); strftime(iso,20,"%Y-%m-%d %H:%M:%S",ptm); printf("ISO: %s\n",iso); Ausgabe:
YYYY-MO-DD
HH:MI:SS
|
||||||||||||||||||||||||||||||||||||||||||
Format-StringDie Funktion strftime() verwendet (als 3.Argument) einen Format-String zur Gestaltung des Ausgabe-Strings.Alle darin enthaltenen 'normalen' Zeichen erscheinen unverändert in der Ausgabe. Die Platzhalter dieser Funktion (Liste unten) werden durch die jeweiligen Datum und Zeit-Elemente der tm-Struktur (4.Argument) ersetzt. |
Beispiel: Diese Format-Strings erzeugen Datum, Zeit und beides zusammen nach Standard → ISO-8601:
"%Y-%m-%d"
"%H:%M:%S" "%Y-%m-%d %H:%M:%S" |
||||||||||||||||||||||||||||||||||||||||||
Wichtige (international brauchbare) Platzhalter:
|
|||||||||||||||||||||||||||||||||||||||||||
|
Weniger wichtige oder US-spezifische Platzhalter: (Daten vom Lade-Zeitpunkt dieser Webseite, nicht aktualisiert)
• Die Angabe der Zeitzone als String ist nicht einheitlich, sowie vom verwendeten Betriebssystem und der Sprache abhängig. Man verwendet besser die unmissverständliche Angabe des Zeit-Abstands in Stunden nach Standard → ISO-8601. |
|||||||||||||||||||||||||||||||||||||||||||
Funktionen ctime() und asctime()Diese beiden Funktionen erzeugen Strings, dier nur im US-Bereich sinnvoll sind. Als unerwartete Besonderheit enthalten die Strings am Ende bereits ein \n NewLine-Zeichen.Funktion ctime() erwartet als Argument einen Pointer auf ein time_t Objekt und gibt einen Datum und Zeit String in einem eher chaotischen US-Format zurück. Funktion asctime() erwartet als Argument einen Pointer auf eine tm Struktur und gibt einen Datum und Zeit String im gleichen Format zurück. Ausgabe des Beispiels:
ctime: Sun May 20 14:37:05 2012
asctime: Sun May 20 14:37:05 2012 |
Beispiel:
#include <stdio.h>
int main() {
#include <time.h> time_t uts;
}
struct tm *ptm; char *us; time(&uts); ptm = localtime(&uts); us = ctime(&uts); printf("ctime: %s",us); us = asctime(ptm); printf("asctime: %s",us); |
||||||||||||||||||||||||||||||||||||||||||
|
Letzte Änderung dieser Seite: 2012-04-30 13:08:04
|