Wann du Datum zu Epoch in Code umwandeln musst
Die meisten Apps speichern Timestamps als Unix-Integer, erhalten Datumsangaben aber als Strings — ein Kalenderwert aus einem Formular, eine Datumsspalte in einer CSV, ein Webhook-Feld in einer bestimmten Zeitzone. Diese Strings im Code in Epoch umzuwandeln ist das, was es Datenbanken erlaubt sie zu sortieren, Services sie zu vergleichen und APIs sie zu akzeptieren. Diese Anleitung zeigt den idiomatischen Weg in JavaScript, Python, SQL, Go und Shell, plus die Zeitzonen-Bugs, denen jedes Team früher oder später begegnet.
JavaScript: Date, getTime und zonenbasierte Eingabe
JavaScript speichert Zeit in Millisekunden. Date.UTC liefert das Epoch in ms für eine UTC-Wanduhrzeit. Für einen ISO-8601-String mit explizitem Offset nutze new Date(iso).getTime(). Durch 1000 teilen ergibt Sekunden.
- Date.UTC(2026, 0, 1, 0, 0, 0) → 1767225600000 (month is zero-indexed)
- new Date('2026-01-01T08:00:00-05:00').getTime() → 1767265200000
- Math.floor(Date.now() / 1000) → current Unix seconds
- Wall-clock in a non-UTC zone needs a zone-aware library (Luxon, date-fns-tz, Temporal)
Python: datetime.timestamp und calendar.timegm
Pythons datetime-Objekt wird per .timestamp() in Epoch umgewandelt — aber nur, wenn es timezone-aware ist. Ein naives datetime wird als lokale Zeit des Hosts interpretiert, was die häufigste Ursache für falsche Epoch-Werte in Produktion ist.
- datetime(2026, 1, 1, tzinfo=timezone.utc).timestamp() → 1767225600.0
- calendar.timegm(struct_time) → seconds (UTC-only)
- datetime.now(ZoneInfo('America/New_York')).timestamp() → zone-aware now
- Avoid datetime.fromisoformat(s).timestamp() when s has no offset
SQL: EXTRACT EPOCH, UNIX_TIMESTAMP, UNIX_SECONDS
Jede große Datenbank bietet eine Funktion, um ein Epoch-Integer aus einer Timestamp-Spalte zu erzeugen. Behandle die Zeitzone der Spalte explizit: TIMESTAMP WITH TIME ZONE und TIMESTAMP WITHOUT TIME ZONE verhalten sich in diesen Funktionen sehr unterschiedlich.
- PostgreSQL: EXTRACT(EPOCH FROM ts) → seconds (double)
- MySQL: UNIX_TIMESTAMP(ts) → seconds, naive ts read in session timezone
- BigQuery: UNIX_SECONDS(ts) / UNIX_MILLIS(ts) — TIMESTAMP only
- SQLite: strftime('%s', ts) → seconds as string, cast to integer
Go und Shell: time.Unix und date +%s
In Go parst du mit einem Layout, das den Offset enthält, und rufst dann .Unix() für Sekunden oder .UnixMilli() für Millisekunden auf. In der Shell versteht GNU date -d gängige Datums-Strings, BSD/macOS date -j -f braucht ein explizites Format.
- Go: t, _ := time.Parse(time.RFC3339, "2026-01-01T00:00:00Z"); t.Unix()
- Go: time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC).Unix()
- GNU date: date -d "2026-01-01 00:00:00 UTC" +%s
- macOS date: date -j -u -f "%Y-%m-%d %H:%M:%S" "2026-01-01 00:00:00" +%s
FAQ
- How do I convert time to epoch time?
- Choose the date, clock time, and timezone, then convert that instant to Unix seconds or milliseconds. If the timezone is missing, the result may be off by hours.
- Is timestamp to epoch the same as date to epoch?
- Usually yes. It means converting a readable timestamp or date-time string into an epoch number.
- Should I send epoch seconds or milliseconds to an API?
- Follow the API documentation. If it says Unix timestamp, it often means seconds, but JavaScript-oriented APIs may expect milliseconds.
- Why does the same date give a different epoch in different timezones?
- Because a local wall-clock time only identifies an instant once a timezone is attached. 2026-01-01 00:00 is 1767225600 in UTC but 1767243600 in New York — five hours later in real time. Set the timezone before converting.