Guide

ISO 8601-Formathandbuch: Standard für Datum, Uhrzeit und Zeitzone

Was ist ISO 8601?

ISO 8601 ist ein internationaler Standard für die Darstellung von Datums- und Uhrzeitangaben in einem klaren, eindeutigen Format. Dieser von der International Organization for Standardization (ISO) herausgegebene Standard beseitigt Verwirrungen, die durch unterschiedliche Datumsformate auf der ganzen Welt verursacht werden (wie MM/TT/JJJJ vs. TT/MM/JJJJ) und bietet eine konsistente Möglichkeit, Datums- und Uhrzeitinformationen auszutauschen.

Das ISO 8601-Format wird häufig in APIs, Datenbanken und Webanwendungen verwendet, weil es:

  • Eindeutigkeit: Keine Verwirrung über die Reihenfolge von Tag/Monat
  • Sortierbar: Die lexikografische Sortierung funktioniert korrekt
  • Maschinenlesbar: Für Computer einfach zu analysieren
  • Menschenlesbar: Für Menschen immer noch verständlich
  • Universal: Funktioniert in allen Zeitzonen und an allen Orten

Warum das ISO 8601-Format verwenden?

Wenn Sie ein Datum wie 03/04/2024 sehen, bedeutet das dann den 4. März oder den 3. April? Verschiedene Länder interpretieren dies unterschiedlich. ISO 8601 löst dieses Problem durch die Verwendung des Formats 2024-04-03, das immer eindeutig ist: Jahr-Monat-Tag.

// Ambiguous formats (avoid these)
"03/04/2024"  // Is this March 4 or April 3?
"4-3-24"      // Is this 2024 or 1924?

// ISO 8601 format (recommended)
"2024-04-03"  // Always April 3, 2024
"2024-04-03T14:30:00Z"  // April 3, 2024, 2:30 PM UTC

ISO 8601-Datumsformate

Grundlegendes Datumsformat

Das standardmäßige ISO 8601-Datumsformat folgt dem Muster: YYYY-MM-DD

Beispiele:2024-01-15 – 15. Januar 2024 – 2024-12-31 – 31. Dezember 2024 – 2025-06-07 – 7. Juni 2025

# Python example
from datetime import date

today = date(2024, 4, 15)
iso_date = today.isoformat()  # "2024-04-15"
print(f"ISO 8601 date: {iso_date}")

Erweitertes vs. Basisformat

ISO 8601 unterstützt zwei Formate:

  1. Erweitertes Format (mit Trennzeichen): 2024-04-15
  2. Grundformat (kompakt): 20240415

Die meisten Anwendungen verwenden das erweiterte Format, da es besser lesbar ist.

// JavaScript example
const date = new Date('2024-04-15');

// Extended format (recommended)
const extended = date.toISOString().split('T')[0];  // "2024-04-15"

// Basic format (compact)
const basic = extended.replace(/-/g, '');  // "20240415"

Wochendaten

ISO 8601 unterstützt auch wochenbasierte Datumsangaben im Format: YYYY-Www-D

  • YYYY: Jahr
  • Www: Wochennummer (01-53)
  • D: Wochentag (1=Montag, 7=Sonntag)

Beispiel: 2024-W15-3 bedeutet Mittwoch der 15. Woche im Jahr 2024.

Ordnungsdaten

Sie können auch Ordnungsdaten (Tag des Jahres) verwenden: YYYY-DDD

Beispiel: 2024-366 bedeutet den 31. Dezember 2024 (Schaltjahr, also 366 Tage).


ISO 8601-Zeitformate

Grundlegendes Zeitformat

Das standardmäßige ISO 8601-Zeitformat lautet: HH:MM:SS oder HH:MM:SS.sss

Beispiele:

  • 14:30:00 - 14:30:00 Uhr
  • 09:05:30 - 9:05:30 Uhr
  • 23:59:59.999 - 23:59:59,999 Uhr mit Millisekunden
// Java example
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

LocalTime time = LocalTime.of(14, 30, 0);
String isoTime = time.format(DateTimeFormatter.ISO_LOCAL_TIME);
System.out.println("ISO 8601 time: " + isoTime);  // "14:30:00"

Sekundenbruchteile

ISO 8601 unterstützt Sekundenbruchteile mit unterschiedlicher Genauigkeit:

  • 14:30:00.5 – Eine halbe Sekunde
  • 14:30:00.123 – Millisekunden (3 Ziffern)
  • 14:30:00.123456 – Mikrosekunden (6 Ziffern)
  • 14:30:00.123456789 - Nanosekunden (9 Ziffern)
