Guide

Arbeiten mit UTC-Zeitstempeln – Vollständige Anleitung

Einführung

UTC (koordinierte Weltzeit) ist die Standardzeitreferenz, die in Computern und Netzwerken verwendet wird. Für die Entwicklung von Anwendungen, die über mehrere Zeitzonen hinweg funktionieren und genaue Zeitberechnungen erfordern, ist es wichtig zu verstehen, wie man mit UTC-Zeitstempeln arbeitet.

UTC verstehen

Was ist UTC-Zeit?

UTC ist ein Zeitstandard, der:

  • Hat keinen Zeitzonenversatz (keine Sommerzeit)
  • Verwendet ein 24-Stunden-Uhrformat (00:00:00 bis 23:59:59,999) – Wird in ISO 8601 als „Z“ dargestellt (z. B. 2025-01-07T12:00:00.000Z)
  • Dient als Grundlage für alle anderen Zeitzonen

UTC vs. Ortszeit

Entscheidendes Konzept: Die Ortszeit variiert je nach geografischem Standort und Zeitzone. UTC ist weltweit konstant.

CharakteristischUTC-ZeitOrtszeit
ZeitzonenversatzImmer UTC+00:00Variiert je nach Standort (z. B. UTC-5, UTC+8, UTC-10)
SommerzeitKeine DST-AnpassungenVariiert je nach Saison und Region
KonsistenzGlobal konsistentUnterschiedliche Systeme können unterschiedliche Ortszeiten haben
Primärer AnwendungsfallGlobale Systeme, Datenbanken, APIsBenutzerorientierte Anwendungen, Kalenderereignisse
SpeichergrößeWie jeder Zeitstempel (kein zusätzlicher Overhead)Identisch mit DateTime (größerer Speicher)
AbfrageleistungAusgezeichnet (numerische Vergleiche)Langsam (erfordert Datum/Uhrzeit-Analyse)

Warnung: Speichern Sie immer UTC-Zeitstempel in Ihrer Datenbank. Konvertieren Sie die Uhrzeit nur zu Anzeigezwecken in die Ortszeit.

UTC-Zeitstempelformat

ISO 8601

UTC-Zeitstempel in ISO 8601 enden immer mit „Z“:

2025-01-07T12:00:00.000Z  // January 7, 2025, 12:00:00 UTC

Unix-Zeitstempel

UTC-Zeitstempel sind die Anzahl der Sekunden seit der Unix-Epoche (1970-01-01 00:00:00 UTC):

1735689600 // January 1, 2025, 00:00:00 UTC

Konvertieren von UTC in Ortszeit

JavaScript

// Convert UTC timestamp (seconds) to local time
function utcToLocal(utcTimestampSeconds, timezoneOffsetHours = 0) {
  const date = new Date(
    (utcTimestampSeconds * 1000) + (timezoneOffsetHours * 60 * 60 * 1000),
  );
  return date.toLocaleString(); // Returns string like "1/7/2025, 6:12:00 PM"
}

// Get UTC timestamp and convert to local
const now = Math.floor(Date.now() / 1000);
console.log(utcToLocal(now, -5)); // UTC-5 for EST

Python

from datetime import datetime, timezone
from zoneinfo import ZoneInfo

# Convert UTC to specific timezone
def utc_to_local(utc_timestamp: int, timezone_str: str) -> datetime:
    """
    Convert UTC timestamp to local datetime in specified timezone.

    Args:
        utc_timestamp: Unix timestamp in seconds
        timezone_str: IANA timezone name (e.g., 'America/New_York')

    Returns:
        Local datetime object
    """
    utc_time = datetime.fromtimestamp(utc_timestamp, tz=timezone.utc)
    return utc_time.astimezone(ZoneInfo(timezone_str))

# Example
print(utc_to_local(1735689600, "America/Los_Angeles"))

SQL

-- MySQL: Convert UTC timestamp to datetime
-- Note: Use FROM_UNIXTIME() which respects the system timezone setting

-- Convert UTC timestamp to MySQL DATETIME
SELECT 
  id,
  FROM_UNIXTIME(created_at) AS mysql_datetime,
  created_at
FROM events
WHERE id = ?;

-- Store current UTC timestamp
UPDATE events
SET created_at = UNIX_TIMESTAMP(NOW());

-- PostgreSQL: Use TIMESTAMPTZ for timezone-aware storage
CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  event_timestamp TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  event_date TIMESTAMP WITH TIME ZONE 'UTC'
);

