Formato Unix Timestamp vs ISO 8601: Qual Você Deve Usar?

Desenvolvedor comparando formato Unix timestamp e ISO 8601 para uso em APIs e bancos de dados

Se você já integrou dois sistemas que armazenam datas de formas diferentes, sabe bem como é frustrante. Uma API retorna 1714521600, outra retorna 2024-05-01T00:00:00Z, e de repente você está escrevendo lógica de conversão de madrugada. Escolher corretamente entre o formato Unix timestamp e o ISO 8601 desde o início economiza horas de depuração e evita bugs silenciosos em produção. Os dois formatos são amplamente utilizados, cada um tem vantagens reais, e nenhum é universalmente "melhor". O que importa é entender exatamente quando cada um se encaixa na sua situação — e por que a escolha errada gera custos reais.

Pontos principais:

  • Unix timestamps são inteiros que contam segundos (ou milissegundos) desde 1º de janeiro de 1970 UTC — ideais para cálculos, armazenamento e APIs.
  • ISO 8601 é um formato de string padronizado e legível por humanos — ideal para logs, interfaces de usuário e comunicação entre sistemas.
  • Os dois formatos são complementares, não concorrentes. Muitos sistemas em produção armazenam Unix time internamente e expõem ISO 8601 externamente.
  • Usar o formato errado no contexto errado gera bugs de fuso horário, erros de parsing e complexidade desnecessária.

O que é o formato Unix timestamp?

Um Unix timestamp (também chamado de Unix time ou epoch time) é um único inteiro que representa o número de segundos decorridos desde a época Unix: 1º de janeiro de 1970, 00:00:00 UTC. O formato Unix time é agnóstico a fuso horário por definição, pois sempre se refere a UTC. Não há ambiguidade com horário de verão ou offsets regionais.

Por exemplo, o Unix timestamp 1714521600 representa exatamente um único instante no tempo, independentemente de onde no mundo você o leia. Sistemas modernos frequentemente estendem isso para milissegundos (1714521600000) ou microssegundos para maior precisão. Você pode saber mais sobre essas variações no nosso guia sobre segundos vs milissegundos vs microssegundos em Unix timestamps.

Tecnicamente, um Unix timestamp é apenas um número. Essa simplicidade é ao mesmo tempo seu maior ponto forte e a origem do seu maior problema de legibilidade.

Para um histórico mais aprofundado sobre a origem desse conceito, veja nosso artigo sobre epoch time e seus fundamentos.

O que é o formato de data ISO 8601?

ISO 8601 é um padrão internacional publicado pela Organização Internacional de Normalização que define como representar datas e horários como strings. Um datetime típico em ISO 8601 tem esta aparência: 2024-05-01T00:00:00Z.

Detalhando cada parte:

  • 2024-05-01 — a data no formato YYYY-MM-DD
  • T — separador entre data e hora
  • 00:00:00 — o horário no formato HH:MM:SS
  • Z — indica UTC (você também pode usar offsets como +05:30)

ISO 8601 é a base do padrão RFC 3339, amplamente utilizado em protocolos de internet. É legível por humanos, ordenável como string e sem ambiguidade entre diferentes localidades. Ao contrário de escrever "05/01/2024" — que significa 1º de maio nos EUA, mas 5 de janeiro na Europa — o ISO 8601 é globalmente consistente.

Principais diferenças em resumo

Propriedade Formato Unix timestamp Formato de data ISO 8601
Tipo de dado Inteiro (ou float) String
Legível por humanos Não Sim
Tratamento de fuso horário Sempre UTC (implícito) Offset explícito ou Z
Amigável para cálculos Sim (subtração, comparação) Não (requer parsing)
Tamanho de armazenamento Pequeno (4–8 bytes) Maior (20+ caracteres)
Ordenável diretamente Sim (ordenação numérica) Sim (lexicográfica)
Seguro para diferentes localidades Sim Sim

