Convertidor Fecha/Hora

Convertir entre formatos de fecha y hora

Entendiendo Formatos de fecha y hora
TL;DR

La conversion de fecha/hora transforma marcas de tiempo entre formatos. Las zonas horarias son la fuente #1 de bugs: no existe la 'hora local' en un sistema global.

Que son los formatos de fecha?

Un formato de fecha define como un valor de fecha y/u hora se representa como texto. El mismo instante en el tiempo, digamos, el quince de marzo de 2024 a las dos y media de la tarde en Londres, puede escribirse de docenas de formas dependiendo del formato, la configuracion regional y la zona horaria:

  • 2024-03-15T14:30:00Z (ISO 8601)
  • 1710513000 (marca de tiempo Unix)
  • Fri, 15 Mar 2024 14:30:00 +0000 (RFC 2822)
  • 03/15/2024 2:30 PM (formato de EE. UU.)
  • 15/03/2024 14:30 (formato europeo)
  • 2024年3月15日 14時30分 (japones)

La conversion de formatos de fecha transforma marcas de tiempo entre estas representaciones. Esto es critico para el intercambio de datos entre sistemas, APIs, bases de datos e interfaces de usuario que esperan diferentes formatos.

ISO 8601: el estandar universal

ISO 8601 es el estandar internacional para la representacion de fecha y hora. Usa un formato estricto e inequivoco que elimina la confusion entre el ordenamiento de fechas estadounidense y europeo:

YYYY-MM-DDThh:mm:ss±hh:mm
2024-03-15T14:30:00+01:00

Propiedades clave de ISO 8601:

  • Ano primero: Elimina la ambiguedad DD/MM vs MM/DD
  • Separador T: Divide claramente la fecha del tiempo
  • Desplazamiento de zona horaria: Indica explicitamente el desplazamiento respecto a UTC
  • Sufijo Z: Abreviatura para UTC (desplazamiento cero)
  • Ordenamiento lexicografico: Las cadenas ISO 8601 se ordenan correctamente como texto plano

ISO 8601 es el formato predeterminado para APIs JSON, el Date.toISOString() de JavaScript, PostgreSQL y la mayoria de los estandares modernos de intercambio de datos.

Marcas de tiempo Unix

Una marca de tiempo Unix (tambien llamada tiempo de epoca o tiempo POSIX) representa un instante como el numero de segundos transcurridos desde el 1 de enero de 1970 00:00:00 UTC, la epoca Unix.

1710513000 = 2024-03-15T14:30:00Z

Las marcas de tiempo Unix son compactas, inequivocas, neutrales en cuanto a zona horaria (siempre UTC) y trivialmente comparables (solo comparacion de enteros). Son la representacion interna estandar del tiempo en la mayoria de los lenguajes de programacion y bases de datos.

VarianteUnidadRangoDesbordamiento
Unix (32 bits)Segundos1970 - 203819 ene, 2038
Unix (64 bits)Segundos1970 - 292 mil millones de anosNunca (practicamente)
Milisegundosms1970 - futuro lejanoEstandar de JavaScript
Microsegundosus1970 - futuro lejanoPostgreSQL, Python

JavaScript usa milisegundos desde la epoca (Date.now() devuelve milisegundos). Muchas APIs y bases de datos usan segundos. Siempre verifique que unidad espera su sistema.

Referencia de formatos

FormatoEjemploUsado por
ISO 86012024-03-15T14:30:00ZAPIs, JSON, bases de datos
Unix (segundos)1710513000Internos del sistema, logging
Unix (milisegundos)1710513000000JavaScript, Java
RFC 2822Fri, 15 Mar 2024 14:30:00 +0000Encabezados de email, HTTP
Legible por humanosMarch 15, 2024 2:30 PM ESTVisualizacion en UI, reportes
SQL2024-03-15 14:30:00Bases de datos (sin T, sin Z)

Zonas horarias y UTC

Las zonas horarias son la mayor fuente de bugs relacionados con fecha/hora. Hay mas de 400 identificadores de zona horaria en la base de datos de zonas horarias IANA, y cambian regularmente: los paises adoptan, modifican o eliminan el horario de verano, cambian su desplazamiento UTC o se dividen en nuevas zonas.

