Guide

Trabalhando com carimbos de data/hora UTC – Guia completo

Introdução

UTC (Tempo Universal Coordenado) é a referência de tempo padrão usada em computação e redes. Compreender como trabalhar com carimbos de data/hora UTC é essencial para criar aplicativos que funcionem em vários fusos horários e precisem de cálculos de tempo precisos.

Compreendendo o UTC

Qual é o horário UTC?

UTC é um padrão de horário que:

  • Não tem diferença de fuso horário (sem horário de verão)
  • Usa um formato de relógio de 24 horas (00:00:00 a 23:59:59.999)
  • Representado como "Z" na ISO 8601 (por exemplo, 2025-01-07T12:00:00.000Z)
  • Serve de base para todos os outros fusos horários

UTC versus hora local

Conceito crucial: A hora local varia de acordo com a localização geográfica e o fuso horário. UTC é constante em todo o mundo.

CaracterísticaHora UTCHora Local
Compensação de fuso horárioSempre UTC+00:00Varia de acordo com o local (por exemplo, UTC-5, UTC+8, UTC-10)
Horário de verãoSem ajustes de horário de verãoVaria de acordo com a estação e região
ConsistênciaGlobalmente consistenteSistemas diferentes podem ter horários locais diferentes
Caso de uso principalSistemas globais, bancos de dados, APIsAplicativos voltados para o usuário, eventos de calendário
Tamanho de armazenamentoIgual a qualquer carimbo de data/hora (sem sobrecarga extra)Igual a DateTime (armazenamento maior)
Desempenho de consultaExcelente (comparações numéricas)Lento (requer análise de data e hora)

Aviso: Sempre armazene carimbos de data/hora UTC em seu banco de dados. Converta para a hora local apenas para fins de exibição.

Formato de carimbo de data/hora UTC

ISO 8601

Os carimbos de data e hora UTC na ISO 8601 sempre terminam com “Z”:

2025-01-07T12:00:00.000Z  // January 7, 2025, 12:00:00 UTC

Carimbo de data e hora Unix

Os carimbos de data e hora UTC são o número de segundos desde a época Unix (1970-01-01 00:00:00 UTC):

1735689600 // January 1, 2025, 00:00:00 UTC

Convertendo UTC para hora local

JavaScript

// Convert UTC timestamp (seconds) to local time
function utcToLocal(utcTimestampSeconds, timezoneOffsetHours = 0) {
  const date = new Date(
    (utcTimestampSeconds * 1000) + (timezoneOffsetHours * 60 * 60 * 1000),
  );
  return date.toLocaleString(); // Returns string like "1/7/2025, 6:12:00 PM"
}

// Get UTC timestamp and convert to local
const now = Math.floor(Date.now() / 1000);
console.log(utcToLocal(now, -5)); // UTC-5 for EST

###Píton

from datetime import datetime, timezone
from zoneinfo import ZoneInfo

# Convert UTC to specific timezone
def utc_to_local(utc_timestamp: int, timezone_str: str) -> datetime:
    """
    Convert UTC timestamp to local datetime in specified timezone.

    Args:
        utc_timestamp: Unix timestamp in seconds
        timezone_str: IANA timezone name (e.g., 'America/New_York')

    Returns:
        Local datetime object
    """
    utc_time = datetime.fromtimestamp(utc_timestamp, tz=timezone.utc)
    return utc_time.astimezone(ZoneInfo(timezone_str))

# Example
print(utc_to_local(1735689600, "America/Los_Angeles"))

###SQL

-- MySQL: Convert UTC timestamp to datetime
-- Note: Use FROM_UNIXTIME() which respects the system timezone setting

-- Convert UTC timestamp to MySQL DATETIME
SELECT
  id,
  FROM_UNIXTIME(created_at) AS mysql_datetime,
  created_at
FROM events
WHERE id = ?;

-- Store current UTC timestamp
UPDATE events
SET created_at = UNIX_TIMESTAMP(NOW());

-- PostgreSQL: Use TIMESTAMPTZ for timezone-aware storage
CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  event_timestamp TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  event_date TIMESTAMP WITH TIME ZONE 'UTC'
);