Quando usar o formato Unix timestamp

O formato Unix time se destaca em situações específicas e bem definidas. Use-o quando:

1. Precisar fazer cálculos com datas

Calcular durações é trivial com Unix timestamps. Para descobrir quantos segundos se passaram, basta subtrair um inteiro de outro. Com strings ISO 8601, você precisa primeiro fazer o parsing de ambas para objetos datetime e depois calcular a diferença. Para operações de alta frequência — como registrar milhões de eventos em log — esse overhead de parsing se acumula.

2. Armazenar datas em bancos de dados

Colunas de inteiros são mais rápidas para indexar e comparar do que colunas de string. Se você executa consultas como "me dê todos os eventos dos últimos 7 dias", comparar dois inteiros é mais eficiente do que fazer parsing e comparar strings. Nosso guia detalhado sobre Unix timestamps em bancos de dados aborda estratégias de indexação e padrões de consulta em profundidade.

3. Comunicação entre serviços internos

Quando dois serviços de backend que você controla precisam trocar timestamps, o formato Unix reduz a complexidade do parsing. Ambos os lados concordam com o contrato de inteiro, e não há risco de interpretação equivocada de strings de fuso horário.

4. Lógica de expiração e TTL

Tokens JWT, entradas de cache e expiração de sessão são quase universalmente expressos como Unix timestamps. O campo exp em um JSON Web Token (JWT) é um Unix timestamp exatamente por esse motivo: comparar exp > Date.now() / 1000 é uma única operação de comparação de inteiros.

5. Evitar bugs de fuso horário

Como Unix timestamps são sempre UTC, eles eliminam toda uma classe de bugs relacionados ao horário de verão. Se sua aplicação atende usuários em múltiplos fusos horários, armazenar Unix timestamps e converter para o horário local apenas no momento da exibição é um padrão arquitetural amplamente comprovado.

Fique atento ao problema do ano 2038 se você estiver usando inteiros de 32 bits com sinal para armazenar Unix timestamps — sempre use inteiros de 64 bits em sistemas modernos.

Quando usar o formato de data ISO 8601

O formato de data ISO 8601 vence nos contextos em que humanos ou sistemas externos precisam ler, escrever ou validar datas sem executar código.

1. Respostas de API consumidas por terceiros

Se você está construindo uma API pública, retornar "created_at": "2024-05-01T12:30:00Z" é muito mais amigável para desenvolvedores do que "created_at": 1714562200. Desenvolvedores externos conseguem entender o valor imediatamente, sem precisar convertê-lo. Muitos guias de estilo de API, incluindo os do Stripe e do GitHub, adotam ISO 8601 como padrão por esse motivo.

2. Arquivos de log e trilhas de auditoria

Logs são lidos por humanos durante incidentes. Uma linha de log que diz [2024-05-01T14:22:05Z] ERROR: pagamento falhou é imediatamente acionável. Um log com [1714569725] ERROR: pagamento falhou obriga o leitor a converter o timestamp antes mesmo de começar a depurar.

3. Internacionalização e localização

ISO 8601 inclui informações explícitas de offset de fuso horário. Quando seu sistema precisa preservar o horário local original do usuário — por exemplo, um evento de calendário criado às 9h em Tóquio — o ISO 8601 com o offset correto (2024-05-01T09:00:00+09:00) captura essa intenção. Um Unix timestamp sozinho não consegue informar em qual fuso horário o usuário estava quando criou o evento.

4. Arquivos de configuração e formatos de troca de dados

Arquivos JSON, YAML e CSV que humanos editam devem usar ISO 8601. Se um desenvolvedor precisa definir manualmente uma data de expiração em um arquivo de configuração, escrever 2025-01-01T00:00:00Z é muito menos suscetível a erros do que calcular e escrever um Unix timestamp à mão.

Exemplos de código em JavaScript e Python

