Um aus einem Veröffentlichungsdatum und einer benannten Zeitzone einen exakten Mitternachtszeitpunkt zu ermitteln, lösen Sie die lokale Zeit 00:00:00 anhand der Regeln dieser Zeitzone auf, prüfen Sie, ob sie existiert, und wandeln Sie sie anschließend in UTC um. Dieser Mac-Terminal-Workflow erkennt auch doppelt auftretende Mitternächte.
Angenommen, ein synthetischer Veröffentlichungseintrag enthält das Datum 2025-07-15 und die Zeitzone America/New_York. Ihre Aufgabe ist es, den Zeitstempel für Mitternacht zu Beginn dieses Datums zu berechnen. Der folgende Workflow erzeugt einen Zeitstempel, den Sie in ein Tool kopieren können, das UTC akzeptiert. Dabei bleiben das ursprüngliche Datum und die Zeitzone zur Überprüfung sichtbar.
Welche Informationen bestimmen einen Mitternachtszeitpunkt?
Halten Sie diese vier Werte während der gesamten Berechnung getrennt:
| Wert | Synthetisches Beispiel | Bedeutung |
|---|---|---|
| Kalenderdatum | 2025-07-15 |
Ein Datum im gregorianischen Kalender ohne Uhrzeit oder Zeitzone |
| Lokales Datum und lokale Uhrzeit | 2025-07-15T00:00:00 |
Die angeforderte Anzeige der Wanduhr |
| Benannte Zeitzone | America/New_York |
Die Regeln, nach denen diese lokale Zeit interpretiert wird |
| Aufgelöster Zeitpunkt | 2025-07-15T04:00:00Z |
Ein bestimmter Zeitpunkt, ausgedrückt in UTC |
Python stellt ein Kalenderdatum mit date dar, kombiniert Datums- und Uhrzeitfelder mit datetime und verwendet Zeitzoneninformationen, um ein zeitzonenbewusstes datetime zu interpretieren. Die Klasse timezone steht für feste Offsets; zoneinfo stellt Regeln für benannte Zeitzonen bereit. Siehe die offizielle datetime-Dokumentation und die zoneinfo-Dokumentation.
Ein Offset wie -04:00 ist die Differenz zwischen der lokalen Uhrzeit und UTC für eine bestimmte Zeitangabe. Eine benannte Zeitzone enthält Regeln, die an verschiedenen Tagen unterschiedliche Offsets ergeben können. RFC 9557 erläutert, warum das Ersetzen einer benannten Zeitzone durch einen festen Offset zu fehlerhaften späteren Berechnungen führen kann. Behalten Sie den Zeitzonennamen bei, statt einen Offset aus einem anderen Veröffentlichungseintrag zu übernehmen. RFC 9557: Datum und Uhrzeit im Internet: Zeitstempel mit zusätzlichen Informationen
Für diese Aufgabe bedeutet „Mitternacht“ exakt 00:00:00 zu Beginn des angegebenen Datums. Machen Sie diese Anforderung vor jeder Berechnung ausdrücklich klar: Eine Anfrage nach dem ersten gültigen Zeitpunkt eines Kalendertags erfordert eine andere Regel, wenn Mitternacht fehlt.
Warum muss Mitternacht vor der Umrechnung überprüft werden?
Änderungen der lokalen Uhrzeit können eine Lücke erzeugen, in der eine Wanduhrzeit nicht vorkommt, oder eine Überlappung, in der sie zweimal vorkommt. Pythons PEP 495 definiert diese Fälle und stellt das Attribut fold bereit, mit dem sich wiederholte Uhrzeiten unterscheiden lassen. Außerdem wird dort dokumentiert, dass Konstruktoren und replace() fehlende lokale Uhrzeiten nicht automatisch zurückweisen. Das Anhängen einer Zeitzone allein validiert die angeforderte Mitternacht daher nicht. PEP 495 – Unterscheidung lokaler Uhrzeiten
Verwenden Sie für die Anforderung eines exakten Mitternachtszeitpunkts zur Veröffentlichung folgende Entscheidungsregel:
| Gefundene gültige Mitternachtszeitpunkte | Interpretation | Aktion |
|---|---|---|
| Einer | Mitternacht ist eindeutig | Diesen Zeitpunkt zurückgeben |
| Zwei | Mitternacht tritt zweimal auf | Zurückweisen, bis eine Regel für früher/später gewählt wurde |
| Keiner | Die genaue Mitternacht fehlt | Melden, dass die Anforderung mit diesen Eingaben nicht erfüllt werden kann |
Das folgende Programm setzt diese Regel um, indem es beide Fold-Werte ausprobiert, jeden Kandidaten in UTC umwandelt und ihn anschließend zurück in die benannte Zeitzone umwandelt. Ein Kandidat bleibt nur dann gültig, wenn seine zurückgegebenen lokalen Felder exakt der angeforderten Mitternacht entsprechen. Doppelte UTC-Ergebnisse werden zu einem Kandidaten zusammengefasst. Diese Prüfsequenz leitet sich aus dem dokumentierten Umwandlungs- und Fold-Verhalten ab; sie ist zusätzliche Anwendungslogik. datetime.astimezone(), PEP 495
Wie führen Sie die Berechnung im Mac-Terminal aus?
Öffnen Sie Spotlight, geben Sie Terminal ein und öffnen Sie die App. Alternativ können Sie Finder öffnen, zu /Applications/Utilities navigieren und auf Terminal doppelklicken. Dies sind die von Apple dokumentierten Möglichkeiten, ein Befehlsfenster zu öffnen. Terminal auf dem Mac öffnen oder beenden
Führen Sie folgenden Befehl aus, um Ihre Python-Version zu prüfen:
python3 --version
Dieses Beispiel erfordert Python 3.9 oder höher, da zoneinfo ab dieser Version verfügbar ist. Falls Python fehlt oder älter ist, folgen Sie der offiziellen Installationsanleitung für macOS, um ein aktuell unterstütztes Python-Installationsprogramm von Python.org zu beziehen, und wiederholen Sie anschließend die Versionsprüfung. Der Workflow verwendet Module aus der Standardbibliothek. zoneinfo — Unterstützung für IANA-Zeitzonen, Python unter macOS verwenden
Kopieren Sie den gesamten folgenden Block ins Terminal und drücken Sie Return. Er ist ein vollständiger Befehl, der das Python-Programm enthält. Um einen anderen Veröffentlichungszeitstempel zu berechnen, ändern Sie vor dem Einfügen DATE_TEXT und ZONE_NAME. Lassen Sie REPEATED auf reject, sofern Sie sich nicht bewusst für eine Regel bei wiederholter Mitternacht entschieden haben.
python3 - <<'PY'
from datetime import date, datetime, time, timezone
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
DATE_TEXT = '2025-07-15'
ZONE_NAME = 'America/New_York'
REPEATED = 'reject' # 'reject', 'earlier', or 'later'
def resolve_midnight(date_text, zone_name, repeated='reject'):
if repeated not in {'reject', 'earlier', 'later'}:
raise ValueError('Repeated-time policy must be reject, earlier, or later.')
day = date.fromisoformat(date_text)
if day.isoformat() != date_text:
raise ValueError('Use a date in YYYY-MM-DD format.')
zone = ZoneInfo(zone_name)
wall = datetime.combine(day, time.min)
candidates = set()
for fold in (0, 1):
guess = wall.replace(tzinfo=zone, fold=fold)
instant = guess.astimezone(timezone.utc)
back = instant.astimezone(zone)
if back.replace(tzinfo=None) == wall:
candidates.add(instant)
ordered = sorted(candidates)
if not ordered:
raise ValueError('Exact midnight does not exist on this date in this zone.')
if len(ordered) == 2 and repeated == 'reject':
choices = ', '.join(x.isoformat() for x in ordered)
raise ValueError(
'Midnight repeats. Choose earlier or later. UTC choices: ' + choices
)
chosen = ordered[-1] if repeated == 'later' else ordered[0]
return chosen.astimezone(zone), chosen
try:
local, utc = resolve_midnight(DATE_TEXT, ZONE_NAME, REPEATED)
except ZoneInfoNotFoundError:
raise SystemExit(
'Zone not found. Check the IANA name and time zone data installation.'
)
except (ValueError, OverflowError) as exc:
raise SystemExit(str(exc))
print('Civil date:', DATE_TEXT)
print('Named zone:', ZONE_NAME)
print('Local midnight:', local.isoformat())
print('UTC instant:', utc.isoformat().replace('+00:00', 'Z'))
PY
Für das angegebene Beispiel lautet die Ausgabe:
Civil date: 2025-07-15
Named zone: America/New_York
Local midnight: 2025-07-15T00:00:00-04:00
UTC instant: 2025-07-15T04:00:00Z
Lesen Sie die beiden Zeitstempelzeilen gemeinsam. Die lokale Zeile bestätigt, dass die angeforderte Wanduhrzeit Mitternacht ist. Die UTC-Zeile gibt denselben Zeitpunkt an: Zieht man den lokalen Offset von minus vier Stunden ab, erhält man 04:00:00 UTC. RFC 3339 definiert einen Zeitstempel mit Datum, Uhrzeit und entweder einem numerischen Offset oder Z. RFC 3339: Datum und Uhrzeit im Internet: Zeitstempel
Wie überprüfen Sie gewöhnliche und außergewöhnliche Ergebnisse?
Die folgenden Eingaben sind synthetische Veröffentlichungsbeispiele, die ausgewählt wurden, um das Programm zu prüfen. Ihre Ergebnisse wurden mit dem obigen Resolver und der verfügbaren Zeitzonendatenbank berechnet; sie sind keine Einträge tatsächlicher Veröffentlichungen. Ändern Sie die beiden Eingabewerte und führen Sie den vollständigen Befehl für jeden Fall erneut aus.
| Datum | Benannte Zeitzone | Ergebnis des Resolvers |
|---|---|---|
2025-01-15 |
America/New_York |
Ein Zeitpunkt: 2025-01-15T05:00:00Z |
2025-07-15 |
America/New_York |
Ein Zeitpunkt: 2025-07-15T04:00:00Z |
2018-11-04 |
America/Sao_Paulo |
Die genaue Mitternacht fehlt; wird zurückgewiesen |
2020-11-01 |
America/Havana |
Mitternacht tritt zweimal auf; wird standardmäßig zurückgewiesen |
2011-12-30 |
Pacific/Apia |
Die genaue Mitternacht fehlt; wird zurückgewiesen |
Die ersten beiden Zeilen zeigen, warum das Datum in die Berechnung gehört: In derselben benannten Zeitzone wird Mitternacht auf unterschiedliche UTC-Stunden aufgelöst. Für das Beispiel mit der wiederholten Mitternacht in Havanna wählt REPEATED = 'earlier' den Zeitpunkt 2020-11-01T04:00:00Z; der Wert later wählt 2020-11-01T05:00:00Z. Die Bezeichnungen beziehen sich auf die zeitliche Reihenfolge auf der UTC-Zeitachse.
Ein Ergebnis mit fehlender Mitternacht erfordert eine Entscheidung über die Veröffentlichungsanforderung. Wenn die exakte Mitternacht unerlässlich ist, wählen Sie ausdrücklich ein anderes Datum oder eine andere Zeitzone. Lautet die eigentliche Anforderung auf die erste gültige Uhrzeit an diesem Datum, definieren und implementieren Sie diesen Vorgang gesondert und legen Sie auch fest, was zu tun ist, wenn der gesamte Tag fehlt. Dieser Resolver meldet absichtlich einen Fehler, statt stillschweigend eine andere lokale Uhrzeit einzusetzen.
Was sollten Sie tun, wenn eine Eingabe fehlschlägt?
Geben Sie bei einem Datumsfehler ein gültiges gregorianisches Datum im Format YYYY-MM-DD ein, zum Beispiel 2025-07-15. Das Programm prüft sowohl die Gültigkeit des Kalenderdatums als auch die exakte Formatierung. Eine Eingabe wie 2025-02-30 schlägt fehl, statt in den nächsten Monat übertragen zu werden.
Prüfen Sie bei Zone not found die vollständige IANA-Kennung einschließlich Schreibweise und Groß- und Kleinschreibung. Python dokumentiert, dass diese Ausnahme sowohl einen ungültigen Schlüssel als auch nicht verfügbare Zeitzonendaten bedeuten kann. Bei der Standardsuche werden zuerst Systemdaten und dann das Paket tzdata der Python-Organisation als Ausweichlösung verwendet. Falls die Daten fehlen, installieren Sie dieses Paket in der verwendeten Python-Umgebung und führen Sie den Resolver erneut aus. PEP 615 – Unterstützung der IANA-Zeitzonendatenbank in der Standardbibliothek
Halten Sie das ursprüngliche Datum, den Zeitzonennamen, die Auswahl bei wiederholter Uhrzeit und den aufgelösten UTC-Zeitstempel gemeinsam in Ihren Arbeitsnotizen fest. Falls Berechnungen auf verschiedenen Rechnern voneinander abweichen, vergleichen Sie deren Zeitzonendatenquellen. Die Installation eines Ausweichpakets ersetzt nicht automatisch Systemdaten, die Python bereits findet. Datenquellen von zoneinfo
Welchen Wert sollten Sie in ein anderes Tool kopieren?
Wenn das Ziel einen UTC-Zeitstempel akzeptiert, kopieren Sie den Wert UTC instant einschließlich Z. Prüfen Sie vor der Eingabe das dokumentierte Eingabeformat des Ziels. Ein einfaches Datumsfeld kann nicht alle Informationen des aufgelösten Zeitstempels enthalten. Behalten Sie daher das ursprüngliche Datum und die benannte Zeitzone zusammen mit ihm bei, wenn Sie die Planungsabsicht festhalten müssen.
RFC 9557 definiert ein erweitertes Zeitstempelformat, das ein Suffix mit einer benannten Zeitzone enthalten kann. Dieses Format stellt jedoch weiterhin einen aufgelösten Zeitpunkt dar. Es berücksichtigt außerdem, dass Aktualisierungen der Zeitzonendaten zu Inkonsistenzen zwischen gespeicherten Offsets und Zeitzoneninformationen führen können. Verwenden Sie eine erweiterte Darstellung nur, wenn das empfangende Tool deren Unterstützung dokumentiert. RFC 9557, Geltungsbereich und inkonsistente Offsets
Prüfen Sie zum Schluss, ob die lokale Ausgabe Ihr gewünschtes Datum um 00:00:00 zeigt, die benannte Zeitzone Ihrer Eingabe entspricht und jede Auswahl bei wiederholter Mitternacht bewusst getroffen wurde. Wenn diese Prüfungen erfolgreich sind, ist die UTC-Ausgabe der aufgelöste Mitternachtszeitpunkt gemäß den in dieser Berechnung verwendeten Regeln.
Quellen
- Terminal auf dem Mac öffnen oder beenden — Apple
- Python unter macOS verwenden — Python Software Foundation
- datetime — Grundlegende Datums- und Uhrzeittypen — Python Software Foundation
- zoneinfo — Unterstützung für IANA-Zeitzonen — Python Software Foundation
- PEP 495 – Unterscheidung lokaler Uhrzeiten — Python Software Foundation
- PEP 615 – Unterstützung der IANA-Zeitzonendatenbank in der Standardbibliothek — Python Software Foundation
- RFC 3339: Datum und Uhrzeit im Internet: Zeitstempel — RFC Editor
- RFC 9557: Datum und Uhrzeit im Internet: Zeitstempel mit zusätzlichen Informationen — RFC Editor