Um auf einem Mac eine Veröffentlichungsangabe mit Monat und Tag zu erstellen, fordern Sie diese beiden Felder mit dem Foundation-Formatter von Swift an und überlassen die Anordnung der Locale. Entscheiden Sie zuerst, ob Ihre Eingabe ein Kalenderdatum oder ein Zeitstempel ist: Davon hängt ab, ob eine Zeitzone den angezeigten Tag ändern sollte.
Diese Anleitung führt Sie durch ein kleines Terminal-Skript, das Veröffentlichungsangaben anhand synthetischer Datumswerte erzeugt. Für den Hauptvorgang verwendet es Date.FormatStyle und zeigt die vorlagenbasierte Alternative für vorhandenen DateFormatter-Code. Apple dokumentiert beide Ansätze für die lokalisierte Datumsformatierung. Date.FormatStyle, DateFormatter
Monat und Tag als Felder anfordern, nicht als fertiges Muster
Ein Muster wie MMMM d legt den Monat vor dem Tag fest. Bei einer lokalisierten Feldanforderung geben Sie an, was enthalten sein soll, und überlassen die Anordnung dem Formatter. In Swift lautet der betreffende Ausdruck Date.FormatStyle().month(.wide).day(). Apple erklärt ausdrücklich, dass die Reihenfolge der Formatierungsmodifikatoren keinen Einfluss auf die resultierende Zeichenfolge hat. Wenn Sie also zuerst .day() aufrufen, wird dadurch keine Ausgabe mit vorangestelltem Tag erzwungen. Date.FormatStyle
Für das synthetische Veröffentlichungsdatum 12. November 2026 lauten beispielhafte Angaben mit en_US November 12 und mit en_GB 12 November. Dabei handelt es sich um explizit festgelegte Vorschau-Locales; das Skript gibt außerdem eine Angabe mit der aktuellen Locale des Mac aus. Apple veranschaulicht denselben Unterschied bei der Reihenfolge von Monat und Tag mit seiner lokalisierten Vorlagen-API. DateFormatter
Unicode beschreibt den zugrunde liegenden Unterschied anhand von Datumsskeletten: Sie enthalten die angeforderten Felder und deren Länge, und die Software ordnet ihnen ein geeignetes lokalisiertes Muster zu. MMMd fordert beispielsweise einen abgekürzten Monat und den Tag an. Es schreibt weder einen Schrägstrich noch ein Leerzeichen oder die endgültige Anzeigereihenfolge vor. Dieses Prinzip lässt sich auf verschiedene APIs übertragen: Komponenten auswählen und den Formatter die Angabe zusammensetzen lassen. Unicode Technical Standard #35, Part 4: Dates
Festlegen, was Ihr Veröffentlichungsdatum darstellt
Wählen Sie vor der Formatierung die passende Zeile unten aus. So verhindern Sie, dass ein korrekt arbeitender Formatter einen unbeabsichtigten Kalendertag anzeigt.
| Eingabe | Bedeutung | Formatierungsentscheidung |
|---|---|---|
Jahr 2026, Monat 11, Tag 12 |
Ein bürgerliches Datum: ein Tag in einem festgelegten Kalender | Diese Felder beibehalten; beim Umwandeln in Date einen einheitlichen Kalender und eine einheitliche Zeitzone verwenden |
2026-11-12T00:30:00Z |
Ein Zeitstempel, der einen Zeitpunkt bezeichnet | Den Zeitpunkt parsen und anschließend die Zeitzone für die Anzeige auswählen |
+02:00 |
Ein numerischer Versatz gegenüber UTC | Reicht aus, um einen lokalen Zeitstempel auf UTC zu beziehen; bezeichnet aber keine benannte Zone |
Europe/London |
Eine benannte Zeitzonenkennung | Die Regeln dieser Zone für den anzuzeigenden Zeitpunkt verwenden |
Apple definiert Date als einen Zeitpunkt, der unabhängig von Kalender oder Zeitzone ist. DateComponents enthält Felder wie Jahr, Monat und Tag, die anhand eines Kalenders und einer Zeitzone interpretiert werden. Daher benötigt ein Veröffentlichungsdatensatz, der nur ein Datum enthält, eine explizite Konvention für die Umwandlung, wenn er an eine API übergeben wird, die Date formatiert. Date, DateComponents
Für diese Aufgabe ist die Konvention einfach: Die Felder für Jahr, Monat und Tag aus der Quelle beibehalten, ein gregorianisches Datum für Mittag in UTC erstellen und es mit demselben Kalender und derselben UTC-Zeitzone formatieren. Mittag dient in diesem Beispiel lediglich als gewählter Bezugspunkt. Entscheidend für den Erhalt des Datums ist, dass Erstellung und Formatierung einheitlich erfolgen. Der Bezugspunkt behauptet keine tatsächliche Veröffentlichungszeit.
Für einen echten Zeitstempel wählen Sie stattdessen die gewünschte Anzeigezeitzone. Eine Locale steuert die Darstellung; sie legt nicht die für den Zeitstempel vorgesehene Zeitzone fest. Eine benannte Zone kann zu verschiedenen Zeitpunkten unterschiedliche Versätze haben, während ein fester numerischer Versatz keine solchen Regeln vorgibt. Apple bietet sowohl Zeitzonenkennungen als auch Funktionen zum Ermitteln des Versatzes für ein Datum. RFC 3339 definiert Zeitstempelversätze, und RFC 9557 erweitert diese Darstellung um zusätzliche Informationen, darunter eine Zeitzone. TimeZone, RFC 3339, RFC 9557
Einen vollständigen Formatter für Monat und Tag im Terminal ausführen
Verwenden Sie macOS 12 oder neuer mit einer verfügbaren Swift-Toolchain und dem macOS SDK. Apple dokumentiert, dass der hier verwendete Initializer von Date.FormatStyle ab macOS 12 verfügbar ist. Die offizielle Swift-Installationsseite enthält Anweisungen zur Einrichtung auf dem Mac, darunter Xcode für die Entwicklung auf Apple-Plattformen. Format-style initializer, Install Swift — macOS
Speichern Sie das folgende vollständige Programm in einem einfachen Texteditor als MonthDay.swift. Es enthält eigene synthetische Beispieldaten, prüft die Kalenderfelder und gibt Vorschauen mit der aktuellen Locale sowie mit explizit festgelegten Locales aus. Außerdem gibt es das entsprechende vorlagenbasierte Ergebnis aus, damit Sie die beiden APIs vergleichen können.
import Foundation
enum LabelError: Error {
case unavailableUTC
case invalidPublicationDate
}
func main() throws {
guard let utc = TimeZone(secondsFromGMT: 0) else {
throw LabelError.unavailableUTC
}
var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = utc
// Synthetic civil publication date, not an actual timestamp.
var fields = DateComponents()
fields.calendar = calendar
fields.timeZone = utc
fields.year = 2026
fields.month = 11
fields.day = 12
fields.hour = 12
guard fields.isValidDate(in: calendar),
let publicationDate = calendar.date(from: fields) else {
throw LabelError.invalidPublicationDate
}
let previews: [(String, Locale)] = [
("Current locale", .current),
("en_US", Locale(identifier: "en_US")),
("en_GB", Locale(identifier: "en_GB"))
]
for (name, locale) in previews {
let style = Date.FormatStyle(
locale: locale,
calendar: calendar,
timeZone: utc
)
.month(.wide)
.day()
print("\(name): \(publicationDate.formatted(style))")
let formatter = DateFormatter()
formatter.locale = locale
formatter.calendar = calendar
formatter.timeZone = utc
formatter.setLocalizedDateFormatFromTemplate("MMMMd")
print("\(name), template: \(formatter.string(from: publicationDate))")
}
}
try main()
Öffnen Sie Terminal, wechseln Sie in den Ordner mit der Datei und führen Sie swift MonthDay.swift aus. Falls die Swift-Toolchain nicht verfügbar ist, führen Sie zunächst die offiziellen Installationsschritte für den Mac aus. Dieses Beispiel wurde anhand der Dokumentation geprüft, in dieser Forschungsumgebung jedoch nicht ausgeführt, da Swift nicht verfügbar war.
Die beiden expliziten Vorschauen sollten für dasselbe Datum, den 12. November, die Reihenfolge mit vorangestelltem Monat und die mit vorangestelltem Tag zeigen. Die Zeile mit der aktuellen Locale richtet sich nach der entsprechenden Einstellung auf Ihrem Mac. Beide Formatter-Varianten fordern den vollständigen Monatsnamen und den Tag an, ohne Jahr oder Uhrzeit hinzuzufügen. Behandeln Sie die Ausgabe als lokalisierten Anzeigetext; machen Sie nachgelagerte Verarbeitung nicht von einem bestimmten Leerzeichen oder Satzzeichen abhängig. Das Musterabgleichmodell von Unicode lässt regionsspezifische Anordnungen zu. Unicode Technical Standard #35, Part 4: Dates
Der gregorianische Kalender in diesem Programm ist beabsichtigt: Die synthetischen Quellfelder sind in diesem Kalender definiert. Er bleibt festgelegt, während die Locale die Darstellung ändert. Wenn Ihre Quelldaten einen anderen Kalender verwenden, interpretieren Sie deren Felder anhand dieses Kalenders, bevor Sie die Anzeige festlegen. Zu diesem Zweck bietet der Initializer von Apple separate Einstellungen für Locale, Kalender und Zeitzone. Format-style initializer
Eine lokalisierte Vorlage in vorhandenem DateFormatter-Code verwenden
Der zweite Weg im Programm verwendet setLocalizedDateFormatFromTemplate("MMMMd"). Dabei fordert MMMM einen vollständigen Monatsnamen und d einen Monatstag an. Die Zeichenfolge ist eine Vorlage, die an eine Lokalisierungsmethode übergeben wird; sie wird nicht direkt als endgültiges dateFormat festgelegt. Apples eigenes Beispiel verwendet genau diese Vorlage, um unterschiedliche Reihenfolgen von Monat und Tag auszugeben. DateFormatter
Legen Sie locale fest, bevor Sie die Vorlagenmethode aufrufen. Apple verlangt ausdrücklich diese Reihenfolge, da die Methode das Format anhand der Locale des Formatters zu diesem Zeitpunkt ableitet. Wenn Sie später eine andere Locale auswählen, rufen Sie die Vorlagenmethode erneut auf. Im Beispiel wird für jede Vorschau ein neuer Formatter erstellt, wodurch diese Abhängigkeit sichtbar wird. setLocalizedDateFormatFromTemplate(_:)
Wählen Sie für diese Beschriftung die Variante, die zu Ihrem vorhandenen Code passt: Feldmodifikatoren in der modernen Swift-API oder die lokalisierte Vorlagenmethode in einem DateFormatter-Workflow. Setzen Sie nicht Monat und Tag mit selbst formatierten Zeichenfolgen und einem eigenen Trennzeichen zusammen, denn damit übernehmen Sie die Anordnung selbst, anstatt sie dem Datumsformatter zu überlassen.
Zeitstempel verarbeiten, ohne die Aufgabe versehentlich zu verändern
Nehmen wir an, die Quelle liefert stattdessen den synthetischen Zeitstempel 2026-11-12T00:30:00Z. Er bezeichnet einen Zeitpunkt. Bei einem Versatz von +00:00 ergibt die Anzeige den 12. November; beim selben Zeitpunkt mit dem Versatz -02:00 ergibt sie den 11. November um 22:30 Uhr. Dies ist eine beispielhafte Versatzberechnung und kein beobachtetes Veröffentlichungsereignis. RFC 3339 definiert numerische Versätze als lokale Zeit minus UTC. RFC 3339, Abschnitt 4.2
Parsen Sie eine solche Eingabe mit einer für das tatsächliche Format konfigurierten ISO-8601-API und formatieren Sie den resultierenden Zeitpunkt anschließend mit der gewählten Anzeigezeitzone. Apple dokumentiert ISO8601DateFormatter und dessen Option .withInternetDateTime für RFC-3339-Datums- und Uhrzeitzeichenfolgen. Diese Option ist eine Konfiguration zum Parsen und vom lokalisierten Auftrag, Monat und Tag auszugeben, getrennt. ISO8601DateFormatter formatOptions
Wenden Sie diesen Zeitstempel-Workflow nicht auf eine Quelle an, die nur ein bürgerliches Datum enthält, es sei denn, Sie haben die Umwandlungskonvention bewusst festgelegt. Nehmen Sie ebenso nicht an, dass das Suffix Z die benannte Zeitzone der Veröffentlichung angibt. RFC 9557 behandelt Informationen zu benannten Zonen als zusätzliche Angaben über die grundlegende Zeitstempeldarstellung hinaus. RFC 9557
Eine unerwartete Angabe in der richtigen Reihenfolge untersuchen
Gehen Sie die folgende Reihenfolge durch, um festzustellen, welche Entscheidung geändert werden muss:
- Der Tag ist falsch: Prüfen Sie, ob die Eingabe ein bürgerliches Datum oder ein Zeitpunkt ist. Achten Sie beim Programm für bürgerliche Daten darauf, Erstellung und Formatierung in UTC vorzunehmen. Prüfen Sie bei einem Zeitpunkt die vorgesehene Anzeigezeitzone.
- Monat und Tag erscheinen in der falschen Reihenfolge: Prüfen Sie die an den Formatter übergebene Locale und kontrollieren Sie, ob
dateFormatdirekt zugewiesen oder die Zeichenfolgen manuell zusammengefügt werden. - Die Reihenfolge der Modifikatoren hat keinen Effekt: Das ist das dokumentierte Verhalten. Wählen Sie die passende Locale aus, statt
.month()und.day()neu anzuordnen. - Die Vorlagenausgabe übernimmt eine frühere Anordnung: Legen Sie die neue Locale fest und erzeugen Sie das Format anschließend mit
setLocalizedDateFormatFromTemplateneu. - Die Quellfelder sind ungültig: Melden oder korrigieren Sie die Eingabe. Das vollständige Programm prüft die Gültigkeit vor der Umwandlung, statt ein anderes Veröffentlichungsdatum einzusetzen.
Diese Prüfungen folgen der dokumentierten Trennung zwischen einem Zeitpunkt, seiner Interpretation anhand eines Kalenders und seiner lokalisierten Darstellung. Apple dokumentiert die Unabhängigkeit von der Reihenfolge der Modifikatoren, die Reihenfolge der Vorlageneinrichtung und die Validierung von Datumskomponenten in den entsprechenden APIs. Date.FormatStyle, setLocalizedDateFormatFromTemplate(_:), DateComponents
Bewahren Sie das vollständige Quelldatum oder den vollständigen Zeitstempel nach Erstellung der Angabe auf. Eine Zeichenfolge mit Monat und Tag lässt das Jahr absichtlich aus, und eine formatierte Zeitstempelangabe lässt Uhrzeit und Zeitzone weg; dieser Anzeigetext kann die vollständige Eingabe nicht erhalten. Für eine verlässliche Veröffentlichungsangabe sollten Sie den Originalwert aufbewahren, Kalender und Zeitzone bewusst auswählen und die Locale Monat und Tag anordnen lassen.
Quellen
- Date.FormatStyle — Apple
- DateFormatter — Apple
- Unicode Technical Standard #35: Unicode Common Locale Data & Rules, Part 4: Dates — Unicode Consortium
- Date — Apple
- DateComponents — Apple
- TimeZone — Apple
- init(date:time:locale:calendar:timeZone:capitalizationContext:) — Apple
- setLocalizedDateFormatFromTemplate(_:) — Apple
- Install Swift — macOS — Swift.org
- ISO8601DateFormatter formatOptions — Apple
- RFC 3339: Date and Time on the Internet: Timestamps — RFC Editor
- RFC 9557: Date and Time on the Internet: Timestamps with Additional Information — RFC Editor