// Go example
package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    // ISO 8601 with milliseconds
    iso := now.Format("15:04:05.000")
    fmt.Println("ISO 8601 time:", iso)
}

ISO 8601 DateTime-Formate

Kombiniertes Datum und Uhrzeit

Um sowohl Datum als auch Uhrzeit darzustellen, verwendet ISO 8601 ein T-Trennzeichen: YYYY-MM-DDTHH:MM:SS

Beispiele:2024-04-15T14:30:00 – 15. April 2024 um 14:30 Uhr (Ortszeit) – 2024-12-31T23:59:59 – 31. Dezember 2024 um 23:59:59 Uhr

# Ruby example
require 'time'

datetime = Time.new(2024, 4, 15, 14, 30, 0)
iso_datetime = datetime.iso8601  # "2024-04-15T14:30:00+00:00"
puts "ISO 8601 datetime: #{iso_datetime}"

Das „T“-Trennzeichen

Das Zeichen T trennt das Datum von der Uhrzeit. Es ist im Standardformat erforderlich, einige Systeme akzeptieren jedoch aus Gründen der Lesbarkeit stattdessen ein Leerzeichen.

// PHP example
<?php
$datetime = new DateTime('2024-04-15 14:30:00');
$iso8601 = $datetime->format('c');  // "2024-04-15T14:30:00+00:00"
echo "ISO 8601 datetime: " . $iso8601;
?>

ISO 8601-Zeitzonenbezeichner

Eine der leistungsstärksten Funktionen von ISO 8601 ist die Unterstützung von Zeitzoneninformationen.

UTC-Zeit (Z-Bezeichner)

Das Suffix Z gibt UTC (koordinierte Weltzeit) an, auch „Zulu-Zeit“ genannt:

  • 2024-04-15T14:30:00Z - 14:30 Uhr UTC

Z ist eine Abkürzung für +00:00.

// JavaScript example
const utcDate = new Date('2024-04-15T14:30:00Z');
console.log(utcDate.toISOString());  // "2024-04-15T14:30:00.000Z"

// Always prefer ISO 8601 with Z for UTC times
const timestamp = Date.now();
const isoString = new Date(timestamp).toISOString();
console.log(isoString);  // "2024-04-15T14:30:00.123Z"

Zeitzonenversätze

Geben Sie für Nicht-UTC-Zeiten den Offset von UTC an: ±HH:MM

Beispiele:2024-04-15T14:30:00+05:30 – 14:30 Uhr in Indien (UTC+5:30) – 2024-04-15T14:30:00-04:00 – 14:30 Uhr Eastern Daylight Time (UTC-4)

  • 2024-04-15T14:30:00+00:00 - Identisch mit Z (UTC)
# Python example with timezone
from datetime import datetime, timezone, timedelta

# UTC time
utc_time = datetime(2024, 4, 15, 14, 30, 0, tzinfo=timezone.utc)
print(utc_time.isoformat())  # "2024-04-15T14:30:00+00:00"

# Custom timezone (UTC+5:30)
ist = timezone(timedelta(hours=5, minutes=30))
ist_time = datetime(2024, 4, 15, 14, 30, 0, tzinfo=ist)
print(ist_time.isoformat())  # "2024-04-15T14:30:00+05:30"

Ortszeit (kein Bezeichner)

Wenn keine Zeitzone angegeben ist, gilt die Zeit als Ortszeit:

2024-04-15T14:30:00 – 14:30 Uhr in der lokalen Zeitzone

Warnung: Vermeiden Sie die Verwendung der Ortszeit in APIs und Datenbanken. Geben Sie immer die Zeitzone an, um Unklarheiten zu vermeiden.


ISO 8601-Dauerformat

ISO 8601 definiert eine spezifische Notation für Dauern mit dem Präfix P (für „Periode“).

Dauerformat: P[n]Y[n]M[n]DT[n]H[n]M[n]S

  • P: Dauerbezeichner (erforderlich)
  • Y: Jahre
  • M: Monate (vor T)
  • D: Tage
  • T: Zeitbezeichner (trennt Datum von Zeitkomponenten)
  • H: Stunden
  • M: Minuten (nach T)
  • S: Sekunden

Beispiele für die Dauer

