Um einen Veröffentlichungszeitpunkt in einer anderen Zeitzone zu formatieren, behalten Sie den ursprünglichen Zeitpunkt bei und übergeben Sie dem Formatierer die Zielzeitzone. Diese Anleitung für das Mac-Terminal erzeugt eine gut lesbare Veröffentlichungsangabe, ohne angezeigten Text zu parsen oder Stunden manuell hinzuzufügen.

Welche Informationen benötigen Sie vor der Umrechnung?

Angenommen, Sie bereiten ein Dokument auf Ihrem Mac vor und erhalten den synthetischen Veröffentlichungszeitstempel 2025-07-15T00:30:00Z. Sie benötigen das Veröffentlichungsdatum und die Uhrzeit, wie sie in America/Los_Angeles angezeigt werden. Die Aufgabe besteht darin, denselben Zeitpunkt mit dem Kalenderdatum und der Uhrzeit des Zielorts anzugeben.

Vier Begriffe bestimmen, ob Ihnen genügend Informationen vorliegen:

Begriff Synthetisches Beispiel Bedeutung für diese Aufgabe
Kalenderdatum 2025-07-15 Ein Kalendertag ohne Uhrzeit und Zeitzone
Zeitpunkt Der durch 2025-07-15T00:30:00Z dargestellte Moment Der Zeitpunkt, den Sie beibehalten
UTC-Offset -07:00 Der Unterschied zwischen Ortszeit und UTC zu einem bestimmten Zeitpunkt
Benannte Zeitzone America/Los_Angeles Regeln zur Bestimmung des geltenden Offsets

RFC 3339 definiert Zeitstempel mit vollständigem Datum, Uhrzeit und UTC-Offset. RFC 9557 erläutert den weiteren Unterschied: Eine benannte Zeitzone liefert Regeln, die einen Zeitpunkt einem Offset zuordnen, während der numerische Offset eines Zeitstempels allein nicht beschreibt, wie sich der Offset eines Orts zu anderen Zeiten verhält. RFC 3339, Abschnitt 5.6, RFC 9557, Abschnitt 1.2.

Treffen Sie vor der Umrechnung anhand dieser Angaben die passende Entscheidung:

  • Sie haben bereits ein Foundation-Date: Übergeben Sie es direkt an einen für die Zielzeitzone konfigurierten Formatierer.
  • Sie haben einen Zeitstempel mit Z oder einem expliziten numerischen Offset: Parsen Sie diesen ursprünglichen Zeitstempel einmal und formatieren Sie anschließend den daraus ermittelten Zeitpunkt.
  • Sie haben nur ein Kalenderdatum: Behalten Sie es als Datum bei, sofern die Aufgabe nicht ausdrücklich eine Uhrzeit und Zeitzone vorgibt.
  • Sie haben ein lokales Datum und eine lokale Uhrzeit ohne Offset: Ermitteln Sie die Quellzeitzone und klären Sie mögliche Mehrdeutigkeiten, bevor Sie den Wert als Zeitpunkt behandeln.

Beispielsweise lässt sich aus 2025-07-15 nicht erkennen, ob die Veröffentlichung in einer anderen Zeitzone vor oder nach Mitternacht erfolgte. Mitternacht anzunehmen, würde eine zusätzliche Annahme einführen. Ebenso kann eine lokale Uhrzeit bei einem Offsetwechsel keinem oder mehreren Zeitpunkten entsprechen; RFC 9557 dokumentiert diesen Grenzfall. Wenn Sie einen bereits festgelegten Zeitpunkt umrechnen, vermeiden Sie dieses Problem der Rückzuordnung. RFC 9557, Abschnitt 1.2.

Warum sollten Sie angezeigten Text nicht erneut parsen?

Apple definiert Foundation-Date als einen bestimmten Zeitpunkt, unabhängig von Kalender oder Zeitzone. Sein Wert muss nicht zu einem anderen Date werden, damit er in einer anderen Zeitzone angezeigt werden kann. Die Formatierung verwendet Kalender und Zeitzone, um Text zu erzeugen. Date.

Eine Anzeige kann Informationen auslassen. Wenn Sie einen Zeitpunkt als Datum ohne Uhrzeit formatieren und diese Angabe anschließend parsen, lässt sich die fehlende Uhrzeit aus der Angabe nicht wiederherstellen. Apples Formatierungsdokumentation zeigt einen Nur-Datum-Roundtrip, der Mitternacht rekonstruiert. Das ist hilfreich, wenn Mitternacht beabsichtigt ist, erhält aber keinen beliebigen Veröffentlichungszeitpunkt. Date.FormatStyle.

Halten Sie sich an diese Reihenfolge:

  1. Lesen Sie den ursprünglichen Zeitstempel ein oder übernehmen Sie das vorhandene Date.
  2. Behalten Sie diesen Zeitpunkt als Arbeitswert bei.
  3. Wählen Sie die Zielzeitzone, den Kalender und die Anzeigesprache.
  4. Formatieren Sie den beibehaltenen Zeitpunkt als endgültige Angabe.

