Saltar al contenido

Tokens de formato de fecha

Hay dos familias ampliamente utilizadas de cadenas de formato de fecha y se superponen lo suficiente para ser peligrosas. strftime—de C, e heredado por Python, Ruby, PHP y GNU date—usa tokens de porcentaje como %Y. Unicode LDML, usado por ICU, Java, moment y dayjs, usa letras repetidas como yyyy. En LDML, MM es un mes y mm es un minuto; obtener ese par al revés es el error clásico.

Cada fila a continuación se renderiza para el mismo instante: lunes 9 de marzo de 2026, 14:05:07 UTC. Esa fecha se elige para que nada se oculte—un día y mes de un solo dígito exponen el relleno con ceros, la hora de la tarde hace que los relojes de 12 y 24 horas difieran visiblemente, y el día de la semana es inequívoco.

Una columna de equivalente vacía significa que el otro dialecto no tiene un token único para él y tienes que componer el valor tú mismo. El conjunto de pruebas renderiza los campos del calendario con las propias funciones de fecha de la plataforma y los compara con esta tabla, para que los ejemplos no puedan alejarse de la realidad.

Año

4
strftimeLDMLCampoSe renderiza como
%YyyyyAño de cuatro dígitos2026
%yyyAño de dos dígitosAmbiguo por construcción. Evítalo en cualquier cosa almacenada.26
%CSiglo—el año dividido por 10020
%GYYYYAño de numeración de semana ISODifiere del año calendario alrededor de Año Nuevo. Usa solo con el número de semana ISO.2026

Mes

4

En LDML, MM es el mes e mm es el minuto.

strftimeLDMLCampoSe renderiza como
%mMMMes, rellenado con ceros03
%-mMMes, sin relleno3
%bMMMNombre de mes abreviadoMar
%BMMMMNombre de mes completoMarch

Día e día de la semana

8

En LDML, dd es día del mes e DDD es día del año.

strftimeLDMLCampoSe renderiza como
%dddDía del mes, rellenado con ceros09
%-ddDía del mes, sin relleno9
%eDía del mes, relleno de espacio 9
%jDDDDía del año, 001–366068
%aEEENombre de día de la semana abreviadoMon
%AEEEENombre completo del día de la semanaMonday
%uDía de la semana como número, lunes es 1%w numera los mismos días de domingo como 0.1
%VwwNúmero de semana ISO, semanas que comienzan el lunes11

Hora

8
strftimeLDMLCampoSe renderiza como
%HHHHora en el reloj de 24 horas14
%-HHHora, sin relleno14
%IhhHora en el reloj de 12 horas02
%MmmMinuto05
%SssSegundo07
%3NSSSMilisegundos000
%paAM o PMPM
%sMarca de tiempo Unix—segundos desde 1970-01-01 UTC1773065107

Zona horaria

3

Un desplazamiento es un número; un nombre de zona es una regla. Solo el nombre sobrevive a un cambio DST.

strftimeLDMLCampoSe renderiza como
%zZZDesplazamiento UTC, sin dos puntos+0000
%:zXXXDesplazamiento UTC con dos puntos, como ISO 8601 lo desea+00:00
%ZzzzAbreviatura de zona horariaLas abreviaturas no son únicas—CST es al menos tres zonas diferentes.UTC

Combinaciones comunes

7

Construidas a partir de los tokens anteriores—sin biblioteca necesaria.

strftimeLDMLCampoSe renderiza como
%Fyyyy-MM-ddFecha ISO2026-03-09
%THH:mm:ssHora de 24 horas14:05:07
%FT%T%:zyyyy-MM-dd'T'HH:mm:ssXXXMarca de tiempo ISO 8601 completaEl formato para almacenar. Se ordena como texto, inequívoco sobre el desplazamiento.2026-03-09T14:05:07+00:00
%a, %d %b %Y %T %zEEE, dd MMM yyyy HH:mm:ss ZZRFC 2822—encabezados de correo electrónico e HTTP más antiguoMon, 09 Mar 2026 14:05:07 +0000
%m/%d/%YMM/dd/yyyyConvención estadounidense, mes primero03/09/2026
%d.%m.%Ydd.MM.yyyyConvención europea, día primero09.03.2026
%%''Un signo de porcentaje literal%

Preguntas frecuentes

¿Cuál es la diferencia entre yyyy y YYYY?
En LDML, yyyy es el año calendario e YYYY es el año de numeración de la semana ISO. Difieren durante algunos días de enero: 2027-01-01 cae en la semana ISO 53 de 2026, así que YYYY lee 2026 allí. Usar YYYY por accidente produce un error que aparece una vez al año y luego desaparece, por eso es tan difícil de atrapar.
¿Por qué mi mes aparece como minutos?
Porque estás en un dialecto LDML y usaste mm en lugar de MM. LDML distingue entre mayúsculas y minúsculas: M es mes, m es minuto, D es día del año, d es día del mes. strftime tiene la misma trampa en un lugar diferente—%M es minutos y %m es el mes.
¿Cómo obtengo un número con relleno versus sin relleno?
En strftime, la extensión GNU %-d elimina el relleno, así que %d es 09 y %-d es 9. En LDML el número de letras establece el ancho directamente: d es 9 y dd es 09. Ninguno es portátil—%-d no existe en todas las plataformas.
¿En qué formato debo almacenar fechas?
ISO 8601 con un desplazamiento explícito—2026-03-09T14:05:07+00:00. Se ordena correctamente como texto, es inequívoco sobre el desplazamiento, e todos los idiomas lo analizan. Almacena eso y formatea para mostrar en el último momento posible; una fecha local almacenada sin un desplazamiento es una pérdida de información irrecuperable.