P3Y6M4DT12H30M5S  = 3 years, 6 months, 4 days, 12 hours, 30 minutes, 5 seconds
P1Y               = 1 year
P6M               = 6 months
P7D               = 7 days
PT2H30M           = 2 hours, 30 minutes
PT45S             = 45 seconds
P1DT12H           = 1 day, 12 hours
P0D               = 0 days (zero duration)
// JavaScript example (using date-fns or custom parsing)
function parseISO8601Duration(duration) {
    const regex = /P(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?)?/;
    const matches = duration.match(regex);

    return {
        years: parseInt(matches[1]) || 0,
        months: parseInt(matches[2]) || 0,
        days: parseInt(matches[3]) || 0,
        hours: parseInt(matches[4]) || 0,
        minutes: parseInt(matches[5]) || 0,
        seconds: parseInt(matches[6]) || 0
    };
}

const duration = parseISO8601Duration("P1DT2H30M");
console.log(duration);  // { years: 0, months: 0, days: 1, hours: 2, minutes: 30, seconds: 0 }

Wochendauer

Mit W können Sie die Dauer auch in Wochen ausdrücken:

  • P3W = 3 Wochen (entspricht P21D)

ISO 8601-Zeitintervalle

ISO 8601 unterstützt drei Möglichkeiten, Zeitintervalle auszudrücken:

1. Start- und Endzeiten

<start>/<end>

Beispiel: 2024-04-15T09:00:00Z/2024-04-15T17:00:00Z (9:00 bis 17:00 Uhr UTC)

2. Startzeit und Dauer

<start>/P<duration>

Beispiel: 2024-04-15T09:00:00Z/PT8H (9 Uhr UTC für 8 Stunden)

3. Dauer und Endzeit

P<duration>/<end>

Beispiel: PT8H/2024-04-15T17:00:00Z (8 Stunden enden um 17:00 Uhr UTC)

# Python example for intervals
from datetime import datetime, timedelta

start = datetime(2024, 4, 15, 9, 0, 0)
end = datetime(2024, 4, 15, 17, 0, 0)

# Calculate duration
duration = end - start
print(f"Duration: {duration}")  # 8:00:00

# ISO 8601 interval
interval = f"{start.isoformat()}/{end.isoformat()}"
print(f"Interval: {interval}")

ISO 8601 vs. RFC 3339

RFC 3339 ist ein Profil von ISO 8601, das häufig im Internet verwendet wird. Die Hauptunterschiede:

FunktionISO 8601RFC 3339
FormatierenYYYY-MM-DDTHH:MM:SS±HH:MMGleich
UTCZ oder +00:00Beides erlaubt
SekundenbruchteileOptional, beliebige PräzisionOptional, beliebige Präzision
SeparatorenKann weggelassen werden (Grundformat)Erforderlich (erweitertes Format)
ZeittrennzeichenT erforderlichT oder Leerzeichen erlaubt

Beispiel:

  • ISO 8601: 2024-04-15T14:30:00Z oder 20240415T143000Z
  • RFC 3339: 2024-04-15T14:30:00Z (nur erweitertes Format)

Die meisten modernen APIs verwenden RFC 3339, eine strikte Teilmenge von ISO 8601.


ISO 8601 Best Practices für Entwickler

1. Verwenden Sie immer UTC für die Speicherung

Speichern Sie alle Zeitstempel in UTC mit dem Z-Bezeichner:

// ✅ Good - Store in UTC
const timestamp = new Date().toISOString();  // "2024-04-15T14:30:00.123Z"

// ❌ Bad - Storing local time
const localTime = new Date().toString();  // "Mon Apr 15 2024 14:30:00 GMT+0500"

2. Geben Sie Zeitzoneninformationen an

Berücksichtigen Sie bei der Anzeige von Uhrzeiten immer die Zeitzoneninformation:

# ✅ Good - Includes timezone
"2024-04-15T14:30:00+05:30"

# ❌ Bad - Missing timezone
"2024-04-15T14:30:00"

3. Verwenden Sie das erweiterte Format

Bevorzugen Sie aus Gründen der Lesbarkeit das erweiterte Format (mit Trennzeichen):

// ✅ Good - Extended format
"2024-04-15T14:30:00Z"

// ❌ Bad - Basic format (hard to read)
"20240415T143000Z"

4. Präzision ist wichtig

Verwenden Sie die für Ihren Anwendungsfall geeignete Präzision:

// High precision for logging
"2024-04-15T14:30:00.123456789Z"

// Standard precision for most applications
"2024-04-15T14:30:00Z"

// Date only when time doesn't matter
"2024-04-15"

5. ISO 8601-Zeichenfolgen validieren

Validieren Sie ISO 8601-Strings immer vor dem Parsen:

// JavaScript validation
function isValidISO8601(dateString) {
    const iso8601Regex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})$/;
    if (!iso8601Regex.test(dateString)) return false;

    const date = new Date(dateString);
    return !isNaN(date.getTime());
}