Auch das manuelle Addieren eines Offsets ändert die Aufgabe. Apple beschreibt addingTimeInterval(_:) als Erzeugung eines neuen Datums durch Addition verstrichener Zeit. Durch das Addieren von sieben Stunden entsteht also ein anderer Zeitpunkt; die Wahl der Zeitzone eines Formatierers ändert hingegen nur die Darstellung des ursprünglichen Zeitpunkts. Date.

Führen Sie ein vollständiges Beispiel für die Veröffentlichungszeit auf Ihrem Mac aus

Das Beispiel setzt macOS 12 oder neuer voraus, wo Apples API Date.FormatStyle verfügbar ist, sowie eine funktionierende Swift-Toolchain. Es verwendet Foundation und benötigt keine zusätzlichen Pakete. Date.FormatStyle.

Öffnen Sie Terminal und prüfen Sie die Toolchain:

swift --version

Falls Sie Apples Befehlszeilenwerkzeuge benötigen, führen Sie den folgenden Befehl aus und schließen Sie den Installationsdialog ab. Apple dokumentiert diesen Installationsweg und weist darauf hin, dass eine vollständige Xcode-Installation die Befehlszeilenwerkzeuge bereits enthält. Wiederholen Sie anschließend die Versionsprüfung. Befehlszeilenwerkzeuge installieren.

xcode-select --install

Erstellen Sie in TextEdit ein neues Dokument und wählen Sie Format > In reinen Text umwandeln. Fügen Sie das vollständige Swift-Programm unten ein und speichern Sie es auf Ihrem Schreibtisch als publication-time.swift. Stellen Sie sicher, dass der Dateiname mit .swift endet und nicht um die Erweiterung .txt ergänzt wurde. Apples TextEdit-Anleitung beschreibt das Erstellen, Umwandeln und Sichern von Reintextdokumenten. Dokumente in TextEdit auf dem Mac erstellen, öffnen und umwandeln.

Dieses Programm akzeptiert den angegebenen Zeitstempel mit ganzen Sekunden, parst ihn einmal und erzeugt aus demselben instant drei Darstellungen. Apple dokumentiert ISO8601DateFormatter zum Parsen und Erzeugen von ISO-8601-Darstellungen sowie dessen Option withInternetDateTime für das RFC-3339-Format. ISO8601DateFormatter, withInternetDateTime.

import Foundation

// Synthetic publication data. Change these two values as needed.
let sourceTimestamp = "2025-07-15T00:30:00Z"
let destinationIdentifier = "America/Los_Angeles"

enum ConversionError: Error {
    case invalidTimestamp(String)
    case unknownTimeZone(String)
}

let inputFormatter = ISO8601DateFormatter()
inputFormatter.formatOptions = [.withInternetDateTime]
inputFormatter.timeZone = TimeZone(secondsFromGMT: 0)

guard let instant = inputFormatter.date(from: sourceTimestamp) else {
    throw ConversionError.invalidTimestamp(sourceTimestamp)
}

guard let destination = TimeZone(identifier: destinationIdentifier) else {
    throw ConversionError.unknownTimeZone(destinationIdentifier)
}

let destinationFormatter = ISO8601DateFormatter()
destinationFormatter.formatOptions = [.withInternetDateTime]
destinationFormatter.timeZone = destination

let publicationLabelStyle = Date.FormatStyle(
    date: .long,
    time: .complete,
    locale: Locale(identifier: "en_GB"),
    calendar: Calendar(identifier: .gregorian),
    timeZone: destination
)

let publicationDateStyle = Date.FormatStyle(
    date: .long,
    time: .omitted,
    locale: Locale(identifier: "en_GB"),
    calendar: Calendar(identifier: .gregorian),
    timeZone: destination
)

print("Source instant: \(inputFormatter.string(from: instant))")
print("Destination zone: \(destination.identifier)")
print("Destination timestamp: \(destinationFormatter.string(from: instant))")
print("Publication label: \(instant.formatted(publicationLabelStyle))")
print("Publication date: \(instant.formatted(publicationDateStyle))")

Führen Sie das gespeicherte Programm aus:

swift "$HOME/Desktop/publication-time.swift"

Für die angegebenen Werte sollte der Zielzeitstempel 2025-07-14T17:30:00-07:00 lauten und das Veröffentlichungsdatum den 14. Juli 2025 angeben. Die lesbare Angabe enthält auch die Uhrzeit und Zeitzoneninformationen; der genaue Wortlaut und die Zeichensetzung stammen vom Formatierungssystem.

Das Swift-Programm wurde anhand der abgerufenen API-Dokumentation überprüft, aber in der Rechercheumgebung nicht ausgeführt, da Swift dort nicht verfügbar war. Die numerischen Beispielumrechnungen wurden separat mit den Datums-, Uhrzeit- und Zeitzonen-APIs von Python geprüft.

Welche Einstellungen steuern das Ergebnis?

Der Initializer des Formatierers akzeptiert separate Einstellungen für Sprache, Kalender und Zeitzone. Hier fordert en_GB britisch-englische Formatierungskonventionen an, der gregorianische Kalender gibt das Datumssystem vor und destination bestimmt das lokale Datum und die Uhrzeit. Ändern Sie die Zeitzonenkennung, wenn Sie ein anderes Ziel benötigen, und die Sprache, wenn Sie eine andere Darstellungskonvention benötigen. init(date:time:locale:calendar:timeZone:capitalizationContext:).

Das Ergebnis ohne Uhrzeit stammt weiterhin direkt aus instant. Durch time: .omitted wird die Uhrzeit aus der ausgegebenen Angabe entfernt. Dafür muss kein neuer Zeitpunkt um Mitternacht erzeugt werden.

Prüfen Sie Tageswechsel um Mitternacht und saisonale Offsets

Verwenden Sie die folgenden synthetischen Beispiele, um zu prüfen, ob Ihr Ergebnis den beabsichtigten Vorgang bewahrt. Es handelt sich um illustrative Veröffentlichungszeitstempel mit berechneten Darstellungen in der Zielzeitzone.

Ursprünglicher Zeitpunkt Zielzeitzone Darstellung in der Zielzeitzone
2025-01-15T00:30:00Z America/Los_Angeles 2025-01-14T16:30:00-08:00
2025-07-15T00:30:00Z America/Los_Angeles 2025-07-14T17:30:00-07:00
2025-07-15T00:30:00Z Asia/Tokyo 2025-07-15T09:30:00+09:00
2025-07-15T23:30:00Z Asia/Tokyo 2025-07-16T08:30:00+09:00

Die ersten beiden Zeilen zeigen, warum eine feste Anpassung für ein benanntes Ziel nicht ausreicht: Der geltende Offset kann vom Zeitpunkt abhängen. Die letzten beiden Zeilen zeigen, warum Sie neben der Uhrzeit auch das vollständige Kalenderdatum des Ziels bestimmen müssen. Eine Veröffentlichung kann am Vortag, am selben Tag oder am Folgetag angezeigt werden.

Benannte Zeitzonen verwenden Regeln aus einer Zeitzonendatenbank. IANA dokumentiert, dass macOS seine Datenbank verwendet und Aktualisierungen üblicherweise über Betriebssystemupdates auf die Geräte gelangen. Wenn sich Ergebnisse zwischen Geräten unterscheiden, prüfen Sie deren Zeitzonenkennungen und verfügbaren Updates, bevor Sie den Quellzeitstempel ändern. Zeitzonen- und Sommerzeitdaten.

Was sollten Sie tun, wenn die Eingabe oder Ausgabe unerwartet ist?

Gehen Sie diese Prüfungen der Reihe nach durch:

  1. Prüfen Sie, ob die Quelle einen Zeitpunkt eindeutig festlegt. Behalten Sie den zugehörigen Z oder numerischen Offset bei. Ein Wert, der nur ein Datum oder eine lokale Uhrzeit angibt, erfordert zusätzliche Informationen.
  2. Prüfen Sie die Zielkennung. Verwenden Sie eine Kennung wie America/Los_Angeles. Apples Initializer gibt für eine unbekannte Kennung nil zurück; dieses Programm bricht mit einem Fehler ab, statt eine andere Zeitzone einzusetzen.
  3. Prüfen Sie, welches Zeitstempelformat unterstützt wird. Das Beispiel ist für Internetzeitstempel mit ganzen Sekunden konfiguriert. Für Nachkommastellen oder eine andere Eingabedarstellung muss die Parserkonfiguration angepasst werden. Behalten Sie dabei die ursprüngliche Eingabe bei.
  4. Vergleichen Sie den numerischen Zielzeitstempel. Verwenden Sie Datum, Uhrzeit und Offset, um die Umrechnung zu beurteilen, bevor Sie sich mit der Zeichensetzung der Anzeige befassen.
  5. Prüfen Sie, ob jede Ausgabe denselben ursprünglichen instant verwendet. Entfernen Sie jeden Zwischenschritt, der eine Angabe formatiert und diese anschließend für die nächste Umrechnung erneut parst. init(identifier:), ISO8601DateFormatter.

Eine benannte Zeitzone und ein Offset können unter RFC 9557 auch gemeinsam in einem erweiterten Zeitstempel angegeben werden. Daraus folgt nicht, dass der Parser in diesem Beispiel die Zeitzonenangaben in eckigen Klammern unterstützt. Behalten Sie die Zielkennung im separaten Wert destinationIdentifier wie oben bei, sofern Sie nicht gezielt einen Eingabepfad für das erweiterte Format implementieren und überprüfen. RFC 9557.

Behalten Sie für eine Veröffentlichungsangabe den ursprünglichen Zeitpunkt als wiederverwendbaren Wert bei und erzeugen Sie daraus den Text für jede Zielzeitzone. So können Sie Zielzeitzone, Anzeigesprache oder sichtbare Details ändern, während alle Angaben an denselben Veröffentlichungsmoment gebunden bleiben.

Quellen