← Todos los artículos

Convertir fecha a Epoch en JavaScript, Python, SQL y Go

Tutorial orientado a desarrolladores para convertir una fecha y zona horaria a Unix epoch en JavaScript, Python, SQL, Go y shell. Cubre parseo timezone-aware vs naive, el gap de DST y la elección entre segundos y milisegundos.

Cuándo necesitas convertir fecha a Epoch en código

La mayoría de las apps almacenan timestamps como enteros Unix, pero reciben fechas como cadenas — un valor de calendario en un formulario, una columna de fecha en un CSV, un campo de webhook formateado en una zona horaria concreta. Convertir esas cadenas a epoch en el código es lo que permite a las bases de datos ordenarlas, a los servicios compararlas y a las APIs aceptarlas. Esta guía muestra cómo hacerlo de forma idiomática en JavaScript, Python, SQL, Go y shell, y los bugs de zona horaria que todo equipo termina encontrando.

JavaScript: Date, getTime y entradas con zona horaria

JavaScript guarda el tiempo en milisegundos. Date.UTC devuelve el epoch en ms para una hora de pared en UTC. Para una cadena ISO 8601 con offset explícito usa new Date(iso).getTime(). Divide entre 1000 para obtener segundos.

  • Date.UTC(2026, 0, 1, 0, 0, 0) → 1767225600000 (month is zero-indexed)
  • new Date('2026-01-01T08:00:00-05:00').getTime() → 1767265200000
  • Math.floor(Date.now() / 1000) → current Unix seconds
  • Wall-clock in a non-UTC zone needs a zone-aware library (Luxon, date-fns-tz, Temporal)

Python: datetime.timestamp y calendar.timegm

El objeto datetime de Python se convierte a epoch con .timestamp(), pero solo cuando es timezone-aware. Un datetime naive se interpreta como hora local del host, que es la causa más habitual de valores epoch incorrectos en producción.

  • datetime(2026, 1, 1, tzinfo=timezone.utc).timestamp() → 1767225600.0
  • calendar.timegm(struct_time) → seconds (UTC-only)
  • datetime.now(ZoneInfo('America/New_York')).timestamp() → zone-aware now
  • Avoid datetime.fromisoformat(s).timestamp() when s has no offset

SQL: EXTRACT EPOCH, UNIX_TIMESTAMP, UNIX_SECONDS

Cada base de datos importante expone una función para materializar un entero epoch a partir de una columna timestamp. Trata la zona horaria de la columna de forma explícita: TIMESTAMP WITH TIME ZONE y TIMESTAMP WITHOUT TIME ZONE se comportan muy distinto al pasarlas a estas funciones.

  • PostgreSQL: EXTRACT(EPOCH FROM ts) → seconds (double)
  • MySQL: UNIX_TIMESTAMP(ts) → seconds, naive ts read in session timezone
  • BigQuery: UNIX_SECONDS(ts) / UNIX_MILLIS(ts) — TIMESTAMP only
  • SQLite: strftime('%s', ts) → seconds as string, cast to integer

Go y shell: time.Unix y date +%s

En Go, parsea con un layout que incluya el offset y llama a .Unix() para segundos o .UnixMilli() para milisegundos. En shell, GNU date -d entiende cadenas de fecha comunes; BSD/macOS date -j -f exige un formato explícito.

  • Go: t, _ := time.Parse(time.RFC3339, "2026-01-01T00:00:00Z"); t.Unix()
  • Go: time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC).Unix()
  • GNU date: date -d "2026-01-01 00:00:00 UTC" +%s
  • macOS date: date -j -u -f "%Y-%m-%d %H:%M:%S" "2026-01-01 00:00:00" +%s

FAQ

How do I convert time to epoch time?
Choose the date, clock time, and timezone, then convert that instant to Unix seconds or milliseconds. If the timezone is missing, the result may be off by hours.
Is timestamp to epoch the same as date to epoch?
Usually yes. It means converting a readable timestamp or date-time string into an epoch number.
Should I send epoch seconds or milliseconds to an API?
Follow the API documentation. If it says Unix timestamp, it often means seconds, but JavaScript-oriented APIs may expect milliseconds.
Why does the same date give a different epoch in different timezones?
Because a local wall-clock time only identifies an instant once a timezone is attached. 2026-01-01 00:00 is 1767225600 in UTC but 1767243600 in New York — five hours later in real time. Set the timezone before converting.