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:
- Erweitertes Format (mit Trennzeichen):
2024-04-15 - 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: JahrWww: 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 Uhr09:05:30- 9:05:30 Uhr23: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 Sekunde14: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: JahreM: Monate (vor T)D: TageT: Zeitbezeichner (trennt Datum von Zeitkomponenten)H: StundenM: 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 (entsprichtP21D)
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:
| Funktion | ISO 8601 | RFC 3339 |
|---|---|---|
| Formatieren | YYYY-MM-DDTHH:MM:SS±HH:MM | Gleich |
| UTC | Z oder +00:00 | Beides erlaubt |
| Sekundenbruchteile | Optional, beliebige Präzision | Optional, beliebige Präzision |
| Separatoren | Kann weggelassen werden (Grundformat) | Erforderlich (erweitertes Format) |
| Zeittrennzeichen | T erforderlich | T oder Leerzeichen erlaubt |
Beispiel:
- ISO 8601:
2024-04-15T14:30:00Zoder20240415T143000Z - 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
- ISO 8601-Konverter – Konvertieren zwischen ISO 8601 und menschenlesbaren Formaten
- Unix-Zeitstempelkonverter – Konvertieren zwischen Unix-Zeitstempeln und ISO 8601
- Zeitzonenkonverter – Konvertieren Sie ISO 8601-Zeiten zwischen Zeitzonen
Bibliotheken und Pakete
| Sprache | Bibliothek | Beschreibung |
|---|---|---|
| JavaScript | date-fns | Moderne Dienstprogrammbibliothek |
| JavaScript | dayjs | Leichte Alternative zu moment.js |
| Python | datetime | Integrierte Standardbibliothek |
| Python | arrow | Bessere Daten und Zeiten |
| Java | java.time | Moderne Java-API für Datum/Uhrzeit |
| PHP | Carbon | Erweiterte DateTime-API |
| Geh | time | Standardbibliothek |
| Rubin | time | Standardbibliothek |
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
- Was ist Unix-Zeitstempel? - Erfahren Sie mehr über Unix-Zeitstempel und Epochenzeit
- Zeitzonen verstehen - Beherrschen Sie Zeitzonenkonzepte und Best Practices
- Timestamp Format Cheatsheet – Kurzreferenz für alle Zeitstempelformate
- Aktueller Unix-Zeitstempel – Erhalten Sie den aktuellen Zeitstempel in verschiedenen Formaten
- Datums-zu-Zeitstempel-Konverter - Datumsangaben in Zeitstempel konvertieren
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:SSZfür UTC-Zeiten - Fügen Sie Zeitzoneninformationen hinzu (
Zoder±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! 🚀