-- Query events with local time display
SELECT 
  id,
  event_timestamp,
  TO_CHAR(event_timestamp, 'YYYY-MM-DD HH24:MI:SS') AS local_time
FROM events;

Best Practice: Speichern Sie immer UTC-Zeitstempel. Verwenden Sie die Zeitzonenkonvertierung auf Anwendungsebene nur für die Anzeige.

Zeitzonenbehandlung

Zeitzonenversätze verstehen

Zeitzonenversätze werden wie folgt ausgedrückt:

  • UTC+XX:00 (z. B. UTC-5:00)
  • UTC-XX:00 (z. B. UTC+8:00)
VersatzStundenStadtRegion
UTC-5:00-5New York, Toronto, Bogota, LimaEastern Standard Time
UTC-8:00-8Los Angeles, San Francisco, TijuanaPazifische Standardzeit
UTC+0:000London, Dublin, LissabonWesteuropäische Zeit
UTC+1:00+1Paris, Berlin, RomMitteleuropäische Zeit
UTC+8:00+8Singapur, Hongkong, PerthChinesische Standardzeit
UTC+9:00+9Tokio, Seoul, PjöngjangJapanische Standardzeit
UTC+10:00+10Sydney, Melbourne, BrisbaneAustralische Oststandardzeit
UTC+12:00+12AucklandNeuseeländische Standardzeit

Beispiele für die Zeitzonenkonvertierung

JavaScript-Zeitzonenkonvertierungen

// Convert between UTC and different timezones
function convertToTimezone(utcDate, timezone) {
  const options = { timeZone: timezone };
  return utcDate.toLocaleString('en-US', options);
}

// Examples
const utcDate = new Date('2025-01-07T12:00:00.000Z');

console.log(convertToTimezone(utcDate, 'America/New_York'));    // "1/7/2025, 7:00:00 AM EST"
console.log(convertToTimezone(utcDate, 'Asia/Tokyo'));      // "2025/1/7, 21:00:00 JST"
console.log(convertToTimeDate, 'Europe/London'));     // "1/7/2025, 12:00:00 GMT"
console.log(convertToTimezone(utcDate, 'Asia/Shanghai'));   // "2025/1/7, 20:00:00 CST"
// Python timezone handling
from datetime import datetime, timezone

# Get current UTC time and convert to timezone
now_utc = datetime.now(timezone.utc)

# Convert to specific timezone
now_tokyo = now_utc.astimezone('Asia/Tokyo')
now_est = now_utc.astimezone('America/New_York')
now_gmt = now_utc.astimezone('Etc/GMT')

print(f"UTC: {now_utc}")
print(f"Tokyo: {now_tokyo}")
print(f"EST: {now_est}")
print(f"GMT: {now_gmt}")

Best Practices

UTC-Speicherrichtlinien

Speicher: Speichern Sie immer UTC-Zeitstempel. Sie sind zeitzonenunabhängig und effizient für globale Anwendungen.

Anzeige: Nur auf der UI-Ebene in die lokale Zeitzone konvertieren. Speichern Sie niemals Ortszeiten zurück in der Datenbank.

Abfragen: Filtern und sortieren Sie immer nach UTC-Zeitstempeln. Dies gewährleistet eine konsistente Reihenfolge unabhängig von der Zeitzone des Benutzers.

APIs: Verwenden Sie in API-Antworten immer UTC-Zeitstempel. Dokumentieren Sie die Zeitzone in der API-Dokumentation.

Kritische Warnung: Mischen Sie niemals UTC-Zeitstempel mit lokalen Zeitstempeln in derselben Spalte. Dies führt zu Datenintegritätsproblemen und Abfrageinkonsistenzen.

Häufige Fallstricke

Falle 1: Zeitzonen vergessen

Problem: Nicht alle Standorte beachten die Sommerzeit gleichzeitig.

Beispiel: In Arizona gibt es keine Sommerzeit, in New York jedoch schon. Dies kann in bestimmten Zeiträumen zu Abweichungen von einer Stunde führen.

Lösung: Verwenden Sie IANA-Zeitzonendatenbanken (TZ-Datenbank), die historische und aktuelle Sommerzeitregeln enthalten.

Fallstrick 2: Falsche Zeitzonenversätze

Problem: Verwendung fest codierter Offsets anstelle von Zeitzonennamen.

Schlecht: const offset = -5 * 3600000; // EST ist immer -5, aber Arizona beachtet die Sommerzeit nicht

