Como Converter Entre Formatos de Hora

· 9 min de leitura

Os formatos de tempo variam entre sistemas, APIs e países. Timestamps Unix em respostas de API, ISO 8601 em bases de dados, relógios de 12 horas nos EUA, relógios de 24 horas na Europa: converter entre eles é uma necessidade constante para programadores e para qualquer pessoa que trabalhe com dados internacionais. Compreender porque cada formato existe, onde brilha e onde morde transforma a conversão num reflexo rápido em vez de uma fonte recorrente de bugs subtis.

Uma breve história dos formatos de tempo

Padronizar o tempo é mais antigo que a internet. Em 1884 a Conferência Internacional do Meridiano estabeleceu a hora média de Greenwich e o meridiano de origem, o que deu ao mundo uma referência comum pela primeira vez. O relógio de 24 horas espalhou-se pela aviação e pelos militares pela mesma razão: elimina a ambiguidade AM/PM que transforma uma reserva de meia-noite num voo de meio-dia.

O tempo Unix chegou com o kernel Unix original em 1971, contando segundos desde 1 de janeiro de 1970 UTC (a "epoch"). A escolha foi pragmática: um inteiro de 32 bits cobria décadas, ordenar timestamps significava ordenar números, e calcular intervalos era uma subtração. O ISO 8601 chegou em 1988 para padronizar o lado legível: ano-mês-dia em ordem big-endian, T como separador data/hora, e Z para UTC. O RFC 3339 (2002) é um perfil mais restritivo do ISO 8601 desenhado para protocolos de internet. O RFC 2822 (2001) define o formato estilo e-mail com nomes de dia e offsets. Cada formato resolve um problema real; nenhum substitui os outros por completo.

Formatos de tempo comuns

Seis formatos cobrem quase tudo o que vai encontrar na prática. A primeira coluna é o nome que verá na documentação; a coluna de exemplo mostra como 14:30 de 7 de abril de 2024 UTC se parece.

FormatoExemploUsado por
Timestamp Unix (segundos)1712502600APIs, bases de dados, tokens JWT, linhas de log
Timestamp Unix (ms)1712502600000JavaScript, Java, Android
Timestamp Unix (microssegundos)1712502600000000Postgres, Kafka, OpenTelemetry
ISO 8601 / RFC 33392024-04-07T14:30:00ZAPIs JSON, bases de dados, logs
RFC 2822Sun, 07 Apr 2024 14:30:00 +0000Cabeçalhos de e-mail, cabeçalhos HTTP
24 horas14:30Europa, militar, aviação
12 horas2:30 PMEUA, uso informal
Dia do ano (juliano)2024-098Aviónica, dados científicos
Data semana2024-W14-7Planeamento industrial, banca

A maioria das equipas fica-se por milissegundos Unix para armazenamento e ISO 8601 para trânsito, com formatos de exibição escolhidos por locale. A escolha importa menos que a consistência: escolha um formato principal, documente-o, e converta nas bordas.

Referência rápida de conversão

12 horas para 24 horas

O relógio de 12 horas tem duas peculiaridades: 12 AM é meia-noite (o início do dia) e 12 PM é meio-dia. A tabela abaixo cobre os casos que apanham as pessoas.

12 horas24 horas
12:00 AM (meia-noite)00:00
1:00 AM01:00
11:59 AM11:59
12:00 PM (meio-dia)12:00
12:01 PM12:01
1:00 PM13:00
6:00 PM18:00
11:59 PM23:59

Timestamps para datas

O conversor epoch traduz instantaneamente timestamps Unix para datas legíveis e vice-versa. O conversor deteta automaticamente os formatos de segundos (10 dígitos) e milissegundos (13 dígitos), por isso pode colar um valor de qualquer fonte sem se preocupar com a unidade.

Uma verificação de bom senso útil: divida por 86400 (segundos num dia) e some 1970 dias para localizar mentalmente qualquer timestamp. 1712502600 / 86400 ~ 19820 dias, cerca de 54 anos depois de 1970, o que o coloca em 2024. Não é preciso mas chega para apanhar erros de fator 1000 num relance.

Exemplos de conversão em código

A maioria dos programadores acaba por precisar de converter timestamps em código. As APIs principais são curtas:

Uma ferramenta de conversão é mais rápida que qualquer um destes one-liners quando só precisa de traduzir um único valor, o que é a maior parte do tempo durante a depuração.

Porque ISO 8601 vence para armazenamento

