Guide

Guía del Formato ISO 8601: Estándar de Fecha, Hora y Zona Horaria

¿Qué es ISO 8601?

ISO 8601 es un estándar internacional para representar fechas y horas en un formato claro e inequívoco. Publicado por la Organización Internacional de Normalización (ISO), este estándar elimina la confusión causada por diferentes formatos de fecha en todo el mundo (como MM/DD/AAAA vs DD/MM/AAAA) y proporciona una forma consistente de intercambiar información de fecha y hora.

El formato ISO 8601 es ampliamente utilizado en APIs, bases de datos y aplicaciones web porque es:

  • Inequívoco: Sin confusión sobre el orden día/mes
  • Ordenable: La ordenación lexicográfica funciona correctamente
  • Legible por máquinas: Fácil de analizar por computadoras
  • Legible por humanos: Aún comprensible por personas
  • Universal: Funciona en todas las zonas horarias y configuraciones regionales

¿Por qué usar el formato ISO 8601?

Cuando ves una fecha como 03/04/2024, ¿significa 4 de marzo o 3 de abril? Diferentes países interpretan esto de manera diferente. ISO 8601 resuelve este problema usando el formato 2024-04-03, que siempre es inequívoco: año-mes-día.

// Formatos ambiguos (evita estos)
"03/04/2024"  // ¿Es esto marzo 4 o abril 3?
"4-3-24"      // ¿Es esto 2024 o 1924?

// Formato ISO 8601 (recomendado)
"2024-04-03"  // Siempre 3 de abril de 2024
"2024-04-03T14:30:00Z"  // 3 de abril de 2024, 2:30 PM UTC

Formatos de Fecha ISO 8601

Formato de Fecha Básico

El formato de fecha ISO 8601 estándar sigue el patrón: AAAA-MM-DD

Ejemplos:

  • 2024-01-15 - 15 de enero de 2024
  • 2024-12-31 - 31 de diciembre de 2024
  • 2025-06-07 - 7 de junio de 2025
# Ejemplo en Python
from datetime import date

hoy = date(2024, 4, 15)
fecha_iso = hoy.isoformat()  # "2024-04-15"
print(f"Fecha ISO 8601: {fecha_iso}")

Formato Extendido vs Básico

ISO 8601 soporta dos formatos:

  1. Formato extendido (con separadores): 2024-04-15
  2. Formato básico (compacto): 20240415

La mayoría de las aplicaciones usan el formato extendido porque es más legible.

// Ejemplo en JavaScript
const fecha = new Date('2024-04-15');

// Formato extendido (recomendado)
const extendido = fecha.toISOString().split('T')[0];  // "2024-04-15"

// Formato básico (compacto)
const basico = extendido.replace(/-/g, '');  // "20240415"

Formatos de Hora ISO 8601

Formato de Hora Básico

El formato de hora ISO 8601 estándar sigue: HH:MM:SS o HH:MM:SS.sss

Ejemplos:

  • 14:30:00 - 2:30:00 PM
  • 09:05:30 - 9:05:30 AM
  • 23:59:59.999 - 11:59:59.999 PM con milisegundos

Segundos Fraccionarios

ISO 8601 soporta segundos fraccionarios con precisión variable:

  • 14:30:00.5 - Medio segundo
  • 14:30:00.123 - Milisegundos (3 dígitos)
  • 14:30:00.123456 - Microsegundos (6 dígitos)
  • 14:30:00.123456789 - Nanosegundos (9 dígitos)

Formatos DateTime ISO 8601

Fecha y Hora Combinadas

Para representar tanto fecha como hora, ISO 8601 usa un separador T: AAAA-MM-DDTHH:MM:SS

Ejemplos:

  • 2024-04-15T14:30:00 - 15 de abril de 2024 a las 2:30 PM (hora local)
  • 2024-12-31T23:59:59 - 31 de diciembre de 2024 a las 11:59:59 PM

El Separador "T"

El carácter T separa la fecha de la hora. Es requerido en el formato estándar, aunque algunos sistemas aceptan un espacio en su lugar para legibilidad.


Designadores de Zona Horaria ISO 8601

Una de las características más poderosas de ISO 8601 es su soporte para información de zona horaria.

Hora UTC (Designador Z)