Gut: const offset = 'America/New_York'; // Verwendet die IANA-Datenbank mit korrekter historischer Sommerzeit

Fallstrick 3: Angenommen, alle Zeiten haben das gleiche Format

Problem: Nicht alle Systeme verwenden UTC (z. B. verwenden einige GMT, andere UTC+X).

Beispiel: Unix-Zeitstempel basieren immer auf UTC, Dateisysteme können jedoch variieren.

Lösung: Geben Sie beim Parsen von Benutzereingaben immer explizit die Zeitzone an.

Arbeiten mit verschiedenen Zeitzonen

JavaScript

// Best practice: Always specify timezone when creating dates
const date1 = new Date('2025-01-07T12:00:00'); // UTC time (good)

const date2 = new Date('2025-01-07T12:00:00-08:00'); // Bad: assumes local timezone

// Convert between timezones
function convertTimezones(fromDate, fromTz, toTz) {
  return {
    fromTime: fromDate.toLocaleString('en-US', { timeZone: fromTz }),
    toTime: fromDate.toLocaleString('en-US', { timeZone: toTz }),
    fromTimestamp: fromDate.getTime(),
    toTimestamp: fromDate.toLocaleString('en-US', { timeZone: toTz }),
  };
}

// Example: Convert UTC to multiple timezones
const utcDate = new Date('2025-01-07T12:00:00.000Z');
const conversions = [
  convertTimezones(utcDate, 'UTC', 'America/New_York'),
  convertTimezones(utcDate, 'UTC', 'Asia/Tokyo'),
  convertTimezones(utcDate, 'UTC', 'Europe/London'),
];

Python

from datetime import datetime, timezone

# Best practice: Use pytz library
import pytz

def convert_to_timezone(utc_time: datetime, timezone: str) -> datetime:
    """
    Convert UTC datetime to specified timezone using IANA timezone database.

    Args:
        utc_time: UTC datetime object
        timezone_str: IANA timezone name

    Returns:
        Localized datetime object
    """
    utc_time = utc_time.replace(tzinfo=timezone.tzinfo(utc_time))
    return utc_time.astimezone(timezone)

# Example: Convert current UTC to multiple timezones
now_utc = datetime.now(timezone.utc)
now_est = now_utc.astimezone('America/New_York')
now_gmt = now_utc.astimezone('Etc/GMT')
now_tokyo = now_utc.astimezone('Asia/Tokyo')

print(f"UTC: {now_utc}")
print(f"EST: {now_est}")
print(f"GMT: {now_gmt}")
print(f"JST: {now_tokyo}")

Best Practices für Zeitzonen

Richtlinien zur Zeitzonenauswahl

<ol> <li>Verwenden Sie immer IANA-Zeitzonennamen (z. B. „Amerika/New_York“, „Europa/London“)</li> <li>Verwenden Sie Zeitzonendatenbanken (IANA tz-Datenbank, tz-Datenbank) anstelle von fest codierten Offsets</li> <li>Testen Sie die Sommerzeitübergänge in Ihren Zielregionen (insbesondere Frühling und Herbst)</li> <li>Dokumentieren Sie Ihre Zeitzonenannahmen klar in der API-Dokumentation</li> <li>Erwägen Sie die Verwendung von UTC für alle internen Speicher und Berechnungen</li> <li>Zeitzonennamen und Ortszeiten separat in der Benutzeroberfläche anzeigen (UTC intern speichern)</li> </ol>

Tools und Referenzen

Verwandte Tools

Zusammenfassung

Wichtiges zum Mitnehmen: Speichern Sie immer UTC-Zeitstempel. Behandeln Sie die Zeitzonenkonvertierung auf der Anwendungs- oder Abfrageebene. Dies stellt die Datenkonsistenz sicher und macht Ihre Anwendung global kompatibel.

Kritisch: Mischen Sie niemals UTC- und lokale Zeitstempel im Datenbankspeicher. Speichern Sie immer UTC und konvertieren Sie es nur bei Bedarf in lokal.

Leistungstipp: UTC-Zeitstempel sind ideal für:

  • Datenbankindizierung (numerische Vergleiche)
  • Bereichsabfragen (numerische Filter)
  • Sortieroperationen (numerische Reihenfolge)
  • Zeitbasierte Partitionierung

Codebeispiel-Repository

Weitere Beispiele für Zeitstempel- und Zeitzonencodes finden Sie in unseren zugehörigen Tools und Anleitungen für die Arbeit mit bestimmten Anwendungsfällen: