También disponible en: English · Português · Français · العربية
Formato ISO 8601: analizador y validador
Pega cualquier cadena ISO 8601 y verás qué significa, qué gramáticas la aceptan y qué hace tu propio navegador con ella.
¿Qué es el formato ISO 8601?
ISO 8601 es la norma internacional para escribir fechas y horas de modo que se ordenen bien, se lean igual en cualquier país y nadie tenga que preguntarse si 03/08 es marzo o agosto. Su escritura más conocida es la que casi todo el mundo quiere decir con «el formato ISO 8601»: la fecha como 2026-08-03, la hora detrás de una T y el desfase respecto a UTC al final, lo que da 2026-08-03T12:00:00Z.
La norma es bastante más ancha que esa única escritura, y de ahí nace casi toda la confusión. ISO 8601 define además fechas sin separadores, fechas que dan el día del año en vez del mes, fechas que numeran la semana en vez del día, duraciones e intervalos entre dos puntos. Todo eso es ISO 8601. Muy poco software acepta todo eso.
Así que un validador que solo responde «válido» o «inválido» está contestando a una pregunta que no tiene una única respuesta. Este da tres veredictos a la vez —ISO 8601, RFC 3339 y el formato que define JavaScript— porque una cadena puede ser impecable según uno y ser rechazada por los otros dos, y saber cuál es cuál es lo que de verdad sirve.
Cómo usar el analizador
- Pega tu cadena. Una fecha, una fecha con hora, una duración que empiece por P o un intervalo con una barra en medio. Los botones de ejemplo cargan una de cada, incluidas dos que la mayoría de los analizadores rechaza.
- Lee qué significa. La fecha resuelta, el instante en UTC y en tu propia zona horaria, el desfase tal como está escrito, y esa misma fecha expresada como fecha ordinal y como fecha de semana para que veas sus otras escrituras.
- Mira los tres veredictos. Cada gramática dice si acepta la cadena y, cuando no, qué regla exacta se ha incumplido. Debajo, tu propio navegador lo intenta con la misma cadena.
ISO 8601, RFC 3339 y JavaScript son tres conjuntos distintos
Estos tres nombres se usan como sinónimos y no deberían. Medimos los tres contra las mismas cadenas, y ninguno es un subconjunto de otro: se solapan.
El Date.parse de JavaScript acepta 2026 y 2026-08, una t y una z minúsculas, un espacio donde va la T, y un desfase escrito +0200 sin dos puntos. Rechaza la forma básica 20260803, la fecha de semana 2026-W31-1, la fecha ordinal 2026-215 y —esta es la rara— una fracción escrita con coma, que es justo el separador que la gramática de ISO 8601 pone en primer lugar. La biblioteca estándar de Python toma casi las decisiones contrarias: acepta la notación básica, las fechas de semana y la coma, y rechaza 2026-08, las minúsculas y la hora 24. Una fecha ordinal la rechazan los dos, y es ISO 8601 perfectamente legal.
RFC 3339, el perfil que se usa en los protocolos de internet, es el más estricto de los tres y es una gramática normativa, no una descripción. Exige la T, exige que el desfase esté presente y escrito entero como ±HH:MM, y solo admite el punto antes de una fracción de segundo. También permite algo que los otros dos ni tocan: un segundo intercalar, escrito :60. Así que 2016-12-31T23:59:60Z es una marca de tiempo RFC 3339 válida que prácticamente ninguna biblioteca de fechas puede representar.
La norma que usa JavaScript es honesta sobre su propio alcance. La sección 21.4.1.32 de ECMA-262 describe su formato como «una simplificación del formato extendido de fecha de calendario de ISO 8601», de modo que las fechas de semana, las ordinales y la notación básica quedan fuera por diseño, no por descuido. Todo lo que no encaje se deja, en palabras de la norma, a «la heurística propia de cada implementación», y por eso la herramienta ejecuta Date.parse en tu navegador en vez de contarte lo que hacen los navegadores.
Date.parse no valida fechas
Esta es la trampa que conviene conocer, y no es un fallo del navegador: se deduce de la norma. El formato de JavaScript da el día como «dos cifras decimales del 01 al 31», sin referencia alguna al mes. Así que 2026-02-30 es una cadena conforme, y los navegadores la interpretan y luego dejan que el día se desborde: obtienes el 2 de marzo. En cambio 2026-13-01 devuelve NaN, porque 13 se sale del rango declarado para un mes.
La consecuencia es que comprobar una fecha preguntando si Date.parse devuelve NaN acepta el 30 de febrero, el 31 de abril y el 29 de febrero de un año que no tiene ese día. Este analizador los rechaza todos, y por eso hay un botón de ejemplo con uno: pégalo y la herramienta te dirá que tu propio navegador ha aceptado una fecha imposible, y te enseñará qué fecha se ha inventado.
Hay una segunda sorpresa, también prevista, en el mismo terreno. La sección 21.4.3.2 de ECMA-262 dice que, cuando falta el desfase, las formas de solo fecha se leen como UTC y las de fecha con hora se leen como hora local. Así que 2026-08-03 es medianoche UTC, mientras que 2026-08-03T00:00:00 es medianoche donde tú estés: añadir una hora a una fecha desplaza el instante tu desfase entero en silencio, y la misma cadena significa momentos distintos en máquinas distintas. La herramienta te lo avisa siempre que tu entrada no lleva desfase.
Las formas que casi ningún programa ha visto
Una fecha ordinal cambia el mes y el día por el día del año: 2026-215 es el día 215 de 2026, o sea el 3 de agosto. Una fecha de semana numera la semana: 2026-W31-1 es el lunes de la semana 31. La numeración de semanas tiene una regla que sorprende: una semana pertenece al año que contiene su jueves, así que la primera semana de un año puede empezar en diciembre. 2026-W01-1 es el 29 de diciembre de 2025, y la herramienta lo dice cuando los dos años no coinciden.
La notación básica simplemente quita los separadores y da 20260803 y 20260803T120000Z. Es la forma que aparece en nombres de archivo, en exportaciones de datos antiguas y en los bloques EXIF dentro de las fotografías, y es la razón de que un número suelto de ocho cifras en un archivo de datos sea tan a menudo una fecha.
Una duración empieza por P: P3Y6M4DT12H30M5S son tres años, seis meses, cuatro días, doce horas, treinta minutos y cinco segundos. La herramienta te suma una en milisegundos, pero solo cuando puede. Una duración que use años o meses no tiene longitud fija, porque cuánto dura depende de cuándo empieza, así que no existe un único número honesto y la herramienta lo dice en vez de elegir un promedio. Un intervalo son dos de estas cosas separadas por una barra, en cualquiera de tres combinaciones: dos instantes, un instante y una duración, o una duración y un instante.
Lo que esta página no va a fingir que sabe
ISO 8601 lo vende la Organización Internacional de Normalización y no es de lectura libre. La gramática contra la que comprueba esta herramienta es la ABNF recopilada que se publica como Apéndice A del RFC 3339, que es lo más parecido a una versión libre y citable, y que se desautoriza a sí misma con bastante detalle. Está marcada como informativa, se armó a partir de la edición de 1988, y abre diciendo que ISO 8601 no define ninguna gramática formal.
Luego enumera cuatro puntos en los que la norma no está clara: si pueden mezclarse la notación básica y la extendida en una misma cadena, si la hora 24 solo vale cuando los minutos y los segundos son cero, si la T puede omitirse alguna vez, y una regla sobre la fracción decimal en la que la sección 5.3.1.3 y el Anexo B.2 de la norma se contradicen abiertamente. Los autores del RFC tuvieron que decidir cuál de los dos estaba equivocado. Ese es el estado de la cuestión en una norma que todo el mundo cita como si lo dejara todo resuelto.
La hora 24 ilustra muy bien lo poco que hay de acuerdo. ECMA-262 la permite y añade una nota diciendo que eso es coherente con ISO 8601 «aunque esa norma la reserva para describir intervalos de tiempo y no la admite dentro de la representación de un punto único en el tiempo». El apéndice del RFC 3339 dice en cambio que ISO 8601 «no está claro» al respecto, y da por hecho que la hora 24 vale en cualquier sitio. Dos documentos libres que describen la misma norma de pago, en desacuerdo sobre lo que dice.
Por último, el rango. Las fechas de JavaScript abarcan unos 273.790 años a cada lado de 1970, y el último instante que puede guardarse es el 13 de septiembre de 275760. Cualquier cosa más allá se rechaza aquí en vez de mostrarse mal, porque la norma dice que esas cadenas deben devolver NaN sin recurrir a conjeturas.
¿Por qué es gratis?
El análisis ocurre en tu navegador. Nada de lo que pegas se sube, se registra ni se guarda: cerrar la pestaña es todo el borrado que hace falta. Aquí eso importa más de lo habitual, porque las marcas de tiempo que uno necesita descifrar suelen salir de registros de producción y de informes de error.
Sin cuenta, sin registro, sin límite de cadenas y sin marca de agua en nada de lo que copies.