El sufijo Z indica UTC (Tiempo Universal Coordinado), también llamado "hora Zulu":

  • 2024-04-15T14:30:00Z - 2:30 PM UTC

Z es una abreviatura de +00:00.

// Ejemplo en JavaScript
const fechaUtc = new Date('2024-04-15T14:30:00Z');
console.log(fechaUtc.toISOString());  // "2024-04-15T14:30:00.000Z"

// Siempre prefiere ISO 8601 con Z para tiempos UTC
const timestamp = Date.now();
const cadenaIso = new Date(timestamp).toISOString();
console.log(cadenaIso);  // "2024-04-15T14:30:00.123Z"

Desplazamientos de Zona Horaria

Para tiempos no UTC, especifica el desplazamiento desde UTC: ±HH:MM

Ejemplos:

  • 2024-04-15T14:30:00+05:30 - 2:30 PM en India (UTC+5:30)
  • 2024-04-15T14:30:00-04:00 - 2:30 PM en Hora de Verano del Este (UTC-4)
  • 2024-04-15T14:30:00+00:00 - Igual que Z (UTC)
# Ejemplo en Python con zona horaria
from datetime import datetime, timezone, timedelta

# Hora UTC
hora_utc = datetime(2024, 4, 15, 14, 30, 0, tzinfo=timezone.utc)
print(hora_utc.isoformat())  # "2024-04-15T14:30:00+00:00"

# Zona horaria personalizada (UTC+5:30)
ist = timezone(timedelta(hours=5, minutes=30))
hora_ist = datetime(2024, 4, 15, 14, 30, 0, tzinfo=ist)
print(hora_ist.isoformat())  # "2024-04-15T14:30:00+05:30"

Formato de Duración ISO 8601

ISO 8601 define una notación específica para duraciones usando el prefijo P (por "período").

Formato de Duración: P[n]Y[n]M[n]DT[n]H[n]M[n]S

  • P: Designador de duración (requerido)
  • Y: Años
  • M: Meses (antes de T)
  • D: Días
  • T: Designador de tiempo (separa componentes de fecha y tiempo)
  • H: Horas
  • M: Minutos (después de T)
  • S: Segundos

Ejemplos de Duración

P3Y6M4DT12H30M5S  = 3 años, 6 meses, 4 días, 12 horas, 30 minutos, 5 segundos
P1Y               = 1 año
P6M               = 6 meses
P7D               = 7 días
PT2H30M           = 2 horas, 30 minutos
PT45S             = 45 segundos
P1DT12H           = 1 día, 12 horas

ISO 8601 vs RFC 3339

RFC 3339 es un perfil de ISO 8601 comúnmente usado en internet. Las principales diferencias:

CaracterísticaISO 8601RFC 3339
FormatoAAAA-MM-DDTHH:MM:SS±HH:MMIgual
UTCZ o +00:00Ambos permitidos
Segundos fraccionariosOpcional, cualquier precisiónOpcional, cualquier precisión
SeparadoresPueden omitirse (formato básico)Requeridos (formato extendido)

La mayoría de las APIs modernas usan RFC 3339, que es un subconjunto estricto de ISO 8601.


Mejores Prácticas ISO 8601 para Desarrolladores

1. Siempre Usa UTC para Almacenamiento

// ✅ Bueno - Almacenar en UTC
const timestamp = new Date().toISOString();  // "2024-04-15T14:30:00.123Z"

// ❌ Malo - Almacenar hora local
const horaLocal = new Date().toString();  // "Mon Apr 15 2024 14:30:00 GMT+0500"

2. Incluye Información de Zona Horaria

# ✅ Bueno - Incluye zona horaria
"2024-04-15T14:30:00+05:30"

# ❌ Malo - Falta zona horaria
"2024-04-15T14:30:00"

3. Usa Formato Extendido

// ✅ Bueno - Formato extendido
"2024-04-15T14:30:00Z"

// ❌ Malo - Formato básico (difícil de leer)
"20240415T143000Z"

4. Valida Cadenas ISO 8601

// Validación en JavaScript
function esISO8601Valido(cadenaFecha) {
    const regexIso8601 = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})$/;
    if (!regexIso8601.test(cadenaFecha)) return false;

    const fecha = new Date(cadenaFecha);
    return !isNaN(fecha.getTime());
}