console.log(isValidISO8601("2024-04-15T14:30:00Z"));  // true
console.log(isValidISO8601("2024-04-15 14:30:00"));   // false

Häufige ISO 8601-Fehler, die Sie vermeiden sollten

1. Das T-Trennzeichen fehlt

// ❌ Wrong
"2024-04-15 14:30:00Z"

// ✅ Correct
"2024-04-15T14:30:00Z"

2. Falsches Zeitzonenformat

# ❌ Wrong - Missing colon in offset
"2024-04-15T14:30:00+0530"

# ✅ Correct - Colon in offset
"2024-04-15T14:30:00+05:30"

3. Datumsformate mischen

// ❌ Wrong - US format
"04/15/2024T14:30:00Z"

// ✅ Correct - ISO 8601
"2024-04-15T14:30:00Z"

4. Weglassen führender Nullen

# ❌ Wrong
"2024-4-5T9:5:0Z"

# ✅ Correct
"2024-04-05T09:05:00Z"

ISO 8601 in verschiedenen Programmiersprachen

JavaScript / TypeScript

// Current time in ISO 8601
const now = new Date().toISOString();
console.log(now);  // "2024-04-15T14:30:00.123Z"

// Parse ISO 8601 string
const date = new Date("2024-04-15T14:30:00Z");

// Custom formatting (using Intl)
const formatter = new Intl.DateTimeFormat('en-US', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    timeZone: 'UTC',
    hour12: false
});

Python

from datetime import datetime, timezone

# Current time in ISO 8601
now = datetime.now(timezone.utc).isoformat()
print(now)  # "2024-04-15T14:30:00.123456+00:00"

# Parse ISO 8601 string
dt = datetime.fromisoformat("2024-04-15T14:30:00+00:00")

# Format as ISO 8601
formatted = dt.strftime("%Y-%m-%dT%H:%M:%S%z")

Java

import java.time.Instant;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

// Current time in ISO 8601
String now = Instant.now().toString();
System.out.println(now);  // "2024-04-15T14:30:00.123Z"

// Parse ISO 8601 string
ZonedDateTime dt = ZonedDateTime.parse("2024-04-15T14:30:00Z");

// Format as ISO 8601
String formatted = dt.format(DateTimeFormatter.ISO_INSTANT);

PHP

<?php
// Current time in ISO 8601
$now = date('c');  // "2024-04-15T14:30:00+00:00"

// Parse ISO 8601 string
$dt = new DateTime("2024-04-15T14:30:00Z");

// Format as ISO 8601
echo $dt->format(DateTime::ATOM);  // ISO 8601 format
?>

Gehen

package main

import (
    "fmt"
    "time"
)

func main() {
    // Current time in ISO 8601
    now := time.Now().UTC().Format(time.RFC3339)
    fmt.Println(now)  // "2024-04-15T14:30:00Z"

    // Parse ISO 8601 string
    dt, _ := time.Parse(time.RFC3339, "2024-04-15T14:30:00Z")
    fmt.Println(dt)
}

Rubin

require 'time'

# Current time in ISO 8601
now = Time.now.utc.iso8601
puts now  # "2024-04-15T14:30:00Z"

# Parse ISO 8601 string
dt = Time.iso8601("2024-04-15T14:30:00Z")

# Format as ISO 8601
formatted = dt.strftime("%Y-%m-%dT%H:%M:%S%z")

Tools für die Arbeit mit ISO 8601

Online-Konverter

Bibliotheken und Pakete

SpracheBibliothekBeschreibung
JavaScriptdate-fnsModerne Dienstprogrammbibliothek
JavaScriptdayjsLeichte Alternative zu moment.js
PythondatetimeIntegrierte Standardbibliothek
PythonarrowBessere Daten und Zeiten
Javajava.timeModerne Java-API für Datum/Uhrzeit
PHPCarbonErweiterte DateTime-API
GehtimeStandardbibliothek
RubintimeStandardbibliothek

Anwendungsfälle aus der Praxis

1. API-Antworten

{
  "id": "123",
  "created_at": "2024-04-15T14:30:00Z",
  "updated_at": "2024-04-15T15:45:00Z",
  "scheduled_at": "2024-04-20T09:00:00Z"
}

2. Datenbankspeicher

-- PostgreSQL with timezone
CREATE TABLE events (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    start_time TIMESTAMPTZ NOT NULL,  -- Stores in ISO 8601 with timezone
    end_time TIMESTAMPTZ NOT NULL
);

INSERT INTO events (name, start_time, end_time)
VALUES ('Meeting', '2024-04-15T14:30:00Z', '2024-04-15T15:30:00Z');

3. Protokolldateien

[2024-04-15T14:30:00.123Z] INFO: Application started
[2024-04-15T14:30:01.456Z] DEBUG: Loading configuration
[2024-04-15T14:30:02.789Z] INFO: Server listening on port 3000

4. Konfigurationsdateien

# config.yml
scheduled_tasks:
  - name: "Daily backup"
    schedule: "2024-04-15T02:00:00Z"
    interval: "P1D"  # ISO 8601 duration: 1 day

  - name: "Weekly report"
    schedule: "2024-04-15T09:00:00Z"
    interval: "P1W"  # ISO 8601 duration: 1 week

Häufig gestellte Fragen

Was bedeutet das „T“ in ISO 8601?

Das T ist ein Trennzeichen zwischen den Datums- und Uhrzeitkomponenten. Es steht für „Zeit“ und wird von der Norm ISO 8601 gefordert, um Mehrdeutigkeiten zu vermeiden.

Ist ISO 8601 dasselbe wie RFC 3339?

RFC 3339 ist ein Profil (Teilmenge) von ISO 8601, das für die Internetnutzung entwickelt wurde. RFC 3339 ist strenger und erfordert immer das erweiterte Format mit Trennzeichen, während ISO 8601 sowohl Basis- als auch erweiterte Formate zulässt.

Warum verwendet ISO 8601 die Reihenfolge JJJJ-MM-TT?

Diese Reihenfolge (von der größten zur kleinsten Einheit) ermöglicht eine natürliche Sortierung. Wenn Sie ISO 8601-Daten alphabetisch sortieren, werden sie automatisch chronologisch sortiert.

Kann ich Leerzeichen anstelle von „T“ verwenden?

Während einige Systeme Leerzeichen zur besseren Lesbarkeit akzeptieren, erfordert die ISO 8601-Norm das T-Trennzeichen. Für maximale Kompatibilität verwenden Sie immer T.

Welche Zeitzone sollte ich zum Speichern von Zeitstempeln verwenden?

Speichern Sie Zeitstempel in Datenbanken und APIs immer in UTC (mit dem Z-Bezeichner). Konvertieren Sie die Zeit nur in die Ortszeit, wenn sie Benutzern angezeigt wird.

Wie gehe ich mit der Sommerzeit um?

Speichern Sie alle Zeiten in UTC, um Probleme mit der Sommerzeit zu vermeiden. Verwenden Sie bei der Konvertierung in die Ortszeit geeignete Zeitzonenbibliotheken, die die Sommerzeit automatisch verarbeiten.

Was ist die maximale Präzision für Sekundenbruchteile?

ISO 8601 gibt keine maximale Genauigkeit an. Die meisten Systeme unterstützen Millisekunden (3 Ziffern), Mikrosekunden (6 Ziffern) oder Nanosekunden (9 Ziffern).

Kann ich Sekunden weglassen, wenn sie Null sind?

Während einige Systeme 2024-04-15T14:30Z akzeptieren, erfordert das strenge ISO 8601-Format Sekunden: 2024-04-15T14:30:00Z.


Verwandte Ressourcen


Fazit

ISO 8601 ist der Goldstandard für die Darstellung von Datum und Uhrzeit in Softwaresystemen. Durch die Einhaltung des ISO 8601-Formats stellen Sie sicher, dass Ihre Zeitstempel eindeutig, sortierbar und mit Systemen weltweit kompatibel sind.

Wichtige Erkenntnisse:

  • Verwenden Sie YYYY-MM-DDTHH:MM:SSZ für UTC-Zeiten
  • Fügen Sie Zeitzoneninformationen hinzu (Z oder ±HH:MM)
  • Zeitstempel in UTC speichern und in Ortszeit anzeigen
  • Validieren Sie ISO 8601-Zeichenfolgen vor dem Parsen
  • Verwenden Sie zur besseren Lesbarkeit ein erweitertes Format (mit Trennzeichen).

Die Beherrschung des ISO 8601-Formats ist für jeden Entwickler, der mit Datums- und Uhrzeitangaben arbeitet, unerlässlich. Unabhängig davon, ob Sie APIs erstellen, Daten speichern oder Protokolldateien analysieren, bietet ISO 8601 einen zuverlässigen, standardisierten Ansatz für die Zeitdarstellung.

Beginnen Sie noch heute mit der Verwendung von ISO 8601 in Ihren Projekten und beseitigen Sie Datums-/Uhrzeitunklarheiten für immer! 🚀