Um auf deinem Mac von einem UTC-Zeitstempel eine genaue Anzahl von Stunden abzuziehen, parse ihn mit seinem UTC-Offset, ziehe eine Zeitspanne ab und gib das Ergebnis ausdrücklich in UTC aus. Dieser Terminal-Workflow verwendet Python und ein synthetisches Veröffentlichungsdatum.

Die Aufgabe ist hier klar umrissen: Einen Veröffentlichungszeitstempel um eine nicht negative ganze Anzahl von Stunden zurücksetzen und dabei sowohl die Eingabe als auch die Ausgabe in UTC belassen. Zieht man beispielsweise von 2026-05-12T02:30:00Z sieben Stunden ab, ergibt sich 2026-05-11T19:30:00Z.

„Genau“ richtet sich nach Pythons dokumentiertem datetime-Modell: Eine Stunde entspricht 3.600 Sekunden, und Schaltsekunden werden nicht dargestellt. Dieser Workflow eignet sich daher für gewöhnliche Veröffentlichungszeitstempel. Für Berechnungen, bei denen Schaltsekunden mitgezählt werden müssen, ist ein anderes Zeitmodell erforderlich. Python-datetime-Dokumentation

Mit welcher Art von Datum beginnst du?

Unterscheide vor der Berechnung zwischen einem Kalenderdatum und einem Zeitstempel. Ein Datum wie 2026-05-12 sagt nicht aus, wann die Veröffentlichung stattfindet. Mitternacht hinzuzufügen oder die lokale Zeitzone deines Mac anzunehmen, würde Informationen einführen, die in der Eingabe nicht enthalten sind.

Begriff Synthetisches Beispiel Aussage
Kalenderdatum 2026-05-12 Ein Kalendertag ohne Uhrzeit oder Offset
Lokales Datum und lokale Uhrzeit 2026-05-12T02:30:00 Uhrzeitfelder ohne ausreichenden Kontext, um einen Zeitpunkt zu bestimmen
In UTC angegebener Zeitpunkt 2026-05-12T02:30:00Z Ein bestimmter Zeitpunkt
Numerischer Offset +00:00 Die angegebene Abweichung von UTC
Benannte Zeitzone Europe/Paris Regeln, die lokale Uhrzeitangaben UTC zuordnen

Ein Offset und eine benannte Zeitzone erfüllen unterschiedliche Zwecke. Ein numerischer Offset beschreibt den Bezug eines Zeitstempels zu UTC; eine benannte Zeitzone enthält Regeln, die je nach Datum variieren können. RFC 9557 definiert diese Unterschiede und erläutert, warum manche lokalen Uhrzeitangaben keinem oder mehreren Zeitpunkten entsprechen können. RFC 9557, Definitionen

Verwende für diese Aufgabe einen vollständigen Zeitstempel. Das folgende Programm akzeptiert großgeschriebenes T, Sekunden, einen optionalen Sekundenbruchteil mit ein bis sechs Stellen sowie entweder Z oder +00:00. Dies ist eine bewusst eingeschränkte Teilmenge von RFC 3339, dessen Zeitstempel-Grammatik auch andere Offsets und zusätzliche Nachkommastellen zulässt. RFC 3339, Datums-/Zeitformat

Wie ziehst du im Terminal Stunden ab?

Python auf deinem Mac vorbereiten

Öffne den Finder, gehe zu /Applications/Utilities und doppelklicke auf Terminal. Apple beschreibt dies als eine Möglichkeit, die Befehlszeilenanwendung zu öffnen. Terminal auf dem Mac öffnen oder beenden

Gib diesen Befehl ein und drücke Return:

python3 --version

Verwende für diese Anleitung Python 3.11 oder neuer. Falls kein geeigneter Interpreter verfügbar ist, befolge die offiziellen Installationsanweisungen für macOS: Lade ein unterstütztes Python-Installationsprogramm von der verlinkten macOS-Downloadseite herunter, öffne die .pkg-Datei und schließe die dokumentierten Installationsschritte ab. Öffne anschließend ein neues Terminalfenster und prüfe die Version erneut. Die Python-Dokumentation beschreibt sowohl die Installation als auch die Ausführung von Python in einer Shell. Python unter macOS verwenden

Die vollständige Berechnung ausführen