-- Query events with local time display
SELECT
  id,
  event_timestamp,
  TO_CHAR(event_timestamp, 'YYYY-MM-DD HH24:MI:SS') AS local_time
FROM events;

Prática recomendada: Sempre armazene carimbos de data/hora UTC. Use a conversão de fuso horário no nível do aplicativo apenas para exibição.

Tratamento de fuso horário

Compreendendo as compensações de fuso horário

As compensações de fuso horário são expressas como:

  • UTC+XX:00 (por exemplo, UTC-5:00)
  • UTC-XX:00 (por exemplo, UTC+8:00)
DeslocamentoHorasCidadeRegião
UTC-5:00-5Nova York, Toronto, Bogotá, LimaHorário Padrão do Leste
UTC-8:00-8Los Angeles, São Francisco, TijuanaHorário padrão do Pacífico
UTC+0:000Londres, Dublin, LisboaHora da Europa Ocidental
UTC+1:00+1Paris, Berlim, RomaHora da Europa Central
UTC+8:00+8Singapura, Hong Kong, PerthHorário Padrão da China
UTC+9:00+9Tóquio, Seul, PyongyangHorário padrão do Japão
UTC+10:00+10Sydney, Melbourne, BrisbaneHorário padrão do leste da Austrália
UTC+12:00+12AucklandHorário padrão da Nova Zelândia

Exemplos de conversão de fuso horário

Conversões de fuso horário JavaScript

// Convert between UTC and different timezones
function convertToTimezone(utcDate, timezone) {
  const options = { timeZone: timezone };
  return utcDate.toLocaleString('en-US', options);
}

// Examples
const utcDate = new Date('2025-01-07T12:00:00.000Z');

console.log(convertToTimezone(utcDate, 'America/New_York'));    // "1/7/2025, 7:00:00 AM EST"
console.log(convertToTimezone(utcDate, 'Asia/Tokyo'));      // "2025/1/7, 21:00:00 JST"
console.log(convertToTimeDate, 'Europe/London'));     // "1/7/2025, 12:00:00 GMT"
console.log(convertToTimezone(utcDate, 'Asia/Shanghai'));   // "2025/1/7, 20:00:00 CST"
// Python timezone handling
from datetime import datetime, timezone

# Get current UTC time and convert to timezone
now_utc = datetime.now(timezone.utc)

# Convert to specific timezone
now_tokyo = now_utc.astimezone('Asia/Tokyo')
now_est = now_utc.astimezone('America/New_York')
now_gmt = now_utc.astimezone('Etc/GMT')

print(f"UTC: {now_utc}")
print(f"Tokyo: {now_tokyo}")
print(f"EST: {now_est}")
print(f"GMT: {now_gmt}")

Melhores práticas

Diretrizes de armazenamento UTC

Armazenamento: Sempre armazene carimbos de data/hora UTC. Eles são independentes de fuso horário e eficientes para aplicativos globais.

Exibição: Converta para fuso horário local somente na camada da IU. Nunca armazene horários locais no banco de dados.

Consultas: Sempre filtre e classifique por carimbos de data/hora UTC. Isso garante uma ordem consistente, independentemente do fuso horário do usuário.

APIs: sempre use carimbos de data/hora UTC nas respostas da API. Documente o fuso horário na documentação da API.

Aviso crítico: Nunca misture carimbos de data/hora UTC com carimbos de data/hora locais na mesma coluna. Isso cria problemas de integridade de dados e inconsistências de consulta.

Armadilhas Comuns

Armadilha 1: Esquecer os fusos horários

Problema: Nem todos os locais observam o horário de verão ao mesmo tempo.

Exemplo: Arizona não segue o horário de verão, mas Nova York sim. Isso pode causar diferenças de 1 hora entre eles durante determinados períodos.

Solução: Use bancos de dados de fuso horário da IANA (banco de dados tz) que incluem regras de horário de verão históricas e atuais.

Armadilha 2: deslocamentos de fuso horário incorretos

Problema: Usando deslocamentos codificados em vez de nomes de fuso horário.

Ruim: const offset = -5 * 3600000; // EST é sempre -5, mas o Arizona não observa o horário de verão

