Formatos de timestamp Unix explicados

Uma referência completa de todos os formatos de timestamp Unix — segundos, milissegundos, microssegundos, ISO 8601 e RFC 2822 — com exemplos mostrando qual formato cada linguagem e banco usa.

Unix time em segundos — o formato universal

O formato mais comum: um inteiro de 32 ou 64 bits que conta os segundos inteiros desde 1 de janeiro de 1970 00:00:00 UTC. Atualmente um número de 10 dígitos em torno de 1,7 bilhão.

  • Exemplo: 1700000000 = 2023-11-15 06:13:20 UTC
  • Usado por: Python time.time(), PHP time(), Go time.Now().Unix(), Ruby Time.now.to_i, C time(NULL)
  • Armazenado como: int de 32 bits (legado, ano máx. 2038), int de 64 bits (moderno, seguro por bilhões de anos)
  • Banco de dados: MySQL UNIX_TIMESTAMP(), PostgreSQL EXTRACT(EPOCH FROM NOW())::BIGINT

Unix time em milissegundos — o formato do JavaScript

Milissegundos desde o epoch Unix: um inteiro de 13 dígitos com precisão de milissegundo. É o formato que o objeto Date do JavaScript usa internamente.

  • Exemplo: 1700000000000 = 2023-11-15 06:13:20.000 UTC
  • Usado por: JavaScript Date.now(), Java System.currentTimeMillis(), .NET DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
  • Para converter em segundos: Math.floor(ms / 1000)
  • Para converter de segundos: seconds * 1000

ISO 8601 — o padrão legível por humanos

ISO 8601 é um padrão internacional para representar datas e horas como strings. Diferente dos timestamps Unix, é autodescritivo: o formato codifica a data/hora e o deslocamento de fuso.

  • 2023-11-15T06:13:20Z — UTC (o sufixo Z significa UTC)
  • 2023-11-15T01:13:20-05:00 — com deslocamento UTC explícito (EST)
  • 2023-11-15T06:13:20.000Z — com milissegundos
  • JavaScript: date.toISOString() sempre retorna UTC com sufixo Z
  • Python: datetime.isoformat(), Go: time.Format(time.RFC3339)

RFC 2822 — formato de data de e-mail e HTTP

RFC 2822 (também chamado de RFC 1123 para HTTP) é o formato de data usado em cabeçalhos de e-mail e respostas HTTP. O Date.toUTCString() do JavaScript retorna esse formato.

  • Exemplo: Wed, 15 Nov 2023 06:13:20 GMT
  • Usado em: cabeçalhos de resposta HTTP (Last-Modified, Date, Expires), cabeçalhos de e-mail (Date:)
  • JavaScript: date.toUTCString()
  • Menos comum em APIs modernas, mas ainda muito presente na infraestrutura web

Como detectar o formato do timestamp

Ao receber um valor de timestamp desconhecido, use estas regras para identificar o formato:

  • 10 dígitos, começa com 1 → segundos Unix (ex.: 1700000000)
  • 13 dígitos, começa com 1 → milissegundos Unix (ex.: 1700000000000)
  • Negativo → segundos ou milissegundos Unix anteriores a 1970
  • Contém T ou Z → ISO 8601 (ex.: 2023-11-15T06:13:20Z)
  • Contém vírgula ou nome de dia → RFC 2822 (ex.: Wed, 15 Nov 2023 ...)
  • 16 dígitos → microssegundos (divida por 1,000,000 para segundos)
  • 19 dígitos → nanossegundos (divida por 1,000,000,000 para segundos)

Microssegundos e nanossegundos

Alguns sistemas de alta precisão usam unidades menores que o milissegundo. São raras em código de aplicação, mas aparecem em sistemas de baixo nível, internos de bancos de dados e ferramentas de observabilidade.

  • Microssegundos (µs): inteiro de 16 dígitos — Rust SystemTime as_micros(), PostgreSQL clock_gettime()
  • Nanossegundos (ns): inteiro de 19 dígitos — Go time.Now().UnixNano(), Rust SystemTime as_nanos()
  • PostgreSQL EXTRACT(EPOCH) retorna um número de ponto flutuante com os microssegundos como parte fracionária
  • Para converter nanossegundos em segundos: divida por 1,000,000,000 (1e9)

FAQ sobre formatos de timestamp Unix

Quantos dígitos tem um timestamp Unix?
Um timestamp Unix moderno em segundos tem 10 dígitos (em torno de 1,7 bilhão); em milissegundos, 13. Microssegundos têm 16 dígitos e nanossegundos 19.
Qual é a diferença entre Unix time e ISO 8601?
Unix time é um único número de segundos ou milissegundos desde 1970 UTC e não carrega fuso. ISO 8601 é uma string autodescritiva como 2023-11-15T06:13:20Z que codifica data, hora e deslocamento.
Como detecto se um timestamp está em segundos ou milissegundos?
Conte os dígitos: 10 são segundos, 13 são milissegundos. Se um valor converte para uma data perto de 1970 ou muito distante, a unidade foi lida errado.