Para crear una etiqueta de publicación con mes y día en un Mac, solicite esos dos campos con el formateador Foundation de Swift y deje que la configuración regional los organice. Primero decida si su entrada es una fecha de calendario o una marca de tiempo: eso determina si una zona horaria debe cambiar el día mostrado.

Esta guía recorre un pequeño script de Terminal para producir etiquetas de publicación a partir de fechas sintéticas. Utiliza Date.FormatStyle para la operación principal y muestra la alternativa basada en plantillas para código existente con DateFormatter. Apple documenta ambos enfoques para salida de fechas localizadas. Date.FormatStyle, DateFormatter

Solicite mes y día como campos, no como patrón terminado

Un patrón como MMMM d fija el mes antes del día. Una solicitud de campos localizada especifica qué incluir mientras deja la disposición al formateador. En Swift, la expresión relevante es Date.FormatStyle().month(.wide).day(). Apple indica explícitamente que el orden de los modificadores de formato no afecta la cadena resultante. Llamar a .day() primero no fuerza, por tanto, una salida con día primero. Date.FormatStyle

Para la fecha sintética de publicación 12 de noviembre de 2026, las etiquetas ilustrativas son November 12 con en_US y 12 November con en_GB. Estas son configuraciones regionales de vista previa explícitas; el script funcional también imprime una etiqueta usando la configuración regional actual del Mac. Apple demuestra la misma diferencia de orden mes-día con su API de plantillas localizadas. DateFormatter

Unicode describe la distinción subyacente mediante esqueletos de fecha: contienen los campos solicitados y sus longitudes, y el software los empareja con un patrón localizado apropiado. Por ejemplo, MMMd solicita un mes abreviado y un día. No prescribe una barra, un espacio ni el orden final de visualización. Este es el principio útil para trasladar entre APIs: seleccione componentes y deje que el formateador ensamble la etiqueta. Unicode Technical Standard #35, Part 4: Dates

Decida qué representa su fecha de publicación

Antes de formatear, elija la fila apropiada a continuación. Esta decisión evita que un formateador correcto muestre un día de calendario no intencionado.

Entrada Significado Decisión de formato
Año 2026, mes 11, día 12 Una fecha civil: un día en un calendario especificado Preserve esos campos; use un calendario y zona horaria consistentes al pasar por Date
2026-11-12T00:30:00Z Una marca de tiempo que identifica un instante Analice el instante, luego elija la zona horaria en la que mostrarlo
+02:00 Un desplazamiento numérico desde UTC Suficiente para relacionar una marca de tiempo local con UTC; no identifica una zona con nombre
Europe/London Un identificador de zona horaria con nombre Use sus reglas para el instante que se muestra

Apple define Date como un punto en el tiempo independiente de cualquier calendario o zona horaria. DateComponents contiene campos como año, mes y día que se evalúan usando un calendario y zona horaria. Por consiguiente, un registro de publicación solo con fecha necesita una convención de conversión explícita al pasarse a una API que formatea Date. Date, DateComponents

Para esta tarea, la convención es directa: mantenga el año, mes y día de origen, construya una fecha gregoriana a mediodía en UTC y formátela usando ese mismo calendario y zona UTC. El mediodía es simplemente un ancla elegida para este ejemplo. Mantener consistentes la construcción y el formato es lo que preserva la fecha. El ancla no afirma una hora real de publicación.

Para una marca de tiempo genuina, elija la zona de visualización intencionada. Una configuración regional controla la presentación; no suministra la zona intencionada de la marca de tiempo. Una zona con nombre puede tener diferentes desplazamientos en distintos instantes, mientras que un desplazamiento numérico fijo no proporciona tales reglas. Apple expone tanto identificadores de zona como operaciones de desplazamiento en una fecha. RFC 3339 define desplazamientos de marca de tiempo, y RFC 9557 extiende esa representación para transportar información adicional incluyendo una zona horaria. TimeZone, RFC 3339, RFC 9557

Ejecute un formateador completo de mes y día en Terminal

Use macOS 12 o posterior con una cadena de herramientas Swift y el SDK de macOS disponibles. Apple documenta el inicializador de Date.FormatStyle usado aquí como disponible desde macOS 12. La página oficial de instalación de Swift proporciona instrucciones de configuración para Mac, incluyendo Xcode para desarrollo en plataformas de Apple. Inicializador de estilo de formato, Instalar Swift — macOS

Guarde el siguiente programa completo como MonthDay.swift en un editor de texto plano. Contiene sus propios datos de muestra sintéticos, valida los campos del calendario e imprime vistas previas de configuración regional actual y explícitas. También imprime el resultado equivalente basado en plantillas para que pueda comparar las dos 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 Terminal, cambie a la carpeta que contiene el archivo y ejecute swift MonthDay.swift. Si la cadena de herramientas Swift no está disponible, complete los pasos oficiales de instalación para Mac antes de continuar. Este ejemplo fue inspeccionado contra la documentación pero no se ejecutó en este entorno de investigación porque Swift no estaba disponible.

Las dos vistas previas explícitas deberían demostrar etiquetas con mes primero y día primero para la misma fecha del 12 de noviembre. La línea de configuración regional actual sigue el ajuste de configuración regional actual de su Mac. Ambas rutas de formateador solicitan un nombre de mes completo y día sin añadir año ni hora. Trate la salida como texto de visualización localizado; evite hacer que el procesamiento posterior dependa de un carácter de espacio o puntuación particular. El modelo de coincidencia de patrones de Unicode permite disposiciones específicas de configuración regional. Unicode Technical Standard #35, Part 4: Dates

El calendario gregoriano en este programa es intencional: los campos de origen sintéticos están definidos en ese calendario. Permanece fijo mientras la configuración regional cambia la presentación. Si sus fechas de origen usan un calendario diferente, interprete sus campos usando ese calendario antes de decidir cómo mostrarlos. El inicializador de Apple expone configuración regional, calendario y zona horaria por separado para este propósito. Inicializador de estilo de formato

Use una plantilla localizada en código existente de DateFormatter

La segunda ruta en el programa usa setLocalizedDateFormatFromTemplate("MMMMd"). Aquí, MMMM solicita un mes completo y d solicita un día del mes. La cadena es una plantilla pasada a un método de localización; no se asigna directamente como el dateFormat final. El propio ejemplo de Apple usa esta plantilla exacta para producir diferentes órdenes de mes y día. DateFormatter

Establezca locale antes de llamar al método de plantilla. Apple exige explícitamente esa secuencia porque el método deriva el formato usando la configuración regional del formateador en ese punto. Si luego selecciona otra configuración regional, llame al método de plantilla de nuevo. El ejemplo crea un formateador nuevo para cada vista previa, haciendo visible esa dependencia. setLocalizedDateFormatFromTemplate(_:)

Para esta tarea de etiqueta, elija la ruta que se ajuste a su código existente: modificadores de campo en la API moderna de Swift, o el método de plantilla localizada en un flujo de trabajo con DateFormatter. Evite ensamblar cadenas de mes y día formateadas por separado con su propio separador, porque hacerlo quita la responsabilidad de la disposición al formateador de fechas.

Maneje marcas de tiempo sin cambiar accidentalmente la tarea

Suponga que la fuente en su lugar proporciona la marca de tiempo sintética 2026-11-12T00:30:00Z. Eso identifica un instante. Mostrarla con desplazamiento +00:00 produce 12 de noviembre; mostrar el mismo instante con desplazamiento -02:00 produce 11 de noviembre a las 22:30. Este es un cálculo de desplazamiento ilustrativo, no un evento de publicación observado. RFC 3339 define desplazamientos numéricos como hora local menos UTC. RFC 3339, sección 4.2

Analice dicha entrada con una API ISO 8601 configurada para su representación real, luego formatee el instante resultante con la zona de visualización seleccionada. Apple documenta ISO8601DateFormatter y su opción .withInternetDateTime para cadenas de fecha y hora RFC 3339. Esa opción es una configuración de análisis, separada de la solicitud de salida localizada de mes y día. Opciones de formato ISO8601DateFormatter

No aplique este flujo de trabajo de marca de tiempo a una fuente que suministre solo una fecha civil a menos que haya definido deliberadamente la convención de conversión. Tampoco asuma que el sufijo Z identifica la zona horaria con nombre de la publicación. RFC 9557 trata la información de zona con nombre como información adicional más allá de la representación base de la marca de tiempo. RFC 9557

Diagnostique una etiqueta inesperada en el orden correcto

Use esta secuencia para identificar qué decisión necesita cambiar:

  1. El día es incorrecto: verifique si la entrada es una fecha civil o un instante. Para el programa de fecha civil, mantenga la construcción y el formato en UTC. Para un instante, verifique la zona de visualización intencionada.
  2. El mes y el día aparecen en el orden incorrecto: inspeccione la configuración regional pasada al formateador y busque un dateFormat asignado directamente o cadenas unidas manualmente.
  3. Cambiar el orden de modificadores no tiene efecto: ese es el comportamiento documentado. Seleccione la configuración regional apropiada en lugar de reordenar .month() y .day().
  4. La salida de plantilla conserva una disposición anterior: establezca la nueva configuración regional, luego regenere el formato con setLocalizedDateFormatFromTemplate.
  5. Los campos de origen son inválidos: informe o corrija la entrada. El programa completo verifica la validez antes de la conversión en lugar de sustituir otra fecha de publicación.

Estas comprobaciones siguen la separación documentada entre un instante, su interpretación en calendario y su presentación localizada. Apple documenta la independencia del orden de modificadores, el orden de configuración de plantilla y la validación de componentes de fecha en las APIs correspondientes. Date.FormatStyle, setLocalizedDateFormatFromTemplate(_:), DateComponents

Conserve la fecha o marca de tiempo completa de origen después de producir la etiqueta. Una cadena de mes y día omite intencionalmente el año, y una etiqueta de marca de tiempo formateada también omite su hora y zona; ese texto de visualización no puede preservar la entrada completa. Para una etiqueta de publicación confiable, retenga el valor original, elija el calendario y la zona deliberadamente y deje que la configuración regional organique el mes y día solicitados.

Fuentes