Bom: const offset = 'America/New_York'; // Usa banco de dados IANA com horário de verão histórico correto

Armadilha 3: presumir que todos os horários estão no mesmo formato

Problema: Nem todos os sistemas usam UTC (por exemplo, alguns usam GMT, outros usam UTC+X).

Exemplo: Os carimbos de data/hora Unix são sempre baseados em UTC, mas os sistemas de arquivos podem variar.

Solução: sempre especifique explicitamente o fuso horário ao analisar a entrada do usuário.

Trabalhando com fusos horários diferentes

JavaScript

// Best practice: Always specify timezone when creating dates
const date1 = new Date('2025-01-07T12:00:00'); // UTC time (good)

const date2 = new Date('2025-01-07T12:00:00-08:00'); // Bad: assumes local timezone

// Convert between timezones
function convertTimezones(fromDate, fromTz, toTz) {
  return {
    fromTime: fromDate.toLocaleString('en-US', { timeZone: fromTz }),
    toTime: fromDate.toLocaleString('en-US', { timeZone: toTz }),
    fromTimestamp: fromDate.getTime(),
    toTimestamp: fromDate.toLocaleString('en-US', { timeZone: toTz }),
  };
}

// Example: Convert UTC to multiple timezones
const utcDate = new Date('2025-01-07T12:00:00.000Z');
const conversions = [
  convertTimezones(utcDate, 'UTC', 'America/New_York'),
  convertTimezones(utcDate, 'UTC', 'Asia/Tokyo'),
  convertTimezones(utcDate, 'UTC', 'Europe/London'),
];

###Píton

from datetime import datetime, timezone

# Best practice: Use pytz library
import pytz

def convert_to_timezone(utc_time: datetime, timezone: str) -> datetime:
    """
    Convert UTC datetime to specified timezone using IANA timezone database.

    Args:
        utc_time: UTC datetime object
        timezone_str: IANA timezone name

    Returns:
        Localized datetime object
    """
    utc_time = utc_time.replace(tzinfo=timezone.tzinfo(utc_time))
    return utc_time.astimezone(timezone)

# Example: Convert current UTC to multiple timezones
now_utc = datetime.now(timezone.utc)
now_est = now_utc.astimezone('America/New_York')
now_gmt = now_utc.astimezone('Etc/GMT')
now_tokyo = now_utc.astimezone('Asia/Tokyo')

print(f"UTC: {now_utc}")
print(f"EST: {now_est}")
print(f"GMT: {now_gmt}")
print(f"JST: {now_tokyo}")

Melhores práticas de fuso horário

Diretrizes para seleção de fuso horário

<ol> <li>Sempre use nomes de fuso horário da IANA (por exemplo, "América/Nova_Iorque", "Europa/Londres")</li> <li>Use bancos de dados de fuso horário (banco de dados IANA tz, banco de dados tz) em vez de compensações codificadas</li> <li>Teste as transições do horário de verão nas regiões-alvo (especialmente na primavera e no outono)</li> <li>Documente claramente suas suposições de fuso horário na documentação da API</li> <li>Considere usar o UTC para todos os cálculos e armazenamento interno</li> <li>Exibir nomes de fuso horário e horários locais separadamente na IU (armazenar UTC internamente)</li> </ol>

Ferramentas e referências

Ferramentas relacionadas

Resumo

Principal vantagem: Sempre armazene carimbos de data/hora UTC. Lide com a conversão de fuso horário no aplicativo ou na camada de consulta. Isso garante a consistência dos dados e torna seu aplicativo compatível globalmente.

Crítico: Nunca misture carimbos de data/hora UTC e locais no armazenamento do banco de dados. Sempre armazene o UTC e converta para local somente quando necessário.

Dica de desempenho: Os carimbos de data/hora UTC são ideais para:

  • Indexação de banco de dados (comparações numéricas)
  • Consultas de intervalo (filtros numéricos)
  • Operações de classificação (ordem numérica)
  • Particionamento baseado em tempo

Repositório de exemplos de código

Para obter mais exemplos de códigos de carimbo de data/hora e fuso horário, consulte nossas ferramentas e guias relacionados para trabalhar com casos de uso específicos: