🕐
← Volver a guías

Conversión de zonas horarias de marcas de tiempo Unix: una guía práctica

· Etiquetas: timezone, dst, utc, time-conversion, unix-timestamp, daylight-saving, epoch

Por qué importa la zona horaria para las marcas de tiempo Unix

Las propias marcas de tiempo Unix son independientes de la zona horaria — el número 1785292800 significa el mismo instante en todas partes. La complejidad surge al convertir ese instante a una hora local legible para mostrarla, registrarla o analizarla.

El principio fundamental: almacena siempre en UTC, convierte solo para mostrar. Esta regla elimina categorías enteras de errores y hace que tus datos sean portables entre zonas horarias.

UTC vs. hora local: entender la diferencia

UTC (Tiempo Universal Coordinado)

UTC es el estándar de tiempo primario. Nunca cambia por el horario de verano y es el mismo en todas partes de la Tierra. Las marcas de tiempo Unix se definen en UTC.

Hora local

La hora local es UTC ajustado para una región geográfica específica. Puede diferir de UTC por un desplazamiento fijo (por ejemplo, UTC+8 para la Hora Estándar de China) o un desplazamiento variable (por ejemplo, la Hora del Este cambia entre UTC-5 y UTC-4 para el horario de verano).

El problema del desplazamiento

La misma marca de tiempo Unix produce horas locales diferentes según la ubicación del observador:

| Marca de tiempo | UTC | Nueva York (EST) | Tokio (JST) | Londres (BST) | |-----------|-----|----------------|-------------|--------------| | 1785292800 | 2026-07-19 00:00 | 2026-07-18 20:00 | 2026-07-19 09:00 | 2026-07-19 01:00 | | 1785379200 | 2026-07-19 23:59 | 2026-07-19 19:59 | 2026-07-20 08:59 | 2026-07-20 00:59 |

Horario de verano (DST)

¿Qué es el DST?

El Horario de Verano (DST, por sus siglas en inglés) es la práctica de adelantar los relojes durante los meses de verano para que la luz del atardecer dure más. Los relojes se "adelantan" (pierden una hora) en primavera y se "atrasan" (ganan una hora) en otoño.

El impacto en la conversión de marcas de tiempo

El DST crea un desplazamiento variable entre la hora local y UTC. Esto significa que:

  1. La misma hora local puede corresponder a dos marcas de tiempo diferentes (durante la transición de "atrasar", la hora de la 1:00 a. m. ocurre dos veces)
  2. Algunas horas locales no existen (durante la transición de "adelantar", por ejemplo, las 2:00 a. m. nunca ocurren — los relojes saltan directamente a las 3:00 a. m.)

Ejemplo: la hora ambigua

En la zona horaria del Este de los Estados Unidos, el primer domingo de noviembre a las 2:00 a. m., los relojes se atrasan a la 1:00 a. m. Esto significa que:

from datetime import datetime, timezone
import pytz

eastern = pytz.timezone("America/New_York")

# First occurrence of 1:00 AM (EDT, UTC-4)
first = eastern.localize(datetime(2026, 11, 1, 1, 0), is_dst=True)
print(first.timestamp())
# Some timestamp value

# Second occurrence of 1:00 AM (EST, UTC-5) = 3600 seconds later!
second = eastern.localize(datetime(2026, 11, 1, 1, 0), is_dst=False)
print(second.timestamp())
# first.timestamp() + 3600

Maneja siempre con cuidado la hora ambigua del retroceso de otoño en tus aplicaciones. Usar los indicadores is_dst/ambiguous en Python u opciones equivalentes en otros lenguajes previene errores sutiles.

Convertir entre zonas horarias

Usar nuestra herramienta en línea

El enfoque más simple para conversiones puntuales es nuestro Convertidor de marcas de tiempo Unix, que muestra resultados en múltiples zonas horarias simultáneamente.

Usar la línea de comandos de Linux

# Display timestamp in multiple timezones
TZ="America/New_York" date -d @1785292800
TZ="Europe/London"    date -d @1785292800
TZ="Asia/Tokyo"       date -d @1785292800

# With custom ISO format
TZ="UTC" date -d @1785292800 +"%Y-%m-%d %H:%M:%S %Z"
# Output: 2026-07-19 00:00:00 UTC

TZ="Asia/Shanghai" date -d @1785292800 +"%Y-%m-%d %H:%M:%S %Z"
# Output: 2026-07-19 08:00:00 CST

Usar Python

from datetime import datetime
from zoneinfo import ZoneInfo  # Python 3.9+

ts = 1785292800

# Convert to multiple timezones
timezones = ["America/New_York", "Europe/London", "Asia/Tokyo", "Australia/Sydney"]

for tz_name in timezones:
    tz = ZoneInfo(tz_name)
    dt = datetime.fromtimestamp(ts, tz=tz)
    print(f"{tz_name}: {dt.strftime('%Y-%m-%d %H:%M:%S %Z')}")

Usar JavaScript

const ts = 1785292800;
const date = new Date(ts * 1000);

const timezones = [
    "America/New_York",
    "Europe/London",
    "Asia/Tokyo",
    "Australia/Sydney"
];

for (const tz of timezones) {
    const str = date.toLocaleString("en-US", {
        timeZone: tz,
        timeZoneName: "short",
    });
    console.log(`${tz}: ${str}`);
}

Usar Go

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.Unix(1785292800, 0)
    
    timezones := []string{
        "America/New_York",
        "Europe/London",
        "Asia/Tokyo",
        "Australia/Sydney",
    }
    
    for _, tz := range timezones {
        loc, _ := time.LoadLocation(tz)
        fmt.Printf("%s: %s\n", tz, t.In(loc).Format("2006-01-02 15:04:05"))
    }
}

Patrones comunes de conversión de zonas horarias

Convertir registros de servidor a hora local

Los registros de servidor comúnmente registran marcas de tiempo en UTC. Al analizarlos, conviértelos a tu zona horaria local:

# Read a log file and display timestamps in Pacific time
while IFS= read -r line; do
    if [[ $line =~ ^([0-9]+) ]]; then
        ts="${BASH_REMATCH[1]}"
        TZ="America/Los_Angeles" date -d @"$ts" "+%Y-%m-%d %H:%M:%S"
        echo " $line"
    fi
done < server.log

Programar eventos entre zonas horarias

Al compartir horas de eventos entre zonas horarias, comunica siempre en UTC o comparte la marca de tiempo Unix directamente. Esto elimina la ambigüedad:

  • "Reunión a las 1785292800" no es ambiguo
  • "Reunión a las 9:00 a. m. EST" se vuelve ambiguo durante las transiciones de DST
  • "Reunión a las 9:00 a. m. America/New_York" es mejor pero aún requiere conocer el estado del DST

Almacenar marcas de tiempo en bases de datos

-- Always store the timestamp itself (timezone-independent)
INSERT INTO events (occurred_at, user_id) VALUES (1785292800, 42);

-- OR store with an explicit UTC timestamp column
INSERT INTO events (occurred_at_utc, user_id) 
VALUES ('2026-07-19 00:00:00+00', 42);

Resumen de mejores prácticas

  1. Almacena en UTC, convierte para mostrar — Nunca almacenes hora local en las bases de datos
  2. Usa nombres de zona horaria IANA (por ejemplo, America/New_York) en lugar de abreviaturas (EST, PST) — las abreviaturas son ambiguas y no tienen en cuenta el DST
  3. Maneja el DST explícitamente — Usa bibliotecas conscientes de la zona horaria; nunca sumes o restes horas manualmente
  4. Pasa siempre la información de la zona horaria — Al aceptar fechas de los usuarios, recopila la zona horaria, no solo el desplazamiento
  5. Prueba fechas límite — Prueba tu lógica de conversión en fechas de transición del DST (tanto de primavera como de otoño) para detectar errores temprano

Base de datos de zonas horarias

Los datos de zona horaria de tu sistema provienen de la Base de datos de zonas horarias de IANA (también llamada base de datos de Olson), que se actualiza varias veces al año a medida que los gobiernos cambian las reglas del DST. Mantén tu sistema actualizado:

# Debian / Ubuntu
sudo apt update && sudo apt install tzdata

# macOS
# Automatically updated via software updates

# Verify your database version
zdump -v /etc/localtime | head -1

Usa nuestro Convertidor de marcas de tiempo Unix para conversiones rápidas conscientes de la zona horaria en todas las zonas horarias principales.