Portada de UrsaKit que separa un timestamp Unix en segundos, milisegundos y el límite de 2038

Un timestamp Unix parece lo más simple de un payload: un entero, fácil de ordenar y de comparar. Hasta que un valor de trece dígitos se lee como segundos, una hoja de cálculo exportada llega un día antes o un campo se rompe en silencio en 2038. Esta guía cubre qué cuenta el número, cómo distinguir su unidad y las trampas de época que siguen vivas en sistemas reales.

Puedes seguirla con el conversor de timestamp de UrsaKit. Detecta segundos y milisegundos automáticamente, muestra la unidad detectada en el resultado y se ejecuta entero en el navegador.

01Qué cuenta realmente Unix time

Unix time es el número de segundos sin bisiestos transcurridos desde las 00:00:00 UTC del 1 de enero de 1970, un instante llamado epoch de Unix. Se suele guardar como entero con signo, y el cero es exactamente la medianoche UTC de esa fecha.

De la definición salen tres propiedades, y cada una provoca errores cuando se olvida:

  • Es un instante, no un calendario. El mismo timestamp se muestra con horas locales distintas en cada zona.
  • Es una cuenta de segundos, salvo donde habría bisiestos. El contador los salta para seguir siendo un entero simple.
  • Tiene signo. Los timestamps negativos describen instantes anteriores a 1970.

Trata el timestamp como un instante, no como una fecha.

Todos los problemas de conversión de esta guía vienen de darle significado de calendario demasiado pronto. Convierte a una cadena local solo en el borde del sistema, justo antes de mostrarla a una persona.

02¿Segundos o milisegundos? Cuenta los dígitos

La forma más rápida de identificar la unidad es contar dígitos, porque cada salto es aproximadamente un factor de mil.

DígitosUnidadValor de ejemploRepresenta
10segundos17911081632026-10-04T10:02:43Z
13milisegundos1791108163000el mismo instante
16microsegundos1791108163000000el mismo instante
19nanosegundos1791108163000000000el mismo instante

JavaScript está en el bando de los milisegundos: Date.now() devuelve el número de milisegundos transcurridos desde el epoch. Ese solo hecho explica casi todo el desajuste entre un frontend JavaScript y un backend que guarda segundos.

La heurística de los dígitos no es una ley. Los valores de diez dígitos no empiezan a aparecer hasta septiembre de 2001, y un valor que parece de segundos puede ser un timestamp en milisegundos de 1973. Por eso un conversor debería enseñarte la unidad que detectó en lugar de adivinarla en silencio.

03Cómo convertir un timestamp en el navegador

El conversor de UrsaKit trabaja en las dos direcciones, así que puedes ir del número crudo a una fecha legible y volver.

  1. Pega el valor en el campo Timestamp or date. El marcador muestra las tres formas que acepta: 1700000000, 1700000000000 y 2026-10-04T09:30:00Z.
  2. Pulsa Use now si quieres el instante actual, o Use ISO time para partir de una fecha fija.
  3. Pulsa Convert.
  4. Lee la tabla Result. Lista segundos Unix, milisegundos Unix, ISO 8601 en UTC, fecha y hora local, solo fecha, solo hora, la cadena UTC, el tiempo relativo, el día de la semana y el formato detectado.
  5. Pulsa Copy en la fila que necesites.

Si el valor no se puede parsear, el área de resultado dice que no es un timestamp o una fecha válidos en lugar de mostrar uno equivocado. Ese mensaje es la señal para volver y contar dígitos.

04Ejemplos resueltos

Estas salidas salen de convertir cada valor el 2026-10-04.

EntradaInterpretaciónISO 8601 (UTC)
0segundos1970-01-01T00:00:00Z
1000000000segundos2001-09-09T01:46:40Z
1000000000000milisegundos2001-09-09T01:46:40Z
1791108163segundos2026-10-04T10:02:43Z
2147483647segundos2038-01-19T03:14:07Z

La tercera fila es la útil: el mismo instante escrito con dos precisiones. Cuando ves ese patrón, un desajuste de unidad deja de parecer una fecha corrupta y empieza a parecer un factor de mil evidente.

05El problema del año 2038

Un entero con signo de 32 bits llega hasta 2147483647. Leído como segundos Unix en 32 bits, eso es 2038-01-19T03:14:07Z, y un segundo después el valor salta al extremo negativo del rango: 1901-12-13.

Los sistemas de 64 bits lo superaron hace años, así que el riesgo no está en tu portátil. Está donde sobrevive un tipo de tiempo de 32 bits:

  • firmware y dispositivos embebidos con un time_t de ancho fijo
  • formatos binarios que reservaron cuatro bytes para un timestamp
  • columnas de base de datos declaradas como enteros con signo de 32 bits
  • formatos de serialización especificados antes de que 64 bits fuera lo normal

El arreglo no tiene gracia: ensanchar el tipo o guardar una cadena ISO 8601 en el borde. Los casos peligrosos son aquellos en los que el formato no puede cambiar, y por eso el problema sigue apareciendo en conversaciones.

06Otras épocas que te vas a encontrar

Unix time es la dominante, pero no la única época en circulación, y mezclarlas produce fechas desplazadas por un valor fijo.

