Guías

Diferencia entre UTC y GMT

Introducción

UTC y GMT son dos estándares de tiempo que suelen confundirse tanto por desarrolladores como por usuarios. Aunque en el uso cotidiano pueden parecer equivalentes, existen diferencias técnicas importantes que afectan el desarrollo de software, aplicaciones sensibles al tiempo y sistemas globales.

Resumen rápido: UTC es un estándar de tiempo preciso basado en relojes atómicos, mientras que GMT se basa en observaciones astronómicas. UTC es el estándar moderno para la mayoría de aplicaciones, y GMT es principalmente un nombre de zona horaria.

¿Qué es UTC?

Definición

UTC (Tiempo Universal Coordinado) es el estándar principal por el que el mundo regula los relojes y el tiempo. Se basa en el Tiempo Atómico Internacional (TAI) con segundos intercalares añadidos para mantenerlo dentro de 0,9 segundos de UT1 (tiempo solar).

UTC Characteristics:
  - Based on: Atomic clocks (International Atomic Time - TAI)
  - Precision: ±0.9 seconds from UT1 (solar time)
  - Time Zone: No time zone offset (UTC+0)
  - Daylight Saving: No DST adjustments
  - Usage: Worldwide standard for computing, internet, and aviation

Características clave

  1. Base de tiempo atómica: UTC utiliza cientos de relojes atómicos en todo el mundo para lograr una precisión extrema
  2. Segundos intercalares: Ajustes ocasionales de 1 segundo para mantenerse sincronizado con la rotación de la Tierra
  3. Referencia universal: Se usa como base para todas las zonas horarias (UTC+X, UTC-X)
  4. Sin DST: Nunca cambia por horario de verano

Ejemplo de código: obtener hora UTC

// Get current UTC time
const now = new Date();
const utcString = now.toISOString(); // "2026-01-01T12:00:00.000Z"
const utcTimestamp = Math.floor(now.getTime() / 1000); // 1735689600

console.log('UTC ISO String:', utcString);
console.log('UTC Timestamp:', utcTimestamp);
from datetime import datetime, timezone

# Get current UTC time
now_utc = datetime.now(timezone.utc)
utc_iso = now_utc.isoformat()
utc_timestamp = int(now_utc.timestamp())

print(f'UTC ISO String: {utc_iso}')
print(f'UTC Timestamp: {utc_timestamp}')
import java.time.Instant;
import java.time.ZoneOffset;

// Get current UTC time
Instant now = Instant.now();
String utcIso = now.toString();
long utcTimestamp = now.getEpochSecond();

System.out.println("UTC ISO String: " + utcIso);
System.out.println("UTC Timestamp: " + utcTimestamp);

¿Qué es GMT?

Definición

GMT (Greenwich Mean Time) es una zona horaria basada originalmente en el tiempo solar del Real Observatorio de Greenwich, en Londres. Históricamente fue el estándar principal del mundo, pero ha sido reemplazado en gran medida por UTC.

GMT Characteristics:
  - Based on: Astronomical observations (solar time at Greenwich)
  - Precision: Varies with Earth's rotation irregularities
  - Time Zone: UTC+0 (during winter), UTC+1 (during summer in UK)
  - Daylight Saving: Subject to UK daylight saving time (BST)
  - Usage: UK time zone name, some maritime operations

Contexto histórico

GMT se estableció en 1884 en la Conferencia Internacional del Meridiano. Fue el estándar principal del mundo hasta que se adoptó UTC en la década de 1960.

Ejemplo de código: obtener hora GMT

// Get current GMT (London) time
const now = new Date();
const options = { timeZone: 'Europe/London', timeZoneName: 'short' };
const gmtString = now.toLocaleString('en-US', options);

console.log('GMT/London Time:', gmtString);

// Note: This shows GMT or BST depending on UK daylight saving
# Get current GMT (London) time
from datetime import datetime
import pytz

# Get current GMT (London) time
london_tz = pytz.timezone('Europe/London')
now_london = datetime.now(london_tz)

print(f'GMT/London Time: {now_london.strftime("%Y-%m-%d %H:%M:%S %Z")}')

# Note: This shows GMT or BST depending on UK daylight saving
// Get current GMT (London) time
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

// Get current GMT (London) time
ZoneId londonZone = ZoneId.of("Europe/London");
ZonedDateTime londonTime = ZonedDateTime.now(londonZone);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");

System.out.println("GMT/London Time: " + londonTime.format(formatter));

// Note: This shows GMT or BST depending on UK daylight saving

Diferencias clave: UTC vs GMT

Tabla comparativa

CaracterísticaUTC (Tiempo Universal Coordinado)GMT (Greenwich Mean Time)
Basado enRelojes atómicos (TAI)Observaciones solares en Greenwich
Precisión±0,9 segundosVaría con la rotación de la Tierra
Zona horariaNo cambia (UTC+0)Cambia con el DST del Reino Unido (GMT/BST)
Ajuste por DSTNoSí (el Reino Unido usa BST en verano)
Segundos intercalaresSí (para coincidir con la rotación de la Tierra)No (no usa segundos intercalares)
Uso principalInformática, internet, aviaciónZona horaria del Reino Unido, marítimo
ISO 8601Usa el estándar UTCNo es un estándar en ISO 8601
APIs de programaciónLa mayoría usan UTC internamenteRara vez se usa en APIs

El factor del segundo intercalar

UTC añade o resta ocasionalmente un segundo intercalar para mantenerse sincronizado con la rotación de la Tierra. A partir de 2026, la diferencia es:

UTC - TAI = -37 seconds (UTC is 37 seconds behind atomic time)
UTC - UT1 = ±0.9 seconds (UTC is kept close to solar time)

Current UTC-GMT offset: Usually 0, but varies slightly due to leap seconds

Importante: Aunque UTC y GMT a menudo se tratan como iguales en el uso diario, pueden diferir hasta 0,9 segundos por los segundos intercalares. Para la mayoría de aplicaciones, esta diferencia es insignificante, pero importa para:

  • Trading de alta frecuencia
  • Investigación científica
  • Sistemas de sincronización precisa

Cuándo usar UTC vs GMT

Usa UTC cuando

  1. Desarrollo de software: la mayoría de lenguajes usan UTC internamente
  2. Timestamps en bases de datos: guarda todo en UTC para consistencia
  3. Respuestas de API: devuelve timestamps UTC para interpretación universal
  4. Sistemas globales: apps usadas en múltiples zonas horarias
  5. Sincronización: sistemas que requieren coordinación temporal precisa
// Example: Store timestamps in UTC database
const timestamp = Date.now(); // UTC milliseconds
// Store in database: 17356896000000

// Display in user's local time
const userTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
const localTime = new Date(timestamp).toLocaleString('en-US', { timeZone: userTimeZone });

Usa GMT cuando

  1. Zona horaria del Reino Unido: representar hora en UK (Europe/London)
  2. Datos históricos: tratar timestamps anteriores a 1972 cuando GMT era estándar
  3. Operaciones marítimas: algunos sistemas marítimos aún referencian GMT
  4. Sistemas legacy: sistemas antiguos que usan GMT explícitamente
// Example: UK time zone handling
const now = new Date();
const ukTime = now.toLocaleString('en-GB', { timeZone: 'Europe/London' });
// Displays as "01/01/2026, 12:00:00 GMT" or "01/01/2026, 13:00:00 BST"

Ejemplos de conversión de zona horaria

Convertir hora local a UTC

function convertToUTC(dateString, timeZone) {
  const date = new Date(dateString);
  const utcString = date.toISOString();
  const utcTimestamp = Math.floor(date.getTime() / 1000);

  return {
    input: dateString,
    timeZone: timeZone,
    utcString: utcString,
    utcTimestamp: utcTimestamp
  };
}

// Example: Convert Tokyo time to UTC
const result = convertToUTC('2026-01-01 20:00:00', 'Asia/Tokyo');
console.log(result);
// Output: { utcString: "2026-01-01T11:00:00.000Z", utcTimestamp: 1735659600 }
from datetime import datetime
import pytz