JavaScript: convertendo entre os formatos

// Obter o Unix timestamp atual (em segundos)
const unixNow = Math.floor(Date.now() / 1000);
console.log(unixNow); // ex.: 1714521600

// Converter Unix timestamp para string ISO 8601
const isoString = new Date(unixNow * 1000).toISOString();
console.log(isoString); // "2024-05-01T00:00:00.000Z"

// Converter string ISO 8601 de volta para Unix timestamp
const parsed = new Date("2024-05-01T00:00:00Z");
const backToUnix = Math.floor(parsed.getTime() / 1000);
console.log(backToUnix); // 1714521600

// Calcular duração entre dois Unix timestamps (sem parsing necessário)
const start = 1714521600;
const end = 1714608000;
const durationSeconds = end - start;
console.log(`Duração: ${durationSeconds / 3600} horas`); // 24 horas

Python: trabalhando com os dois formatos

import time
from datetime import datetime, timezone

# Obter o Unix timestamp atual
unix_now = int(time.time())
print(unix_now)  # ex.: 1714521600

# Converter Unix timestamp para string ISO 8601
dt = datetime.fromtimestamp(unix_now, tz=timezone.utc)
iso_string = dt.isoformat()
print(iso_string)  # "2024-05-01T00:00:00+00:00"

# Converter string ISO 8601 de volta para Unix timestamp
parsed_dt = datetime.fromisoformat("2024-05-01T00:00:00+00:00")
back_to_unix = int(parsed_dt.timestamp())
print(back_to_unix)  # 1714521600

# Calcular duração - trivial com Unix timestamps
start = 1714521600
end = 1714608000
duration_hours = (end - start) / 3600
print(f"Duração: {duration_hours} horas")  # 24.0 horas

Importante: Em Python, sempre passe tz=timezone.utc ao chamar datetime.fromtimestamp(). Sem isso, o Python usa o fuso horário local do sistema, o que pode produzir resultados incorretos em servidores em regiões diferentes.

Exemplo prático: sistema de reservas

Imagine que você está construindo uma API de reservas de hotel. Um usuário em São Paulo reserva um quarto para check-in em 15 de junho de 2024 às 15h no horário local. Veja como os dois formatos se comportam de forma diferente na prática.

Armazenando como Unix timestamp: Você converte o horário local do usuário para UTC e armazena 1718470800. É compacto e rápido para consultar. Porém, quando a equipe do hotel olha para o registro bruto no banco de dados, vê apenas um número — e precisa de uma ferramenta para decodificá-lo. Pior ainda: se você esquecer de converter do horário local para UTC antes de armazenar, introduziu um bug silencioso de 3 horas (São Paulo fica em UTC-3 no horário padrão).

Armazenando como ISO 8601: Você armazena 2024-06-15T15:00:00-03:00. O offset é preservado. A equipe consegue ler o registro diretamente. A intenção de fuso horário original não se perde. Mas comparações de string em SQL são ligeiramente mais lentas, e calcular "quantas horas faltam para o check-in" exige fazer o parsing da string primeiro.

A solução em produção que a maioria das equipes adota: armazenar o Unix timestamp no banco de dados para desempenho e correção, e retornar a string ISO 8601 na resposta da API para usabilidade. Esse é o padrão utilizado pelas principais plataformas. Você obtém o melhor dos dois mundos.

Para um guia completo sobre padrões de conversão, veja nosso guia completo de conversão de Unix timestamp para data.

Recomendação clara por caso de uso

