Trabajar con timestamps Unix en JavaScript
Todo lo que necesitas para trabajar con timestamps Unix en JavaScript — obtener la hora actual, crear Dates a partir de timestamps, formatear para cualquier zona horaria y evitar errores comunes.
Obtener el timestamp Unix actual
JavaScript ofrece varias formas equivalentes de obtener la hora actual como timestamp numérico. Todas devuelven el número de milisegundos desde el epoch Unix.
- Date.now() → the fastest and most readable — 1700000000000 (milliseconds)
- Math.floor(Date.now() / 1000) → Unix timestamp in seconds — 1700000000
- +new Date() → same as Date.now(), using the unary plus operator
- new Date().getTime() → explicit method call, same result as Date.now()
Crear un objeto Date a partir de un timestamp Unix
El constructor Date acepta milisegundos desde el epoch. Multiplica siempre por 1000 un timestamp en segundos antes de pasarlo al constructor.
- new Date(1700000000 * 1000) → from seconds (most common case)
- new Date(1700000000000) → from milliseconds (JavaScript APIs, Java)
- new Date(Date.now()) → current time as a Date object
- new Date(0) → the Unix epoch: January 1, 1970 00:00:00 UTC
Formatear fechas — métodos de cadena integrados
El objeto Date tiene varios métodos de conversión a cadena integrados. Cada uno produce un formato distinto.
- .toISOString() → '2023-11-15T06:13:20.000Z' — ISO 8601, always UTC, machine-readable
- .toUTCString() → 'Wed, 15 Nov 2023 06:13:20 GMT' — RFC 7231, human-readable UTC
- .toString() → local timezone string with full zone name
- .toLocaleString() → locale-aware format in the user's local timezone
Formato con zona horaria mediante Intl.DateTimeFormat
Para un formato de fecha consistente y con zona horaria sin librerías externas, usa la API Intl.DateTimeFormat. Está disponible en todos los navegadores modernos y en Node.js 13+.
- new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', dateStyle: 'full', timeStyle: 'long' }).format(date)
- date.toLocaleString('en-GB', { timeZone: 'Europe/London', hour12: false })
- new Intl.DateTimeFormat('zh-CN', { timeZone: 'Asia/Shanghai' }).format(date)
- new Intl.DateTimeFormat('en-CA', { timeZone: tz }).formatToParts(date) → array of {type, value} parts for custom layouts
Convertir una cadena de fecha de vuelta a timestamp Unix
Para ir en sentido inverso —de una cadena de fecha a un timestamp Unix— usa Date.parse() o pasa la cadena al constructor Date.
- new Date('2023-11-15T06:13:20Z').getTime() / 1000 → Unix seconds from ISO 8601 UTC
- new Date('2023-11-15T01:13:20-05:00').getTime() → Unix milliseconds from ISO with offset
- Date.parse('2023-11-15T06:13:20Z') → same as new Date(...).getTime()
- Always use ISO 8601 format with explicit timezone for predictable parsing
Errores frecuentes
Estos son los errores más frecuentes que cometen los desarrolladores de JavaScript con fechas y timestamps:
- new Date(1700000000) — al faltar × 1000 se convierte en el año ~1970 en vez de 2023
- getMonth() devuelve 0–11, no 1–12 — suma siempre 1 al mostrarlo
- new Date('2024-01-01') es medianoche UTC; new Date('2024/01/01') es medianoche local
- new Date(2024, 0, 1) = 1 de enero (el mes también empieza en 0 en el constructor)
- Sumar 86400000 ms para obtener «mañana» puede fallar en los cambios de horario de verano — usa setDate(d.getDate() + 1) en su lugar
Preguntas frecuentes sobre timestamps Unix en JavaScript
- ¿Cómo obtengo un timestamp Unix en segundos en JavaScript?
- Usa Math.floor(Date.now() / 1000). Date.now() devuelve milisegundos, así que divide entre 1000 y redondea hacia abajo para obtener segundos Unix enteros.
- ¿Por qué new Date() con un timestamp Unix muestra 1970?
- El constructor Date espera milisegundos. Un timestamp en segundos de 10 dígitos debe multiplicarse por 1000: new Date(seconds * 1000).
- ¿Cómo formateo una fecha de JavaScript para una zona horaria concreta?
- Usa Intl.DateTimeFormat con una opción timeZone explícita, como new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York' }). Aplica el horario de verano automáticamente y no necesita librerías externas.