def convert_to_utc(date_string, time_zone):
    tz = pytz.timezone(time_zone)
    local_time = tz.localize(datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S"))
    utc_time = local_time.astimezone(pytz.UTC)

    return {
        "input": date_string,
        "time_zone": time_zone,
        "utc_string": utc_time.isoformat(),
        "utc_timestamp": int(utc_time.timestamp())
    }

# Example: Convert Tokyo time to UTC
result = convert_to_utc('2026-01-01 20:00:00', 'Asia/Tokyo')
print(result)
# Output: {'utc_string': '2026-01-01T11:00:00Z', 'utc_timestamp': 1735659600}

Referencia de desfases UTC

UTC+0:  London (winter), Dublin (winter), Lisbon (winter)
UTC+1: Berlin, Paris, Rome, Madrid (winter), London (summer/BST)
UTC+2: Cairo, Helsinki, Athens, Johannesburg
UTC+3: Moscow, Istanbul, Baghdad, Nairobi
UTC+4: Dubai, Tbilisi, Baku
UTC+5: Karachi, Tashkent, Maldives
UTC+5:30: Mumbai, Kolkata, New Delhi
UTC+8: Beijing, Shanghai, Singapore, Perth
UTC+9: Tokyo, Seoul, Pyongyang
UTC+10: Sydney, Melbourne, Guam
UTC-5: New York (EST), Toronto (EST), Lima
UTC+8: Los Angeles (PST), San Francisco (PST), Vancouver (PST)

Errores comunes a evitar

Error 1: Suponer que UTC = GMT siempre

Aunque a menudo son iguales, pueden diferir hasta 0,9 segundos. Para aplicaciones de alta precisión, usa UTC explícitamente.

// ❌ Incorrect: Using GMT interchangeably with UTC
const gmtTime = new Date().toGMTString(); // Deprecated method

// ✅ Correct: Using UTC explicitly
const utcTime = new Date().toISOString(); // Proper UTC format

Error 2: Guardar hora local en lugar de UTC

Guarda siempre los timestamps en UTC y convierte a hora local solo para mostrar.

// ❌ Incorrect: Storing local time in database
const localTime = new Date().toLocaleString();
db.save({ created_at: localTime }); // Ambiguous time zone

// ✅ Correct: Storing UTC timestamp in database
const utcTimestamp = Date.now();
db.save({ created_at: utcTimestamp }); // Universal reference

Error 3: Ignorar las reglas de la base de datos de zonas horarias

No asumas offsets fijos. Usa la base de datos de zonas horarias IANA para conversiones precisas.

// ❌ Incorrect: Assuming fixed offset for a location
const tokyoOffset = 9 * 60 * 60 * 1000; // UTC+9 in milliseconds

// ✅ Correct: Using IANA time zone database
const tokyoTime = new Date().toLocaleString('en-US', { timeZone: 'Asia/Tokyo' });

Mejores prácticas

Para desarrolladores

  1. Guarda siempre timestamps en UTC en bases de datos
  2. Usa formato ISO 8601 para representaciones en texto: 2026-01-01T12:00:00Z
  3. Muestra la hora en la zona del usuario para mejor UX
  4. Usa identificadores IANA (ej. America/New_York, no EST)
  5. Maneja el horario de verano con librerías de zona horaria

Librerías recomendadas

LenguajeLibreríaPropósito
JavaScriptdate-fns-tz, luxon, moment-timezoneManejo de zonas horarias
Pythonpytz, zoneinfo (Python 3.9+)Manejo de zonas horarias
Javajava.time (Java 8+)Zona horaria y fechas
Gotime (stdlib)Manejo de zonas horarias
RubytzinfoManejo de zonas horarias

Conclusión

UTC y GMT cumplen propósitos distintos:

  • UTC es el estándar moderno y preciso basado en relojes atómicos
  • GMT es principalmente un nombre de zona horaria para el Reino Unido, basado en tiempo solar

Para desarrollo de software y sistemas globales, usa siempre UTC como estándar temporal. Usa GMT solo cuando necesites la zona horaria del Reino Unido o compatibilidad con sistemas legacy.

Herramientas relacionadas

Preguntas frecuentes

P: ¿UTC es lo mismo que GMT?

R: A menudo se tratan como iguales en el uso cotidiano, pero pueden diferir hasta 0,9 segundos. UTC se basa en relojes atómicos, mientras que GMT se basa en observaciones solares.

P: ¿UTC observa el horario de verano?

R: No, UTC nunca cambia por horario de verano. Es un estándar constante. Las zonas horarias pueden ajustar su offset respecto a UTC (por ejemplo, UTC+1 a UTC+2), pero UTC no cambia.

P: ¿Por qué veo “GMT” en la configuración de zona horaria?

R: Muchos sistemas usan “GMT” como un nombre heredado para UTC+0. En aplicaciones modernas suele referirse a la zona UTC+0, no al GMT astronómico.

P: ¿Cuántas zonas horarias existen?

R: Hay 24 zonas horarias estándar (UTC-12 a UTC+14), pero la base de datos IANA incluye más de 400 nombres para cubrir cambios históricos, reglas de DST y variaciones regionales.

P: ¿Debo usar UTC o GMT en mi aplicación?

R: Usa UTC. Es el estándar moderno usado por la mayoría de lenguajes, bases de datos y APIs. Usa GMT solo si necesitas la zona horaria del Reino Unido.