Para criar um rótulo de publicação com mês e dia em um Mac, solicite esses dois campos ao formatador Foundation do Swift e deixe que a localidade determine a ordem. Primeiro, decida se sua entrada é uma data de calendário ou um carimbo de data e hora: isso determina se um fuso horário deve alterar o dia exibido.

Este guia apresenta um pequeno script de Terminal para gerar rótulos de publicação a partir de datas sintéticas. Ele usa Date.FormatStyle para a operação principal e mostra a alternativa baseada em modelo para código existente com DateFormatter. A Apple documenta ambas as abordagens para a saída de datas localizada. Date.FormatStyle, DateFormatter

Solicite mês e dia como campos, não como um padrão pronto

Um padrão como MMMM d fixa o mês antes do dia. Uma solicitação de campos localizada especifica o que incluir, deixando a organização a cargo do formatador. No Swift, a expressão relevante é Date.FormatStyle().month(.wide).day(). A Apple afirma explicitamente que a ordem dos modificadores de formatação não afeta a string resultante. Portanto, chamar .day() primeiro não força a saída com o dia antes do mês. Date.FormatStyle

Para a data sintética de publicação, 12 de novembro de 2026, os rótulos ilustrativos são November 12 com en_US e 12 November com en_GB. Essas são localidades de visualização explícitas; o script em execução também imprime um rótulo usando a localidade atual do Mac. A Apple demonstra a mesma diferença na ordem entre mês e dia com sua API de modelo localizado. DateFormatter

O Unicode descreve a distinção subjacente por meio de esqueletos de data: eles contêm os campos solicitados e o tamanho de cada campo, e o software os associa a um padrão localizado adequado. Por exemplo, MMMd solicita um mês abreviado e um dia. Ele não determina uma barra, um espaço nem a ordem final de exibição. Este é o princípio útil a levar entre APIs: selecione os componentes e, em seguida, deixe o formatador montar o rótulo. Unicode Technical Standard #35, Part 4: Dates

Decida o que sua data de publicação representa

Antes de formatar, escolha a linha apropriada abaixo. Essa decisão evita que um formatador correto exiba um dia de calendário indesejado.

Entrada Significado Decisão de formatação
Ano 2026, mês 11, dia 12 Uma data civil: um dia em um calendário especificado Preserve esses campos; use um calendário e um fuso horário consistentes ao fazer a conversão para Date
2026-11-12T00:30:00Z Um carimbo de data e hora que identifica um instante Analise o instante e, em seguida, escolha o fuso horário em que ele será exibido
+02:00 Um deslocamento numérico em relação ao UTC Suficiente para relacionar um horário local ao UTC; não identifica um fuso horário nomeado
Europe/London Um identificador de fuso horário nomeado Use as regras desse fuso para o instante exibido

A Apple define Date como um ponto no tempo independente de qualquer calendário ou fuso horário. DateComponents contém campos como ano, mês e dia, interpretados segundo um calendário e um fuso horário. Por isso, um registro de publicação que contenha apenas uma data exige uma convenção de conversão explícita quando é passado a uma API que formata Date. Date, DateComponents

Para esta tarefa, a convenção é simples: mantenha o ano, o mês e o dia de origem, construa uma data gregoriana ao meio-dia no UTC e formate-a usando esse mesmo calendário e o fuso UTC. O meio-dia é apenas uma referência escolhida para este exemplo. Manter consistentes a construção e a formatação é o que preserva a data. Essa referência não representa um horário real de publicação.

Para um carimbo de data e hora real, escolha o fuso horário de exibição pretendido. Uma localidade controla a apresentação; ela não fornece o fuso pretendido para o carimbo. Um fuso nomeado pode ter deslocamentos diferentes em instantes diferentes, ao passo que um deslocamento numérico fixo não fornece essas regras. A Apple disponibiliza identificadores de fuso horário e operações para obter o deslocamento em uma data. A RFC 3339 define os deslocamentos de carimbo de data e hora, e a RFC 9557 estende essa representação para incluir informações adicionais, como um fuso horário. TimeZone, RFC 3339, RFC 9557

Execute no Terminal um formatador completo de mês e dia

Use o macOS 12 ou posterior, com a cadeia de ferramentas do Swift e o SDK do macOS disponíveis. A Apple documenta que o inicializador Date.FormatStyle usado aqui está disponível a partir do macOS 12. A página oficial de instalação do Swift traz instruções de configuração para Mac, incluindo o Xcode para desenvolvimento nas plataformas Apple. Format-style initializer, Install Swift — macOS

Salve o programa completo a seguir como MonthDay.swift em um editor de texto simples. Ele contém seus próprios dados de exemplo sintéticos, valida os campos do calendário e imprime visualizações usando a localidade atual e localidades explícitas. Também imprime o resultado equivalente baseado em modelo para que você possa comparar as duas APIs.

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

Abra o Terminal, navegue até a pasta que contém o arquivo e execute swift MonthDay.swift. Se a cadeia de ferramentas do Swift não estiver disponível, conclua as etapas oficiais de instalação para Mac antes de prosseguir. Este exemplo foi analisado à luz da documentação, mas não foi executado neste ambiente de pesquisa, pois o Swift não estava disponível.

