För att skapa en publiceringsetikett med månad och dag på en Mac begär du dessa två fält med Swifts Foundation-formaterare och låter lokalen ordna dem. Bestäm först om indata är ett kalenderdatum eller en tidsstämpel: det avgör om en tidszon ska ändra den visade dagen.

Den här guiden går igenom ett litet Terminal-skript som skapar publiceringsetiketter från syntetiska datum. Det använder Date.FormatStyle för huvudåtgärden och visar det mallbaserade alternativet för befintlig DateFormatter-kod. Apple dokumenterar båda metoderna för lokaliserad datumutmatning. Date.FormatStyle, DateFormatter

Begär månad och dag som fält, inte som ett färdigt mönster

Ett mönster som MMMM d placerar månaden före dagen. En lokaliserad fältbegäran anger vad som ska ingå och låter formateraren bestämma ordningen. I Swift är det relevanta uttrycket Date.FormatStyle().month(.wide).day(). Apple anger uttryckligen att ordningen på formateringsmodifierare inte påverkar den resulterande strängen. Att anropa .day() först tvingar därför inte fram dag-först-utmatning. Date.FormatStyle

För det syntetiska publiceringsdatumet 12 november 2026 är exemplen på etiketter November 12 med en_US och 12 November med en_GB. Det här är uttryckliga förhandsvisningar med olika lokaler; det körbara skriptet skriver också ut en etikett med Macens aktuella lokal. Apple visar samma skillnad i ordningen mellan månad och dag med sitt lokaliserade mall-API. DateFormatter

Unicode beskriver den underliggande skillnaden med datumskelett: de innehåller begärda fält och fältlängder, och programvara matchar dem mot ett lämpligt lokaliserat mönster. MMMd begär till exempel en förkortad månad och en dag. Det föreskriver inte snedstreck, blanksteg eller den slutliga visningsordningen. Den användbara principen att ta med sig mellan API:er är att välja komponenter och sedan låta formateraren sätta ihop etiketten. Unicode Technical Standard #35, Part 4: Dates

Bestäm vad ditt publiceringsdatum står för

Välj rätt rad nedan innan du formaterar. Det här beslutet förhindrar att en korrekt formaterare visar en oavsiktlig kalenderdag.

Indata Betydelse Formateringsbeslut
År 2026, månad 11, dag 12 Ett civilt datum: en dag i en angiven kalender Bevara dessa fält; använd en konsekvent kalender och tidszon när du konverterar via Date
2026-11-12T00:30:00Z En tidsstämpel som identifierar en tidpunkt Tolka tidpunkten och välj sedan tidszonen den ska visas i
+02:00 En numerisk förskjutning från UTC Tillräcklig för att relatera en lokal tidsstämpel till UTC; identifierar inte en namngiven zon
Europe/London En identifierare för en namngiven tidszon Använd dess regler för tidpunkten som visas

Apple definierar Date som en tidpunkt som är oberoende av kalender och tidszon. DateComponents innehåller fält som år, månad och dag, vilka tolkas med hjälp av en kalender och tidszon. Därför behöver en publiceringspost med enbart datum en uttrycklig konverteringskonvention när den skickas till ett API som formaterar Date. Date, DateComponents

För den här uppgiften är konventionen enkel: behåll källans år, månad och dag, skapa ett gregorianskt datum vid middagstid i UTC och formatera det med samma kalender och UTC-zon. Middagstid är bara ett valt ankare i det här exemplet. Det är konsekvensen mellan skapandet och formateringen som bevarar datumet. Ankaret gör inte anspråk på att vara en faktisk publiceringstid.

För en faktisk tidsstämpel väljer du i stället den avsedda visningszonen. En lokal styr presentationen; den anger inte vilken tidszon som är avsedd för tidsstämpeln. En namngiven zon kan ha olika förskjutningar vid olika tidpunkter, medan en fast numerisk förskjutning saknar sådana regler. Apple tillhandahåller både zonidentifierare och funktioner för att hämta förskjutningen vid ett visst datum. RFC 3339 definierar tidsstämpelförskjutningar, och RFC 9557 utökar den representationen så att den kan bära ytterligare information, inklusive en tidszon. TimeZone, RFC 3339, RFC 9557

Kör en komplett formaterare för månad och dag i Terminal

Använd macOS 12 eller senare med en Swift-verktygskedja och macOS SDK tillgängliga. Apple dokumenterar att den Date.FormatStyle-initierare som används här är tillgänglig från macOS 12. Swifts officiella installationssida innehåller installationsanvisningar för Mac, inklusive Xcode för utveckling på Apple-plattformar. Format-style initializer, Install Swift — macOS

Spara följande kompletta program som MonthDay.swift i en vanlig textredigerare. Det innehåller egna syntetiska exempeldata, validerar kalenderfälten och skriver ut förhandsvisningar för den aktuella lokalen och uttryckliga lokaler. Det skriver också ut motsvarande mallbaserade resultat så att du kan jämföra de två API:erna.

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()

Öppna Terminal, gå till mappen som innehåller filen och kör swift MonthDay.swift. Om Swift-verktygskedjan saknas slutför du de officiella installationsstegen för Mac innan du fortsätter. Exemplet granskades mot dokumentationen men kördes inte i den här forskningsmiljön eftersom Swift inte var tillgängligt.