SistemaÉpocaUnidadNota
Unix / POSIX1970-01-01segundos o milisegundosEl valor por defecto en casi todas partes
Sistema 1900 de Exceldocumentado como 1900-01-01díasIncluye un 1900-02-29 que nunca existió
Apple Cocoa2001-01-01segundosHabitual en API antiguas de Apple
Discord1970-01-01segundosSe formatea con <t:…>, nunca se guarda como texto

Excel es la que pilla a quien trabaja con datos exportados. Microsoft documenta el sistema de 1900 como un recuento de días desde el 1 de enero de 1900 y da el 5 de julio de 2011 como número de serie 40729. Ese número solo cuadra si la época efectiva es el 30 de diciembre de 1899: el sistema arrastra un 29 de febrero de 1900 fantasma, así que toda fecha desde el 1900-03-01 se desplaza un día. Verificado en local el 2026-10-04 con python3 -c "import datetime; print((datetime.date(2011,7,5)-datetime.date(1899,12,30)).days)", que imprime 40729.

La época de Cocoa de Apple es el 1 de enero de 2001, que equivale al tiempo Unix 978307200. Verificado el mismo día con python3 -c "import datetime; print(int(datetime.datetime(2001,1,1,tzinfo=datetime.timezone.utc).timestamp()))".

Discord toma un timestamp Unix y lo renderiza en la zona de quien lee con un sufijo de marcado: <t:1791108163:R> para tiempo relativo y <t:1791108163:F> para fecha completa. Como el marcado se interpreta en el cliente, el mismo mensaje muestra texto distinto a cada lector, que es el comportamiento correcto para un instante.

07Trampas de huso horario y horario de verano

Un timestamp no tiene huso horario. Las reglas de zona solo entran cuando lo renderizas, y ahí es exactamente donde viven los errores.

Guarda UTC. Convierte en el borde. Cuando tengas que alinear varias zonas para una reunión, el conversor de husos horarios hace la aritmética por ti. Si te descubres guardando una hora local de pared como timestamp Unix, ya has perdido: no hay forma de distinguir una regla de horario de verano añadida después de la intención original.

Merece la pena nombrar dos trampas concretas. Primera, «medianoche» no es un marcador seguro del inicio de un día, porque una zona puede saltar de las 23:59 a la 01:00 cuando los relojes se adelantan. Segunda, las fechas HTTP y las tareas cron son conceptos de hora local, así que un trabajo programado a las 02:30 puede saltarse una vez al año en algunas zonas. Conviértelo a una zona explícita antes de probarlo.

08Errores frecuentes

SíntomaCausaArreglo
El año sale 1970 o 55000Segundos leídos como milisegundos, o al revésCuenta dígitos y confirma la unidad detectada
La fecha se va un díaEl número de serie de Excel tratado como timestamp UnixConvierte con la época efectiva 1899-12-30
Las fechas se mueven una hora dos veces al añoHora local guardada como instanteGuarda UTC y convierte al mostrar
El valor es exactamente 2147483647Estás viendo el techo de 32 bitsPlanifica la migración antes del 2038-01-19
El tiempo relativo dice «hace 4 años»La entrada estaba en milisegundos y se leyó como segundosMultiplica o divide por 1000 según toque

Si lo que necesitas de verdad es la distancia entre dos fechas y no una representación, la calculadora de diferencia entre fechas cuenta días, semanas y días laborables.

09Fuentes

Preguntas frecuentes

¿Qué es un timestamp Unix?

Es el número de segundos sin bisiestos transcurridos desde las 00:00:00 UTC del 1 de enero de 1970. Es un contador, no un formato de fecha, así que no lleva huso horario propio.

¿Cómo sé si un timestamp está en segundos o en milisegundos?

Cuenta los dígitos. Diez dígitos casi siempre son segundos y trece casi siempre milisegundos. Dieciséis son microsegundos y diecinueve nanosegundos.

¿Qué es el problema del año 2038?

Un entero con signo de 32 bits se queda sin espacio en 2147483647, que es 2038-01-19T03:14:07Z. Los sistemas que aún guardan el tiempo en 32 bits vuelven a 1901 un segundo después.

¿Por qué mi fecha de Excel se va un día?

El sistema de fechas de 1900 de Excel incluye un 1900-02-29 que nunca existió. Para cualquier fecha desde el 1900-03-01, el número de serie se comporta como si el origen fuera el 1899-12-30.

¿Cambia el timestamp si cambio de huso horario?

No. El timestamp es el mismo instante en todas partes. Solo cambia su representación legible, porque ahí es donde se aplican el huso horario y el horario de verano.

¿Puede un timestamp Unix ser negativo?

Sí. Los valores negativos representan instantes anteriores al 1970-01-01 UTC. Muchas API y bases de datos los aceptan, pero algunos esquemas y bibliotecas antiguas no.

¿Por qué mi timestamp no incluye segundos bisiestos?

Unix time ignora los segundos bisiestos a propósito. Solo cuenta segundos sin bisiestos, así que se mantiene como un entero simple a cambio de no coincidir del todo con el tiempo atómico alrededor de un bisiesto.

Volver a los artículos

Artículos relacionados

Herramientas relacionadas