C-Unix-Timestamp-Snippets
C-Beispiele zum Holen des aktuellen Unix-Timestamps, Umwandeln von Epoch-Sekunden in ein lesbares Datum mit strftime() und Erzeugen von Timestamps aus Kalenderdaten mit timegm().
#include <time.h>
time_t ts = time(NULL);#include <time.h>
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
long ms = (long)ts.tv_sec * 1000L + ts.tv_nsec / 1000000L;#include <time.h>
#include <stdio.h>
time_t ts = 1700000000;
struct tm *tm_info = gmtime(&ts); // UTC
char buf[64];
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm_info);
printf("%s\n", buf); // "2023-11-15 06:13:20"#include <time.h>
time_t ts = 1700000000;
struct tm *tm_info = localtime(&ts); // host timezone
char buf[64];
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm_info);#define _GNU_SOURCE
#include <time.h>
struct tm t = {0};
t.tm_year = 2023 - 1900; // years since 1900
t.tm_mon = 10; // 0-indexed; 10 = November
t.tm_mday = 15;
t.tm_hour = 6;
t.tm_min = 13;
t.tm_sec = 20;
time_t ts = timegm(&t); // GNU/POSIX; use mktime() for local#include <time.h>
time_t start = time(NULL);
/* ... work ... */
time_t end = time(NULL);
double elapsed = difftime(end, start);Grundlagen zu C-Zeitstempeln
C stellt Unix-Zeit als time_t dar, einen vorzeichenbehafteten Ganzzahltyp aus <time.h>. Auf 64-Bit-Systemen ist time_t 64 Bit und gegen den Jahr-2038-Überlauf immun. Auf 32-Bit-Systemen ist es auf vielen Plattformen noch 32 Bit; prüfe sizeof(time_t) zur Bestätigung. Die Standardfunktion time(NULL) gibt die aktuelle Unix-Zeit in Sekunden zurück.
gmtime vs. localtime
gmtime() wandelt ein time_t in ein struct tm in UTC um. localtime() wandelt in die lokale Zeitzone des Hostsystems um. Verwende immer gmtime(), wenn du ein reproduzierbares, zeitzonenunabhängiges Ergebnis brauchst. Beide Funktionen geben einen Zeiger auf ein gemeinsam genutztes statisches struct zurück; kopiere das Ergebnis in eine lokale struct-tm-Variable, wenn du es über Funktionsaufrufe hinweg brauchst.
Hinweise für den Produktiveinsatz von C
Bevorzuge clock_gettime(CLOCK_REALTIME) gegenüber gettimeofday() für Sub-Sekunden-Präzision; POSIX markiert gettimeofday() als veraltet. Verwende timegm() (GNU/BSD) oder ein portables Äquivalent beim Umwandeln von Kalenderdaten in UTC-Zeitstempel; mktime() interpretiert seine Eingabe als lokale Zeit, was in Nicht-UTC-Umgebungen still falsche Ergebnisse liefert.
- Prüfe sizeof(time_t) auf eingebetteten Zielen; 32-Bit-time_t läuft im Januar 2038 über
- Verwende gmtime_r() und localtime_r() in mehrthreadigem Code, um Data Races zu vermeiden
- strftime()-Formatstrings sind gebietsschemaunabhängig; bevorzuge %Y-%m-%d gegenüber %x für Interoperabilität
- timegm() ist nicht in POSIX; verwende _mkgmtime() unter Windows oder implementiere es manuell mit mktime() + UTC-Versatz
Linux-Zeit umwandeln: date(1), time_t, gmtime, strftime
Suchen nach „convert linux time“ oder Linux-Zeitstempel-Umrechnung meinen meist den Shell-Befehl date(1) oder die unten genannten time_t-Funktionen der C-Bibliothek. Linux speichert den Unix-Zeitstempel als time_t — vorzeichenbehaftet 32-Bit auf Altsystemen (Y2038-Grenze), vorzeichenbehaftet 64-Bit auf modernen.
- Shell (GNU date): date -u -d @1700000000 — epoch → UTC-Datum
- Shell (BSD/macOS): date -ur 1700000000 — beachte -r statt -d @
- Shell aktuelle Epoche: date +%s (Sekunden), date +%s%3N (ms, nur GNU)
- C-Bibliothek: time_t t = time(NULL); struct tm *u = gmtime(&t); strftime(buf, sizeof(buf), '%Y-%m-%dT%H:%M:%SZ', u);
- C-Bibliothek: timegm(struct tm *) gibt ein time_t für eine UTC-Kalenderzeit zurück
- POSIX time_t: vorzeichenbehaftet 32-Bit läuft am 2038-01-19 über; 64-Bit-time_t ist die moderne Lösung
Linux-Epoch-Zeit, Linux-Zeitstempel zu Zeit, Online-Linux-Konverter
Varianten: „linux epoch time“ (Unix-Zeit unter Linux), „linux timestamp to time“ (epoch → Wanduhr), „linux timestamp converter online“ (diese Seite).
- Linux epoch time / linux epoch time — dasselbe wie Unix-Zeit; aktueller Wert: date +%s
- Linux timestamp to time / linux timestamp to time — date -u -d @1700000000 gibt die UTC-Wanduhrzeit zurück
- Linux timestamp converter online / linux timestamp converter online — diese Seite ist das browserbasierte Äquivalent von date(1)
FAQ
- Welchen Typ sollte ich für Unix-Zeitstempel in C verwenden?
- Verwende time_t für Sekundenpräzision und int64_t (aus <stdint.h>), wenn du Millisekunden oder Nanosekunden speichern musst. Vermeide int oder long, weil ihre Größen plattformabhängig sind.
- Wie erhalte ich Millisekunden in C?
- Verwende clock_gettime(CLOCK_REALTIME, &ts) aus <time.h>. Das Ergebnis steht in ts.tv_sec (Sekunden) und ts.tv_nsec (Nanosekunden). Berechne Millisekunden als ts.tv_sec * 1000LL + ts.tv_nsec / 1000000.