De två uttryckliga förhandsvisningarna ska visa etiketter med månaden först respektive dagen först för samma datum, den 12 november. Raden för den aktuella lokalen följer den lokala inställning som används på din Mac. Båda formateringsvägarna begär ett fullständigt månadsnamn och en dag, utan att lägga till år eller tid. Se resultatet som lokaliserad visningstext; undvik att låta efterföljande bearbetning bero på ett visst blanksteg eller skiljetecken. Unicodes modell för mönstermatchning tillåter lokalspecifika ordningar. Unicode Technical Standard #35, Part 4: Dates

Det gregorianska kalenderformatet i programmet är avsiktligt: de syntetiska källfälten definieras i den kalendern. Den hålls fast medan lokalen ändrar presentationen. Om dina källdatum använder en annan kalender ska du tolka fälten enligt den kalendern innan du bestämmer hur de ska visas. Apples initierare exponerar lokal, kalender och tidszon separat för detta ändamål. Format-style initializer

Använd en lokaliserad mall i befintlig DateFormatter-kod

Programmets andra väg använder setLocalizedDateFormatFromTemplate("MMMMd"). Här begär MMMM en fullständig månad och d en dag i månaden. Strängen är en mall som skickas till en lokaliseringsmetod; den tilldelas inte direkt som slutlig dateFormat. Apples eget exempel använder exakt den här mallen för att skapa olika ordningar mellan månad och dag. DateFormatter

Ange locale innan du anropar mallmetoden. Apple kräver uttryckligen denna ordning eftersom metoden härleder formatet utifrån formaterarens lokal vid det tillfället. Om du senare väljer en annan lokal anropar du mallmetoden igen. Exemplet skapar en ny formaterare för varje förhandsvisning, vilket gör detta beroende tydligt. setLocalizedDateFormatFromTemplate(_:)

För den här etikettuppgiften väljer du den metod som passar din befintliga kod: fältmodifierare i det moderna Swift-API:et eller den lokaliserade mallmetoden i ett DateFormatter-arbetsflöde. Undvik att sätta ihop separat formaterade strängar för månad och dag med en egen avskiljare, eftersom det tar ifrån datumformateraren ansvaret för ordningen.

Hantera tidsstämplar utan att råka ändra uppgiften

Anta att källan i stället innehåller den syntetiska tidsstämpeln 2026-11-12T00:30:00Z. Den identifierar en tidpunkt. Om den visas med förskjutningen +00:00 blir resultatet 12 november; om samma tidpunkt visas med förskjutningen -02:00 blir resultatet 11 november kl. 22:30. Det här är en illustrativ beräkning av förskjutningen, inte en observerad publiceringshändelse. RFC 3339 definierar numeriska förskjutningar som lokal tid minus UTC. RFC 3339, section 4.2

Tolka sådana indata med ett ISO 8601-API som är konfigurerat för den faktiska representationen och formatera sedan den resulterande tidpunkten med den valda visningszonen. Apple dokumenterar ISO8601DateFormatter och alternativet .withInternetDateTime för RFC 3339-strängar med datum och tid. Det alternativet är en konfiguration för tolkning, skild från begäran om lokaliserad utmatning av månad och dag. ISO8601DateFormatter formatOptions

Använd inte detta arbetsflöde för tidsstämplar på en källa som bara anger ett civilt datum, såvida du inte medvetet har definierat konverteringskonventionen. Utgå inte heller från att suffixet Z identifierar publiceringens namngivna tidszon. RFC 9557 behandlar information om namngiven tidszon som ytterligare information utöver den grundläggande tidsstämpelrepresentationen. RFC 9557

Felsök en oväntad etikett i rätt ordning

Följ den här ordningen för att avgöra vilket beslut som behöver ändras:

  1. Dagen är fel: kontrollera om indata är ett civilt datum eller en tidpunkt. I programmet för civila datum ska skapandet och formateringen ske i UTC. För en tidpunkt kontrollerar du den avsedda visningszonen.
  2. Månad och dag visas i fel ordning: granska lokalen som skickas till formateraren och leta efter en direkt tilldelad dateFormat eller manuellt hopfogade strängar.
  3. Ändrad ordning på modifierare får ingen effekt: det är dokumenterat beteende. Välj rätt lokal i stället för att flytta om .month() och .day().
  4. Mallresultatet behåller en tidigare ordning: ange den nya lokalen och generera sedan formatet på nytt med setLocalizedDateFormatFromTemplate.
  5. Källfälten är ogiltiga: rapportera eller rätta indata. Det kompletta programmet kontrollerar giltigheten före konvertering i stället för att ersätta datumet med ett annat publiceringsdatum.

Dessa kontroller följer den dokumenterade åtskillnaden mellan en tidpunkt, dess kalenderbaserade tolkning och dess lokaliserade presentation. Apple dokumenterar att modifierarordningen saknar betydelse, i vilken ordning mallen ska konfigureras och hur datumkomponenter valideras i motsvarande API:er. Date.FormatStyle, setLocalizedDateFormatFromTemplate(_:), DateComponents

Behåll hela källdatumet eller tidsstämpeln efter att du har skapat etiketten. En sträng med månad och dag utelämnar avsiktligt året, och en formaterad tidsstämpelsetikett utelämnar också tid och tidszon; visningstexten kan inte bevara hela indata. För en tillförlitlig publiceringsetikett behåller du originalvärdet, väljer kalender och tidszon med omsorg och låter lokalen ordna den begärda månaden och dagen.

Källor