Kopiere den gesamten folgenden Block einschließlich der ersten und letzten Zeile ins Terminal und drücke dann Return. Ändere für eine weitere Berechnung vor dem Einfügen nur source_timestamp und hours_to_subtract. Setze den Zeitstempel in Anführungszeichen und gib die Stundenzahl als Ganzzahl ein.

python3 - <<'PY'
import re
from datetime import datetime, timedelta, timezone

source_timestamp = "2026-05-12T02:30:00Z"
hours_to_subtract = 7

def subtract_utc_hours(text, hours):
    if type(hours) is not int or hours < 0:
        raise ValueError("Hours must be a non-negative whole number.")

    match = re.fullmatch(
        r"[0-9]{4}-[0-9]{2}-[0-9]{2}T"
        r"[0-9]{2}:[0-9]{2}:[0-9]{2}"
        r"(?P<fraction>\.[0-9]{1,6})?(?:Z|\+00:00)",
        text,
    )
    if match is None:
        raise ValueError(
            "Use YYYY-MM-DDTHH:MM:SS, optionally .ffffff, "
            "ending in Z or +00:00."
        )

    normalized = text[:-1] + "+00:00" if text.endswith("Z") else text
    start = datetime.fromisoformat(normalized).astimezone(timezone.utc)
    try:
        result = start - timedelta(hours=hours)
    except OverflowError as exc:
        raise ValueError(
            "The duration or result is outside the supported range."
        ) from exc

    # Whole-hour subtraction leaves the fractional second unchanged.
    seconds_text = result.isoformat(timespec="seconds")
    return seconds_text[:-6] + (match.group("fraction") or "") + "Z"

try:
    print(subtract_utc_hours(source_timestamp, hours_to_subtract))
except ValueError as exc:
    raise SystemExit(f"Cannot subtract: {exc}")
PY

Die Ausgabe für den angegebenen synthetischen Veröffentlichungszeitstempel lautet:

2026-05-11T19:30:00Z

Dies ist ein vollständiges Programm, das Pythons Standardbibliothek verwendet. Es gibt den berechneten Zeitstempel aus, ohne eine Datei zu erstellen. Kopiere das Ergebnis in das Veröffentlichungsdatumsfeld oder das Dokument, das du gerade vorbereitest.

Die API-Abfolge lautet datetime.fromisoformat(), Umwandlung in timezone.utc, Subtraktion von timedelta(hours=hours) und Ausgabe über isoformat(). Python dokumentiert diese Parsing-, Zeitzonen-, Zeitspannen- und Formatierungsoperationen. Python-datetime-APIs

Wie bewahrt das Programm UTC und Sekundenbruchteile?

Die Eingabeprüfung verlangt eine ausdrückliche UTC-Darstellung. Ein Zeitstempel ohne Offset wird sofort zurückgewiesen, sodass das Programm keine Zeitzone aus den Einstellungen deines Mac ableiten muss. Beide akzeptierten Suffixe werden als Zeitstempel mit Offset null geparst, und die Ausgabe wird einheitlich mit Z geschrieben.

UTC beizubehalten bedeutet nicht, jedes Zeichen der ursprünglichen Zeichenfolge beizubehalten. Eine Eingabe mit dem Ende +00:00 wird mit dem Ende Z ausgegeben. Das Ergebnis behält die UTC-Darstellung bei, während Datum und Uhrzeit um die angeforderte Zeitspanne zurückgesetzt werden.

Das Programm bewahrt auch den eingegebenen Sekundenbruchteil. Beim Abziehen ganzer Stunden bleibt dieser unverändert. Daher bleibt .120 gleich .120, statt zu .12 zu werden oder ganz zu verschwinden. Eingaben mit mehr als sechs Nachkommastellen werden zurückgewiesen und nicht gekürzt.

Dabei gibt es eine wichtige Feinheit in den Standards: Z steht für einen UTC-Offset von null, legt aber nicht die Zeitzone des Ursprungsorts fest. RFC 9557 aktualisiert die Interpretation von Z in RFC 3339 und erlaubt, dass der lokale Offset als unbekannt gilt. Dieses Programm akzeptiert absichtlich Z und +00:00; -00:00 wird aufgrund der gewählten Eingaberichtlinie zurückgewiesen. RFC 9557, Aktualisierung von RFC 3339