World Timezone Offsets A horizontal bar centered on UTC showing timezone offsets from UTC-12 to UTC+14, with major cities placed at their respective offsets. UTC Timezone Offsets UTC -12 -8 Los Angeles -5 New York 0 London +1 Paris +5:30 Mumbai +8 Shanghai +9 Tokyo +14 Baker Island (UTC-12) Line Islands (UTC+14) 26-hour span Note: Offsets change during Daylight Saving Time transitions. India (UTC+5:30) and Nepal (UTC+5:45) use non-integer offsets. Always use IANA timezone names (America/New_York), not abbreviations (EST).

Errores comunes:

  • Transiciones de horario de verano: Los relojes “adelantan” (perdiendo una hora) y “atrasan” (ganando una hora). Una marca de tiempo como “2024-03-10 02:30 America/New_York” no existe: los relojes saltaron de las 2:00 a las 3:00.
  • Las abreviaturas de zona horaria son ambiguas: “CST” es Central Standard Time (UTC-6), China Standard Time (UTC+8) y Cuba Standard Time (UTC-5). Siempre use identificadores de zona horaria IANA (America/Chicago, Asia/Shanghai).
  • Desplazamientos no enteros: India es UTC+5:30, Nepal es UTC+5:45 y las Islas Chatham (Nueva Zelanda) son UTC+12:45.

Errores comunes

  1. Almacenar hora local sin zona horaria. Un simple 2024-03-15 14:30:00 no tiene sentido sin saber a que zona horaria se refiere. Siempre almacene UTC o incluya el desplazamiento.

  2. Asumir 24 horas en un dia. Las transiciones de horario de verano crean dias de 23 y 25 horas. La aritmetica de tiempo que suma 86400 segundos para avanzar un dia sera incorrecta dos veces al ano.

  3. Usar abreviaturas de zona horaria. “PST” y “PDT” son desplazamientos diferentes. Use America/Los_Angeles y deje que la biblioteca determine el desplazamiento correcto para cualquier fecha dada.

  4. Ignorar los segundos intercalares. UTC ocasionalmente agrega un segundo intercalar (23:59:60). La mayoria de los sistemas ignoran los segundos intercalares, pero GPS time, NTP y algunos sistemas financieros los tienen en cuenta.

Casos de uso comunes

  • Integracion de APIs: Convertir marcas de tiempo entre el formato que devuelve su API (ISO 8601, Unix) y el formato que espera su base de datos o frontend
  • Correlacion de logs: Convertir marcas de tiempo de diferentes servicios (cada uno posiblemente en diferentes formatos y zonas horarias) a un formato comun para analisis unificado de logs
  • Programacion entre zonas horarias: Convertir horarios de reuniones, ventanas de despliegue o programaciones de mantenimiento entre las horas locales de los miembros del equipo
  • Migracion de datos: Transformar columnas de fecha al mover datos entre bases de datos con diferentes formatos de marca de tiempo (epoca Unix en Redis vs ISO 8601 en PostgreSQL)
  • Depuracion de bugs de tiempo: Convertir marcas de tiempo Unix de logs de errores a fechas legibles por humanos para entender cuando ocurrieron los eventos

Prueba estos ejemplos

Marca de tiempo ISO 8601 Válido

Una marca de tiempo ISO 8601 inequivoca en UTC (indicada por el sufijo 'Z'). 15 de marzo de 2024 a las 2:30 PM UTC. Este es el estandar de oro para el intercambio de datos, sin ambiguedad sobre el orden de la fecha o la zona horaria.

2024-03-15T14:30:00Z
Formato de fecha ambiguo Válido

Es esto 4 de marzo o 3 de abril? En formato de EE. UU. (MM/DD/AAAA), es 4 de marzo. En formato europeo (DD/MM/AAAA), es 3 de abril. Esta ambiguedad es la razon por la que existe ISO 8601 (AAAA-MM-DD).

03/04/2024