Com base em restrições reais, aqui está uma recomendação direta para cada cenário:

  • Armazenamento em banco de dados: use Unix timestamp (inteiro). Indexação mais rápida, sem parsing de fuso horário, menor footprint.
  • Comunicação interna entre microsserviços: use Unix timestamp. Ambos os lados controlam o contrato e nenhum humano lê o payload bruto.
  • Respostas de API REST públicas: use ISO 8601. Desenvolvedores externos precisam de valores legíveis e autodocumentados.
  • Arquivos de log e trilhas de auditoria: use ISO 8601. Humanos leem logs sob pressão durante incidentes.
  • Expiração de JWT e sessão: use Unix timestamp. A especificação exige isso e as comparações são uma única operação.
  • Arquivos de configuração e tarefas agendadas: use ISO 8601. Humanos escrevem e editam esses arquivos diretamente.
  • Funcionalidades de calendário e agendamento: use ISO 8601 com offset de fuso horário explícito. Preserva a intenção de fuso horário original do usuário.
  • Aritmética de datas na lógica da aplicação: converta para Unix timestamp primeiro, faça o cálculo e converta de volta se necessário.

Para um conjunto mais amplo de boas práticas sobre como trabalhar com timestamps em código de backend, nosso tutorial de Unix timestamp para desenvolvedores aborda padrões de armazenamento, formatação e tratamento de fuso horário em detalhes.

Conclusão

O debate entre o formato Unix timestamp e o formato de data ISO 8601 não é sobre qual é superior. É sobre usar a ferramenta certa para o trabalho certo. Unix timestamps pertencem às suas colunas de banco de dados, aos contratos entre seus serviços internos e à sua lógica de expiração. ISO 8601 pertence às suas respostas de API, aos seus logs e a qualquer arquivo que um humano possa abrir. A maioria dos sistemas robustos em produção usa os dois: armazena como Unix time e expõe como ISO 8601. Se você internalizar esse único padrão, vai evitar os bugs mais comuns de manipulação de datas antes que eles cheguem à produção.

Ferramenta gratuita de conversão de Unix timestamp - converta entre Unix time e ISO 8601 instantaneamente

Pare de adivinhar qual formato de data usar

Experimente nosso conversor gratuito de Unix timestamp em unixtimestamp.app e converta entre Unix time e ISO 8601 instantaneamente — sem precisar escrever código. Cole um timestamp e obtenha uma data legível em segundos.

Experimente nossa ferramenta gratuita →

Sim, e muitos bancos de dados suportam tipos datetime nativos que armazenam ISO 8601 internamente. No entanto, Unix timestamps inteiros são geralmente mais rápidos para consultas de intervalo e comparações de índice. Para tabelas de alto volume com filtragem frequente por data, timestamps inteiros oferecem uma vantagem de desempenho mensurável em relação a colunas de string ou datetime.

Unix timestamps são sempre UTC por definição. Eles não armazenam informações de fuso horário. Para exibir um Unix timestamp no fuso horário local do usuário, você faz a conversão na camada de apresentação. Isso é na verdade uma vantagem: não há nenhuma ambiguidade no valor armazenado, e a conversão de fuso horário é tratada explicitamente onde deve ser.

Unix timestamps baseados em segundos (ex.: 1714521600) são o formato tradicional usado na maioria dos sistemas Unix e padrões como JWT. Milissegundos (ex.: 1714521600000) são comuns em JavaScript e ambientes de navegador. Sempre confirme qual precisão uma API espera — enviar segundos quando milissegundos são esperados produz datas 1000 vezes no passado.

RFC 3339 é um perfil do ISO 8601 projetado especificamente para uso na internet. É ligeiramente mais restrito: exige um offset de fuso horário (como Z ou +00:00) e não permite alguns recursos opcionais do ISO 8601. Na prática, a maioria dos desenvolvedores os trata como intercambiáveis para strings datetime padrão como 2024-05-01T00:00:00Z.

O GitHub usa strings ISO 8601 nas respostas de sua API REST. O Stripe usa Unix timestamps (inteiros) em sua API. Ambas as escolhas são deliberadas e consistentes com seus casos de uso. Isso ilustra que não existe uma regra única para toda a indústria — a escolha certa depende do público da sua API e das operações que os consumidores precisam realizar sobre os valores.