🧰 ToolPicoTodas as ferramentas →
InícioBlog › Snowflake IDs e intervalos epoch

Extrair a data de um ID do Discord ou Twitter/X: guia de snowflake IDs e intervalos epoch

Se és programador e já precisaste de saber quando foi criado um servidor, mensagem ou conta a partir apenas do seu ID numérico — ou de montar uma cláusula SQL BETWEEN correta para um relatório mensal — este guia cobre dois casos avançados que o timestamp Unix "simples" não resolve sozinho.

Índice

O que é um ID snowflake e porque incorpora uma data

Resposta curta: Um ID snowflake é um número único gerado por plataformas como Discord e Twitter/X que, ao contrário de um simples contador sequencial, incorpora o próprio momento de criação dentro dos seus bits.

Quando um sistema precisa de gerar milhões de IDs únicos por segundo em vários servidores distribuídos, um contador sequencial simples não chega — dois servidores diferentes podiam gerar o mesmo número ao mesmo tempo. A solução «snowflake», popularizada pelo Twitter e adotada pelo Discord, combina num único inteiro de 64 bits: um timestamp (deslocado para a esquerda), um identificador de worker/servidor, e um contador de sequência. O resultado é um ID que é simultaneamente único e ordenável cronologicamente — quanto maior o número, mais recente o registo.

Consequência práticaComo o timestamp está embutido no próprio ID, não precisas de consultar nenhuma base de dados para saberes aproximadamente quando uma conta, mensagem ou servidor foi criado — basta descodificar o número.

Como descodificar um snowflake do Discord ou Twitter/X

Resposta curta: Desloca o ID 22 bits para a direita para isolar o timestamp incorporado, depois soma-o ao epoch de referência fixo da plataforma (diferente em cada uma).

O processo, em termos simples, é sempre o mesmo: interpretar o ID como um número inteiro grande, deslocar os seus bits 22 posições para a direita (o que remove os bits reservados para worker ID e sequência), e somar o valor resultante ao epoch de arranque próprio dessa plataforma. A tabela seguinte mostra os dois epochs de referência mais usados:

PlataformaEpoch de referência (ms)Corresponde a
Discord14200704000001 de janeiro de 2015, 00:00 UTC
Twitter/X12888349746574 de novembro de 2010 (lançamento do snowflake)

Como estes números ultrapassam os limites seguros de precisão de um número normal em JavaScript, a operação deve ser feita com aritmética BigInt (ou equivalente noutra linguagem), não com operações numéricas comuns — caso contrário, os bits menos significativos perdem-se e o timestamp resultante fica ligeiramente incorreto. Um descodificador de ID snowflake dedicado trata este cálculo automaticamente: colas o ID, escolhes a plataforma, e recebes a data-hora exata de criação.

Dica: Isto é útil, por exemplo, para estimar quando uma conta suspeita foi criada, ordenar mensagens por antiguidade sem consultar uma API adicional, ou depurar integrações que armazenam apenas o ID e não uma coluna de data separada.

Gerar o epoch de início/fim de dia, mês ou ano para SQL

Resposta curta: Introduz uma data de referência, escolhe o âmbito (dia, mês ou ano) e o fuso horário, e obténs dois valores epoch prontos a usar num filtro BETWEEN.

Um cenário comum em análise de dados: precisas de filtrar todos os registos de uma base de dados que caem dentro de um mês específico, mas a coluna de data está armazenada como epoch (inteiro), não como data legível. Calcular manualmente "epoch do dia 1 às 00:00:00" e "epoch do último dia às 23:59:59" à mão é lento e propenso a erros de fuso horário — especialmente perto da mudança de hora de verão.

Uma mini-ferramenta de intervalo de datas em epoch resolve isto diretamente: escolhes uma data qualquer dentro do período pretendido, selecionas o âmbito (dia / mês / ano) e se queres o cálculo em hora local ou UTC, e recebes imediatamente os dois valores limite, em segundos e em milissegundos, prontos para colar numa cláusula SQL como:

Exemplo ilustrativoWHERE created_at BETWEEN 1748736000 AND 1751327999 — os dois números representam o início e o fim de um mês fictício em segundos epoch UTC.

O erro comum: excluir o último dia de um intervalo

Resposta curta: Se o limite superior do teu filtro for a meia-noite do último dia (00:00:00) em vez do fim desse dia (23:59:59), qualquer registo criado depois da meia-noite mas ainda dentro desse dia fica de fora do relatório.

Este é um erro subtil e frequente: ao construir manualmente um intervalo mensal, é tentador usar "o primeiro dia do mês seguinte às 00:00:00" como limite superior e assumir que está tudo incluído — mas dependendo de como a comparação SQL é feita (< vs. <=), isto pode excluir a última fração de segundo do mês, ou pior, incluir acidentalmente registos do dia seguinte. Gerar explicitamente o epoch de fim de período com a hora 23:59:59 (ou o início do dia seguinte com um operador estritamente menor que) elimina esta ambiguidade.

Este tipo de descuido é particularmente comum em relatórios financeiros ou de auditoria mensais, onde um único registo em falta ou duplicado pode distorcer totais — por isso vale a pena gerar os limites do intervalo com uma ferramenta dedicada em vez de calculá-los de cabeça.

Descodifica IDs snowflake e gera intervalos epoch prontos para SQL — grátis e direto no navegador.

Experimentar o Conversor de timestamp Unix →

Perguntas frequentes

O que é um ID snowflake?
Um ID snowflake é um identificador numérico único usado por plataformas como Discord e Twitter/X, construído de forma a incorporar um timestamp de criação. O timestamp é deslocado 22 bits para a esquerda e combinado com bits adicionais (worker ID, sequência) para garantir unicidade mesmo com milhões de IDs gerados por segundo em servidores distribuídos.
Como extraio a data de criação de um ID do Discord?
Descodifica o ID em binário, desloca 22 bits para a direita (>> 22) para isolar o timestamp incorporado, e soma o resultado ao epoch fixo do Discord (1420070400000 milissegundos, correspondente a 1 de janeiro de 2015). O resultado é o epoch em milissegundos do momento exato em que o ID foi gerado.
O epoch do Twitter/X é igual ao do Discord?
Não. Cada plataforma que usa snowflake IDs define o seu próprio epoch de referência. O Discord usa 1420070400000 (1 de janeiro de 2015), enquanto o Twitter/X usa 1288834974657 (a data de lançamento do seu sistema snowflake, em 2010). É essencial escolher a plataforma certa antes de descodificar, ou a data resultante estará errada.
Como calculo o epoch de início e fim de um mês para uma consulta SQL?
Introduz uma data qualquer desse mês numa ferramenta de intervalo de datas epoch, escolhe o âmbito «mês» e o fuso horário (local ou UTC), e obtém dois valores: o epoch às 00:00:00 do primeiro dia e o epoch às 23:59:59 do último dia. Estes dois valores usam-se diretamente numa cláusula como WHERE created_at BETWEEN inicio AND fim.
Porque é que um filtro SQL por data às vezes exclui registos do último dia?
Isto acontece tipicamente quando o limite superior é calculado como a meia-noite do último dia (00:00:00) em vez do fim desse dia (23:59:59). Qualquer registo criado depois da meia-noite mas dentro do mesmo dia fica de fora. Gerar o epoch de fim de período com a hora 23:59:59 explícita evita este erro comum.

Guias relacionados

Nota: Este artigo tem carácter informativo sobre snowflake IDs e cálculo de intervalos epoch; os valores numéricos e exemplos de consultas SQL apresentados são ilustrativos e devem ser adaptados ao teu esquema de base de dados real.