console.log(esISO8601Valido("2024-04-15T14:30:00Z"));  // true
console.log(esISO8601Valido("2024-04-15 14:30:00"));   // false

Errores Comunes de ISO 8601 a Evitar

1. Falta el Separador T

// ❌ Incorrecto
"2024-04-15 14:30:00Z"

// ✅ Correcto
"2024-04-15T14:30:00Z"

2. Formato de Zona Horaria Incorrecto

# ❌ Incorrecto - Falta dos puntos en el desplazamiento
"2024-04-15T14:30:00+0530"

# ✅ Correcto - Dos puntos en el desplazamiento
"2024-04-15T14:30:00+05:30"

3. Mezclar Formatos de Fecha

// ❌ Incorrecto - Formato estadounidense
"04/15/2024T14:30:00Z"

// ✅ Correcto - ISO 8601
"2024-04-15T14:30:00Z"

4. Omitir Ceros Iniciales

# ❌ Incorrecto
"2024-4-5T9:5:0Z"

# ✅ Correcto
"2024-04-05T09:05:00Z"

ISO 8601 en Diferentes Lenguajes de Programación

JavaScript / TypeScript

// Hora actual en ISO 8601
const ahora = new Date().toISOString();
console.log(ahora);  // "2024-04-15T14:30:00.123Z"

// Analizar cadena ISO 8601
const fecha = new Date("2024-04-15T14:30:00Z");

Python

from datetime import datetime, timezone

# Hora actual en ISO 8601
ahora = datetime.now(timezone.utc).isoformat()
print(ahora)  # "2024-04-15T14:30:00.123456+00:00"

# Analizar cadena ISO 8601
dt = datetime.fromisoformat("2024-04-15T14:30:00+00:00")

Java

import java.time.Instant;
import java.time.ZonedDateTime;

// Hora actual en ISO 8601
String ahora = Instant.now().toString();
System.out.println(ahora);  // "2024-04-15T14:30:00.123Z"

// Analizar cadena ISO 8601
ZonedDateTime dt = ZonedDateTime.parse("2024-04-15T14:30:00Z");

Go

package main

import (
    "fmt"
    "time"
)

func main() {
    // Hora actual en ISO 8601
    ahora := time.Now().UTC().Format(time.RFC3339)
    fmt.Println(ahora)  // "2024-04-15T14:30:00Z"

    // Analizar cadena ISO 8601
    dt, _ := time.Parse(time.RFC3339, "2024-04-15T14:30:00Z")
    fmt.Println(dt)
}

Preguntas Frecuentes

¿Qué significa la "T" en ISO 8601?

La T es un separador entre los componentes de fecha y hora. Significa "Time" (Tiempo) y es requerida por el estándar ISO 8601 para evitar ambigüedad.

¿Es ISO 8601 lo mismo que RFC 3339?

RFC 3339 es un perfil (subconjunto) de ISO 8601 diseñado para uso en internet. RFC 3339 es más estricto y siempre requiere el formato extendido con separadores.

¿Por qué ISO 8601 usa el orden AAAA-MM-DD?

Este orden (de unidad mayor a menor) permite ordenación natural. Cuando ordenas fechas ISO 8601 alfabéticamente, automáticamente se ordenan cronológicamente.

¿Qué zona horaria debo usar para almacenar timestamps?

Siempre almacena timestamps en UTC (con el designador Z) en bases de datos y APIs. Convierte a hora local solo cuando muestres al usuario.


Conclusión

ISO 8601 es el estándar de oro para representar fechas y horas en sistemas de software. Siguiendo el formato ISO 8601, aseguras que tus timestamps sean inequívocos, ordenables y compatibles con sistemas en todo el mundo.

Puntos clave:

  • Usa AAAA-MM-DDTHH:MM:SSZ para tiempos UTC
  • Incluye información de zona horaria (Z o ±HH:MM)
  • Almacena timestamps en UTC, muestra en hora local
  • Valida cadenas ISO 8601 antes de analizarlas
  • Usa formato extendido (con separadores) para legibilidad

¡Dominar el formato ISO 8601 es esencial para cualquier desarrollador que trabaje con fechas y horas!

¡Prueba nuestro Convertidor ISO 8601 para convertir entre formatos!