Sin subida, 100% local, sin cuenta

Artículo

Duraciones ISO 8601: qué significa P1DT2H

Una respuesta de la YouTube Data API dice que un vídeo dura PT4M13S. Una invitación de calendario lleva P15DT5H0M20S. Un servidor de directorio marca una cuenta con 20260424174227.0Z, que parece relacionado pero es algo completamente distinto. Estas cadenas compactas siguen reglas que vale la pena conocer, porque leerlas mal convierte minutos en meses. Este es un recorrido por el formato de duración ISO 8601: qué significan las letras, dónde aparece el formato, y su gran sutileza, que una duración escrita así no siempre es una cantidad fija de tiempo.

P, T, y qué significan las letras

Una duración ISO 8601 empieza con P (periodo). Luego vienen los componentes de fecha, cada uno un número seguido de su letra de unidad: Y años, M meses, W semanas, D días. Una T separa la parte de fecha de la parte de hora: H horas, M minutos, S segundos. Todos los componentes son opcionales; se escribe solo lo que se necesita. PT15M son 15 minutos, P1DT2H es un día y dos horas, P3W son tres semanas. La T no es decoración: M significa meses antes de ella y minutos después de ella, así que P1M es un mes mientras que PT1M es un minuto. El último componente presente puede llevar una fracción decimal, como en PT0.5S para medio segundo. Y las unidades no se convierten automáticamente entre sí: PT90M es una forma perfectamente válida de escribir una hora y media.

Anatomía de la duración ISO 8601 P3Y6M4DT12H30M5S: P abre el periodo, Y M D son unidades de fecha, T pasa a la hora, H M S son unidades de hora

Dónde te encuentras realmente con el formato

Esta sintaxis está discretamente en todas partes. La YouTube Data API reporta la duración de cada vídeo como una duración ISO 8601 (PT4M13S). HTML acepta duraciones en el atributo datetime del elemento time. Las invitaciones de calendario la usan: el estándar iCalendar (RFC 5545) escribe la duración de un evento como PT1H0M0S, aunque excluye años y meses de su gramática. xs:duration de XML Schema cubre la forma completa e incluso permite un signo menos inicial para duraciones negativas. Las bibliotecas estándar la interpretan directamente: java.time lee cadenas P y T con Period.parse y Duration.parse, y la misma división existe en muchos otros lenguajes. Si generáis horarios, feeds o APIs legibles por máquina, este formato es la lengua franca para "cuánto dura".

Por qué P1M no es un número fijo de segundos

PT15M son siempre 900 segundos. P1M no lo es: un mes dura 28, 29, 30 o 31 días según dónde empiece, así que P1M solo se vuelve concreto cuando se ancla a una fecha. Ni siquiera P1D tiene garantizadas 24 horas. En la Unión Europea, los relojes avanzan el domingo 29 de marzo de 2026, así que ese día de calendario dura 23 horas: sumar P1D (un día de calendario) y sumar PT24H (exactamente 24 horas) a la misma noche de sábado da como resultado instantes distintos. Por eso java.time tiene dos tipos, Period para unidades de calendario y Duration para segundos exactos, y por eso las bibliotecas de fechas piden una fecha de referencia antes de convertir una duración. Tratad los componentes Y, M, W y D como aritmética de calendario, y solo H, M y S como cantidades fijas de tiempo.

No es una duración: 20260424174227.0Z

Una cadena como 20260424174227.0Z parece que podría pertenecer a la misma familia, pero es una marca de tiempo, no una duración, y tampoco es ISO 8601. Es GeneralizedTime, un formato de ASN.1, la notación usada por los directorios LDAP y los certificados X.509. Se lee como campos de ancho fijo: año 2026, mes 04, día 24, luego 17:42:27, una fracción opcional (.0), y Z para UTC. Se encuentra en atributos de Active Directory como whenCreated y whenChanged, en exportaciones LDAP, y dentro de certificados, donde RFC 5280 exige GeneralizedTime para las fechas de validez a partir del año 2050. El detalle que la distingue de la forma compacta de ISO 8601 es la T ausente: ISO escribiría el mismo instante como 20260424T174227Z.

La cadena GeneralizedTime 20260424174227.0Z decodificada campo por campo en 24 de abril de 2026, 17:42:27 UTC

Decodificar una sin leer el estándar

Para una cadena puntual, nuestro convertidor de duración ISO analiza cualquier duración P/T en sus componentes y su total en segundos, y reconstruye la cadena a partir de los números que escribís. Cuando lo que tenéis son dos horas de reloj en lugar de una cadena de duración (un turno que va de 22:00 a 06:30, por ejemplo), la calculadora de duración de tiempo da el tiempo transcurrido, incluidos los tramos que cruzan la medianoche. Ambas funcionan enteramente en vuestro navegador: nada de lo que escribís sale de vuestro dispositivo. Y para una lectura rápida sin ninguna herramienta, dos reflejos cubren la mayoría de los casos: buscad la T para saber si una M significa meses o minutos, y recordad que todo lo que está a la izquierda de la T es aritmética de calendario, no un número fijo de segundos.

Herramientas en este artículo

Preguntas frecuentes

¿Es PT1M lo mismo que P1M?

No. La letra M cambia de significado según el separador T: P1M es un mes, PT1M es un minuto. Es la confusión más común de este formato, y algunos errores de API se han producido precisamente por esto. Ante la duda, buscad primero la T: todo lo anterior se cuenta en años, meses, semanas y días; todo lo posterior se cuenta en horas, minutos y segundos. Una duración bien formada nunca tiene unidades de hora antes de la T ni unidades de fecha después de ella.

¿Cómo se escriben 90 minutos como duración ISO 8601?

PT90M y PT1H30M son ambas válidas y describen la misma cantidad de tiempo. ISO 8601 no obliga a los componentes a mantenerse dentro de sus rangos convencionales, así que minutos por encima de 59 u horas por encima de 23 son correctos. Los analizadores aceptan cualquiera de las dos formas; cuál emite un sistema depende de si normaliza o no. Si generáis duraciones para que las lean personas, PT1H30M es más amable; si comparáis duraciones en código, comparad sus segundos totales en lugar de las cadenas, precisamente porque dos cadenas distintas pueden significar lo mismo.

¿Cuál es la diferencia entre una duración y un intervalo?

Una duración dice cuánto tiempo, sin posición en el calendario: P3D son tres días, empezando en cualquier momento. Un intervalo ISO 8601 fija una duración a fechas reales, escrito con una barra: 2026-07-04T00:00:00Z/P3D significa los tres días a partir del 4 de julio de 2026, y un par inicio/fin como 2026-07-04/2026-07-07 expresa el mismo tramo. También hay intervalos repetidos con un prefijo R: R5/2026-07-04T00:00:00Z/P1D significa cinco repeticiones diarias desde ese inicio. Los intervalos resuelven la ambigüedad de las unidades de calendario, ya que P1M anclado a una fecha siempre tiene una longitud definida.

Fuentes