Om op een Mac een publicatielabel met maand en dag te maken, vraag je die twee velden op met Swift’s Foundation-opmaakfunctie en laat je de locale ze rangschikken. Bepaal eerst of je invoer een kalenderdatum of een tijdstempel is: daarvan hangt af of een tijdzone de weergegeven dag moet veranderen.
Deze gids loopt een klein Terminal-script door dat publicatielabels maakt op basis van synthetische datums. Het gebruikt Date.FormatStyle voor de hoofdhandeling en laat het alternatief met sjablonen zien voor bestaande DateFormatter-code. Apple documenteert beide benaderingen voor gelokaliseerde datumuitvoer. Date.FormatStyle, DateFormatter
Vraag maand en dag op als velden, niet als een kant-en-klaar patroon
Een patroon zoals MMMM d zet de maand vóór de dag. Een gelokaliseerd veldverzoek geeft aan wat je wilt opnemen, terwijl de opmaakfunctie de volgorde bepaalt. In Swift is de relevante expressie Date.FormatStyle().month(.wide).day(). Apple stelt expliciet dat de volgorde van opmaakmodifiers geen invloed heeft op de resulterende tekenreeks. Door eerst .day() aan te roepen, wordt de dag dus niet automatisch eerst weergegeven. Date.FormatStyle
Voor de synthetische publicatiedatum 12 november 2026 zijn November 12 met en_US en 12 November met en_GB voorbeelden van mogelijke labels. Dit zijn voorbeelden met expliciete preview-locales; het werkende script drukt ook een label af met de huidige locale van de Mac. Apple laat hetzelfde verschil in de volgorde van maand en dag zien met de gelokaliseerde template-API. DateFormatter
Unicode beschrijft het onderliggende onderscheid aan de hand van datumskeletten: die bevatten de gevraagde velden en veldlengtes, waarna software er een passende gelokaliseerde patroon bij zoekt. Zo vraagt MMMd om een afgekorte maand en een dag. Het schrijft geen schuine streep, spatie of uiteindelijke weergavevolgorde voor. Dit is het bruikbare principe voor verschillende API’s: selecteer de onderdelen en laat de opmaakfunctie het label samenstellen. Unicode Technical Standard #35, Part 4: Dates
Bepaal wat je publicatiedatum voorstelt
Kies voordat je de datum opmaakt de juiste rij hieronder. Zo voorkom je dat een correcte opmaakfunctie een onbedoelde kalenderdag weergeeft.
| Invoer | Betekenis | Opmaakkeuze |
|---|---|---|
Jaar 2026, maand 11, dag 12 |
Een civiele datum: één dag in een bepaalde kalender | Behoud deze velden; gebruik een consistente kalender en tijdzone bij het omzetten via Date |
2026-11-12T00:30:00Z |
Een tijdstempel die een moment aanduidt | Parse het moment en kies vervolgens de tijdzone waarin je het wilt weergeven |
+02:00 |
Een numerieke afwijking ten opzichte van UTC | Voldoende om een lokale tijdstempel te relateren aan UTC; hiermee wordt geen benoemde tijdzone aangeduid |
Europe/London |
Een benoemde tijdzone-identifier | Gebruik de regels ervan voor het weer te geven moment |
Apple definieert Date als een tijdstip dat onafhankelijk is van een kalender of tijdzone. DateComponents bevat velden zoals jaar, maand en dag, die worden geïnterpreteerd met behulp van een kalender en tijdzone. Daarom heeft een publicatierecord met alleen een datum een expliciete omzettingsconventie nodig wanneer je het doorgeeft aan een API die Date opmaakt. Date, DateComponents
Voor deze taak is de conventie eenvoudig: behoud het bronjaar, de bronmaand en de brondag, maak een Gregoriaanse datum aan op het middaguur in UTC en maak die op met dezelfde kalender en UTC-tijdzone. Het middaguur is slechts een gekozen anker voor dit voorbeeld. Het behoud van de datum komt voort uit het consistent houden van de aanmaak en opmaak. Het anker geeft geen werkelijke publicatietijd aan.
Kies voor een echte tijdstempel in plaats daarvan de beoogde weergavezone. Een locale bepaalt de presentatie, maar geeft niet aan in welke tijdzone de tijdstempel bedoeld is. Een benoemde zone kan op verschillende momenten verschillende afwijkingen hebben, terwijl een vaste numerieke afwijking zulke regels niet bevat. Apple biedt zowel tijdzone-identifiers als bewerkingen om de afwijking op een bepaalde datum op te vragen. RFC 3339 definieert afwijkingen in tijdstempels en RFC 9557 breidt die notatie uit met aanvullende informatie, waaronder een tijdzone. TimeZone, RFC 3339, RFC 9557
Voer een complete opmaakfunctie voor maand en dag uit in Terminal
Gebruik macOS 12 of hoger met een Swift-toolchain en de macOS SDK. Apple documenteert dat de hier gebruikte Date.FormatStyle-initializer beschikbaar is vanaf macOS 12. De officiële installatiepagina van Swift bevat installatie-instructies voor Mac, waaronder Xcode voor ontwikkeling op Apple-platforms. Format-style initializer, Install Swift — macOS
Sla het volgende complete programma op als MonthDay.swift in een teksteditor voor platte tekst. Het bevat eigen synthetische voorbeeldgegevens, controleert de kalenderwaarden en drukt previews af met de huidige locale en met expliciete locales. Ook drukt het het equivalente resultaat met sjablonen af, zodat je de twee API’s kunt vergelijken.
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()
Open Terminal, ga naar de map met het bestand en voer swift MonthDay.swift uit. Als de Swift-toolchain niet beschikbaar is, volg dan eerst de officiële installatiestappen voor Mac. Dit voorbeeld is gecontroleerd aan de hand van de documentatie, maar is in deze onderzoeksomgeving niet uitgevoerd omdat Swift niet beschikbaar was.
De twee expliciete previews laten voor dezelfde datum, 12 november, een label zien met eerst de maand en een label met eerst de dag. De regel met de huidige locale volgt de huidige locale-instelling van je Mac. Beide opmaakroutes vragen om een volledige maandnaam en de dag, zonder een jaar of tijd toe te voegen. Behandel de uitvoer als gelokaliseerde weergavetekst; laat verdere verwerking niet afhangen van een bepaalde spatie of leesteken. Het patroonmodel van Unicode staat locale-specifieke volgordes toe. Unicode Technical Standard #35, Part 4: Dates
De Gregoriaanse kalender in dit programma is een bewuste keuze: de synthetische bronvelden zijn in die kalender gedefinieerd. De kalender blijft vast terwijl de locale de presentatie verandert. Als je brondatums een andere kalender gebruiken, interpreteer hun velden dan met die kalender voordat je bepaalt hoe je ze wilt weergeven. Apple biedt voor dit doel afzonderlijke parameters voor locale, kalender en tijdzone in de initializer. Format-style initializer
Gebruik een gelokaliseerde sjabloon in bestaande DateFormatter-code
De tweede route in het programma gebruikt setLocalizedDateFormatFromTemplate("MMMMd"). Hier vraagt MMMM om een volledige maand en vraagt d om een dag van de maand. De tekenreeks is een sjabloon die aan een lokalisatiemethode wordt doorgegeven; ze wordt niet rechtstreeks toegewezen als de uiteindelijke dateFormat. Apple gebruikt precies deze sjabloon in het eigen voorbeeld om verschillende volgordes van maand en dag te produceren. DateFormatter
Stel locale in voordat je de templatemethode aanroept. Apple vereist expliciet deze volgorde, omdat de methode de opmaak afleidt op basis van de locale van de opmaakfunctie op dat moment. Als je later een andere locale kiest, roep je de templatemethode opnieuw aan. Het voorbeeld maakt voor elke preview een nieuwe opmaakfunctie aan, zodat deze afhankelijkheid duidelijk wordt. setLocalizedDateFormatFromTemplate(_:)
Kies voor dit label de route die bij je bestaande code past: veldmodifiers in de moderne Swift-API, of de gelokaliseerde templatemethode in een DateFormatter-workflow. Stel geen maand- en dagtekenreeksen afzonderlijk op met een eigen scheidingsteken, want dan neemt je de rangschikking uit handen van de datumopmaakfunctie.
Verwerk tijdstempels zonder de taak onbedoeld te veranderen
Stel dat de bron in plaats daarvan de synthetische tijdstempel 2026-11-12T00:30:00Z bevat. Die duidt een moment aan. Weergave met de afwijking +00:00 geeft 12 november; weergave van hetzelfde moment met de afwijking -02:00 geeft 11 november om 22:30. Dit is een voorbeeldberekening van de tijdsafwijking, geen waargenomen publicatiegebeurtenis. RFC 3339 definieert numerieke afwijkingen als lokale tijd min UTC. RFC 3339, section 4.2
Parse zulke invoer met een ISO 8601-API die is geconfigureerd voor de daadwerkelijke notatie en maak vervolgens het resulterende moment op met de gekozen weergavezone. Apple documenteert ISO8601DateFormatter en de optie .withInternetDateTime voor datum- en tijdtekenreeksen volgens RFC 3339. Die optie is een parse-instelling, los van het verzoek om een gelokaliseerde weergave van maand en dag. ISO8601DateFormatter formatOptions
Pas deze tijdstempelworkflow niet toe op een bron die alleen een civiele datum bevat, tenzij je de omzettingsconventie bewust hebt vastgelegd. Ga er evenmin van uit dat het achtervoegsel Z de benoemde tijdzone van de publicatie aanduidt. RFC 9557 behandelt informatie over een benoemde zone als aanvullende informatie naast de basisnotatie van een tijdstempel. RFC 9557
Zoek een onverwacht label stap voor stap uit
Volg deze stappen om te bepalen welke keuze je moet aanpassen:
- De dag klopt niet: controleer of de invoer een civiele datum of een moment is. Houd voor het civieldatumsprogramma zowel het aanmaken als het opmaken in UTC. Controleer voor een moment de beoogde weergavezone.
- Maand en dag staan in de verkeerde volgorde: controleer welke locale aan de opmaakfunctie is doorgegeven en kijk of er rechtstreeks een
dateFormatis toegewezen of tekenreeksen handmatig zijn samengevoegd. - De volgorde van modifiers veranderen heeft geen effect: dat is gedocumenteerd gedrag. Selecteer de juiste locale in plaats van
.month()en.day()te herschikken. - De sjabloonuitvoer behoudt een eerdere volgorde: stel de nieuwe locale in en genereer de opmaak opnieuw met
setLocalizedDateFormatFromTemplate. - De bronvelden zijn ongeldig: meld of corrigeer de invoer. Het complete programma controleert de geldigheid vóór de omzetting en vervangt de datum niet door een andere publicatiedatum.
Deze controles volgen de gedocumenteerde scheiding tussen een moment, de interpretatie ervan volgens een kalender en de gelokaliseerde presentatie. Apple documenteert de onafhankelijkheid van de modifier-volgorde, de volgorde van sjablooninstellingen en de validatie van datumcomponenten in de bijbehorende API’s. Date.FormatStyle, setLocalizedDateFormatFromTemplate(_:), DateComponents
Bewaar de volledige brondatum of tijdstempel nadat je het label hebt gemaakt. Een tekenreeks met maand en dag laat het jaar bewust weg, en een label met een opgemaakte tijdstempel laat ook de tijd en tijdzone weg; die weergavetekst kan de volledige invoer niet behouden. Bewaar voor een betrouwbaar publicatielabel de oorspronkelijke waarde, kies bewust de kalender en tijdzone en laat de locale de gevraagde maand en dag rangschikken.
Bronnen
- 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