Wie kannst du das Ergebnis vor der Verwendung prüfen?

Beginne mit einer Berechnung, die über Mitternacht hinweggeht. Im Hauptbeispiel führt eine Rückrechnung um zwei Stunden zu 00:30:00 am 12. Mai; fünf weitere Stunden zurück führen zu 19:30:00 am 11. Mai. Ein Ergebnis, das beim 12. Mai bleibt, wäre falsch.

Diese synthetischen Beispiele bieten zusätzliche Prüfungen. Ändere die beiden Eingabewerte im vollständigen Programm, um jede Tabellenzeile nachzuvollziehen.

UTC-Eingabe Abgezogene Stunden Erwartete UTC-Ausgabe
2026-05-12T02:30:00Z 7 2026-05-11T19:30:00Z
2026-01-01T00:15:00+00:00 1 2025-12-31T23:15:00Z
2028-03-01T00:30:00Z 1 2028-02-29T23:30:00Z
2026-05-12T02:30:00.120Z 7 2026-05-11T19:30:00.120Z
2026-05-12T02:30:00Z 0 2026-05-12T02:30:00Z

Im Hauptbeispiel beträgt die Zeitspanne sieben mal 3.600, also 25.200 Sekunden. Minuten und Sekunden bleiben unverändert, da die angeforderte Zeitspanne nur ganze Stunden umfasst. Das Datum kann sich beim Überschreiten von Mitternacht, eines Monats- oder Jahreswechsels ändern.

Was solltest du tun, wenn die Eingabe zurückgewiesen wird?

Nutze die Zurückweisung als Diagnoseschritt. Kläre die fehlenden Informationen oder die nicht unterstützte Genauigkeit, bevor du es erneut versuchst.

  • Es ist nur ein Datum verfügbar: Ermittle die vorgesehene Veröffentlichungszeit und ihren Offset. Ein Kalenderdatum allein kann den Ausgangszeitpunkt nicht bestimmen.
  • Der Zeitstempel hat keinen Offset: Kläre, ob er UTC oder Ortszeit darstellt, bevor du ein Suffix hinzufügst.
  • Der Zeitstempel hat einen Offset ungleich null: Wandle den dargestellten Zeitpunkt zuerst in UTC um. Nur das Suffix zu ändern, würde seine Bedeutung verändern.
  • Es gibt mehr als sechs Nachkommastellen: Verwende ein Werkzeug, das diese Genauigkeit beibehält, oder lege eine ausdrückliche Rundungsregel fest, bevor du diesen Workflow verwendest.
  • Die Stundenzahl ist negativ oder ein Bruch: Gib eine nicht negative Ganzzahl ein. Dieses Programm ist bewusst auf das Abziehen ganzer Stunden ausgelegt.
  • Die Kalenderfelder sind ungültig: Korrigiere den Ausgangswert. Ein unmögliches Datum wie der 30. Februar wird zurückgewiesen.

Python unterstützt datetime-Jahre von 1 bis 9999; eine Subtraktion außerhalb dieses Bereichs schlägt fehl. Das datetime-Modell weist auch ein Sekundenfeld mit dem Wert 60 zurück, obwohl RFC 3339 diesen Wert unter bestimmten Bedingungen für eine Schaltsekunde zulässt. Grenzen von Python datetime, RFC 3339, Einschränkungen

Wenn deine eigentliche Anforderung „dieselbe lokale Uhrzeit am vorherigen Tag“ lautet, verwende einen kalenderbasierten Workflow mit benannter Zeitzone. Benannte Zeitzonen können bei Umstellungen auf die Sommerzeit ihren Offset ändern. Daher kann sich diese Aufgabe vom Abziehen von 24 verstrichenen Stunden unterscheiden. Pythons Dokumentation zu zoneinfo veranschaulicht Rechenoperationen über solche Umstellungen hinweg. Python-Unterstützung für IANA-Zeitzonen

Wenn dein Veröffentlichungszeitstempel bereits in UTC angegeben ist, halte den Vorgang einfach: Prüfe die Eingabe, ziehe die Zeitspanne in ganzen Stunden ab und behalte das ausdrückliche UTC-Suffix im Wert bei, den du kopierst. Prüfe vor der Verwendung des Ergebnisses den Datumswechsel und die Genauigkeit der Nachkommastellen.

Quellen