As duas visualizações explícitas devem demonstrar rótulos com o mês antes e depois do dia para a mesma data, 12 de novembro. A linha da localidade atual segue a configuração de localidade atual do seu Mac. Ambos os caminhos de formatação solicitam o nome completo do mês e o dia, sem acrescentar ano ou horário. Trate a saída como texto de exibição localizado; evite fazer com que o processamento posterior dependa de um caractere específico de espaço ou pontuação. O modelo de correspondência de padrões do Unicode permite disposições específicas de cada localidade. Unicode Technical Standard #35, Part 4: Dates

O calendário gregoriano neste programa é intencional: os campos sintéticos de origem são definidos nesse calendário. Ele permanece fixo enquanto a localidade altera a apresentação. Se suas datas de origem usam outro calendário, interprete os campos com esse calendário antes de decidir como exibi-los. O inicializador da Apple expõe a localidade, o calendário e o fuso horário separadamente para esse fim. Format-style initializer

Use um modelo localizado no código existente com DateFormatter

O segundo caminho no programa usa setLocalizedDateFormatFromTemplate("MMMMd"). Nesse caso, MMMM solicita um mês por extenso e d solicita um dia do mês. A string é um modelo passado a um método de localização; ela não é atribuída diretamente como o dateFormat final. O próprio exemplo da Apple usa exatamente esse modelo para produzir ordens diferentes de mês e dia. DateFormatter

Defina locale antes de chamar o método do modelo. A Apple exige explicitamente essa sequência porque o método deriva o formato usando a localidade do formatador naquele momento. Se depois você selecionar outra localidade, chame o método do modelo novamente. O exemplo cria um formatador novo para cada visualização, tornando essa dependência visível. setLocalizedDateFormatFromTemplate(_:)

Para esta tarefa de rótulo, escolha o caminho que melhor se encaixa no seu código existente: modificadores de campo na API moderna do Swift ou o método de modelo localizado em um fluxo de trabalho com DateFormatter. Evite montar strings separadas para mês e dia com um separador próprio, pois isso tira do formatador de datas a responsabilidade pela ordem.

Trate carimbos de data e hora sem alterar a tarefa por engano

Suponha que a origem forneça, em vez disso, o carimbo de data e hora sintético 2026-11-12T00:30:00Z. Ele identifica um instante. Exibi-lo com o deslocamento +00:00 resulta em 12 de novembro; exibir o mesmo instante com o deslocamento -02:00 resulta em 11 de novembro às 22h30. Este é um cálculo ilustrativo de deslocamento, não um evento de publicação observado. A RFC 3339 define os deslocamentos numéricos como horário local menos UTC. RFC 3339, section 4.2

Analise essa entrada com uma API ISO 8601 configurada para a representação real e, em seguida, formate o instante resultante com o fuso horário de exibição selecionado. A Apple documenta ISO8601DateFormatter e sua opção .withInternetDateTime para strings de data e hora RFC 3339. Essa opção é uma configuração de análise separada da solicitação de saída localizada de mês e dia. ISO8601DateFormatter formatOptions

Não aplique esse fluxo de trabalho de carimbo de data e hora a uma origem que forneça apenas uma data civil, a menos que você tenha definido deliberadamente a convenção de conversão. Da mesma forma, não suponha que o sufixo Z identifique o fuso horário nomeado da publicação. A RFC 9557 trata as informações de fuso nomeado como adicionais à representação básica do carimbo de data e hora. RFC 9557

Diagnostique um rótulo inesperado na ordem correta

Siga esta sequência para identificar qual decisão precisa ser alterada:

  1. O dia está errado: verifique se a entrada é uma data civil ou um instante. No programa de data civil, mantenha a construção e a formatação em UTC. Para um instante, confirme o fuso horário de exibição pretendido.
  2. O mês e o dia aparecem na ordem errada: inspecione a localidade passada ao formatador e verifique se há um dateFormat atribuído diretamente ou strings concatenadas manualmente.
  3. Alterar a ordem dos modificadores não produz efeito: esse é o comportamento documentado. Selecione a localidade adequada em vez de reorganizar .month() e .day().
  4. A saída do modelo mantém uma disposição anterior: defina a nova localidade e, em seguida, gere o formato novamente com setLocalizedDateFormatFromTemplate.
  5. Os campos de origem são inválidos: informe ou corrija a entrada. O programa completo verifica a validade antes da conversão, em vez de substituir a data de publicação por outra.

Essas verificações seguem a separação documentada entre um instante, sua interpretação em um calendário e sua apresentação localizada. A Apple documenta a independência da ordem dos modificadores, a ordem de configuração do modelo e a validação dos componentes de data nas APIs correspondentes. Date.FormatStyle, setLocalizedDateFormatFromTemplate(_:), DateComponents

Mantenha a data ou o carimbo de data e hora de origem completos depois de produzir o rótulo. Uma string de mês e dia omite intencionalmente o ano, e um rótulo formatado de carimbo de data e hora também omite o horário e o fuso; esse texto de exibição não pode preservar a entrada completa. Para um rótulo de publicação confiável, retenha o valor original, escolha deliberadamente o calendário e o fuso horário e deixe que a localidade organize o mês e o dia solicitados.

Fontes