O ISO 8601 (e o perfil RFC 3339) ordena-se corretamente como string pura. 2024-04-07T14:30:00Z vem alfabeticamente antes de 2024-04-07T15:00:00Z, que vem antes de 2024-04-08T00:00:00Z. Essa propriedade deixa-o ordenar timestamps sem os parsear, agrupar linhas de log com sort | uniq -c e raciocinar sobre intervalos com simples comparações de string.

Também é inequívoco de uma forma que os formatos regionais não são. 04/07/2024 podia ser 7 de abril (EUA) ou 4 de julho (a maioria da Europa); 2024-04-07 é o mesmo em todas as locales. Para troca máquina a máquina, essa falta de ambiguidade vale mais do que qualquer outra consideração de formatação.

Armadilhas comuns a evitar

Ferramentas e bibliotecas alternativas

Um conversor trata do caso pontual; para código de produção vai recorrer a uma biblioteca.

Ferramenta / bibliotecaLinguagemForçaA vigiar
Conversor webBrowserInstantâneo, sem instalação, trata de ambiguidades comunsUm valor de cada vez
dateutilPythonParser tolerante, consciente de fusosMais lento que datetime para trabalho em massa
arrowPythonAPI amigável, defaults ISODependência extra para projetos pequenos
date-fnsJavaScriptTree-shakable, imutávelCada função é o seu próprio import
dayjsJavaScriptPequeno, API compatível com momentModelo de plugins para extras
luxonJavaScriptFusos IANA de primeira classeBundle maior
chronoRustTipos ricos, RFC 3339 nativoRitmo de manutenção varia
Joda-Time / java.timeJavaO design de referência que influenciou os outrosEvite os legados Date e Calendar
NodaTimeC#/.NETInstantes, durações e calendários bem separadosMigrar de DateTime não é trivial
GNU dateShell LinuxParsing flexível com -dBSD/macOS usa flags incompatíveis

A biblioteca certa depende da sua stack; a disciplina certa é a mesma em todo o lado: armazene UTC, transmita ISO 8601, formate só para exibir, e nunca confie num timestamp sem fuso explícito.

Privacidade e o conversor

O conversor de formatos de tempo corre inteiramente no seu browser. Os timestamps que cola e as datas que gera nunca saem da página. Não há registo em servidor de que valores foram convertidos, nem analítica sobre que formatos são populares, nem maneira de alguém ligar um pedido ao seu IP. As conversões de tempo não são dados pessoais por si só, mas os timestamps nos seus logs (horas de login, horas de transação, janelas de agendamento) muitas vezes são, e passá-los por um conversor de terceiros podia vazar detalhes operacionais. Fazer o trabalho do lado do cliente mantém essa informação na sua máquina, onde pertence. Para uma tarefa tão rotineira como trocar entre segundos e ISO 8601, o nível de privacidade por defeito devia ser sem transmissão, sem registo, sem terceiros no circuito.

Perguntas frequentes

O que é o formato ISO 8601?

ISO 8601 é o padrão internacional de representação de data e hora. Tem a aparência 2026-04-07T14:30:00Z, onde o T separa data e hora, e o Z indica UTC. É inequívoco em qualquer região.

Por que as APIs usam timestamps Unix em vez de datas legíveis?

Os timestamps Unix são um único número, o que os torna fáceis de armazenar, ordenar e comparar. São neutros em relação ao fuso (sempre UTC) e ocupam menos espaço que strings formatadas de data. A desvantagem é que não são legíveis por humanos.

O que significa o Z no final de um timestamp?

O Z representa "hora Zulu", que é outro nome para UTC (Tempo Universal Coordenado). Um timestamp terminando em Z está em UTC, não no horário local.

Como converto 24 horas para 12 horas?

Para horas de 1 a 12, a hora continua igual (adicione AM para 0-11, PM para 12). Para horas de 13 a 23, subtraia 12 e adicione PM. 00:00 é 12:00 AM (meia-noite). 12:00 é 12:00 PM (meio-dia).

What is the Year 2038 problem?

32-bit signed Unix timestamps overflow on 19 January 2038 at 03:14:07 UTC, after which they wrap around to negative values that look like dates in 1901. Most modern systems use 64-bit timestamps and are unaffected, but legacy embedded devices, old databases, and 32-bit time_t in some C code still need to be audited.

How are leap seconds handled in Unix time?

Unix time pretends leap seconds do not exist. The clock simply repeats or stretches the affected second, so a Unix timestamp is not a strict count of elapsed SI seconds. For most applications this is fine, but precision-timing code (astronomy, GPS, high-frequency trading) needs TAI or UTC with explicit leap-second handling.