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:
- 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.
- O mês e o dia aparecem na ordem errada: inspecione a localidade passada ao formatador e verifique se há um
dateFormatatribuído diretamente ou strings concatenadas manualmente. - Alterar a ordem dos modificadores não produz efeito: esse é o comportamento documentado. Selecione a localidade adequada em vez de reorganizar
.month()e.day(). - A saída do modelo mantém uma disposição anterior: defina a nova localidade e, em seguida, gere o formato novamente com
setLocalizedDateFormatFromTemplate. - 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
- 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