Analisando Unix Timestamp em C#: de timestamp para DateTime e vice-versa

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: Por que Unix Timestamp não é apenas um número

\n

Todo desenvolvedor que trabalha com APIs, bancos de dados ou logs, mais cedo ou mais tarde, encontra o Unix timestamp. É um número inteiro (ou número de ponto flutuante) que representa a quantidade de segundos decorridos desde 1º de janeiro de 1970, 00:00:00 UTC — a chamada época Unix (Unix epoch).

\n

Mas quando você vê o número 1719878400 na resposta de um servidor, seu cérebro não consegue dizer imediatamente: "Ah, isso é 2 de julho de 2024". Precisamos convertê-lo para um DateTime familiar. E vice-versa — salvar uma data como timestamp para transmissão.

\n

No Stack Overflow, a pergunta "How can I convert a Unix timestamp to DateTime and vice versa?" acumulou centenas de milhares de visualizações. Isso significa que mesmo desenvolvedores C# experientes às vezes se confundem com as nuances. Neste artigo, não vamos apenas fornecer receitas prontas, mas também vamos nos aprofundar: entender como funcionam DateTime, DateTimeOffset, ticks e fusos horários.

\n\n

O que é realmente um Unix Timestamp?

\n

Antes de escrever código, vamos definir os termos. Unix timestamp é a quantidade de segundos (às vezes milissegundos) desde a meia-noite de 1º de janeiro de 1970 UTC. Importante: é um momento absoluto no tempo, independente do fuso horário. É por isso que é tão conveniente usá-lo em sistemas distribuídos.

\n

Em C#, trabalhamos com dois tipos principais:

\n
    \n
  • DateTime — o tipo clássico, que pode estar em UTC ou no horário local (propriedade Kind).
  • \n
  • DateTimeOffset — um tipo mais moderno, que armazena explicitamente o deslocamento do UTC. Recomendado para novos projetos.
  • \n
\n

Internamente, DateTime armazena a quantidade de ticks (intervalos de 100 nanossegundos) desde 1º de janeiro do ano 1. E o Unix timestamp é simplesmente a quantidade de segundos desde 1970. Para passar de um para o outro, precisamos calcular a diferença entre essas duas épocas.

\n\n

Convertendo Unix Timestamp para DateTime (e vice-versa) — métodos básicos

\n

A partir do .NET Framework 4.6 e .NET Core, o C# possui métodos integrados que facilitam a vida. Vamos vê-los.

\n\n

1. De Unix timestamp (segundos) para DateTime

\n

A maneira mais simples é usar DateTimeOffset.FromUnixTimeSeconds(). Ele retorna um DateTimeOffset, que pode ser convertido para DateTime.

\n
long unixTimestamp = 1719878400; // 2 de julho de 2024, 00:00:00 UTC\n\n// Obtém o DateTimeOffset\nDateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(unixTimestamp);\n\n// Converte para DateTime (UTC)\nDateTime utcDateTime = dateTimeOffset.UtcDateTime;\n\nConsole.WriteLine(utcDateTime); // 02.07.2024 0:00:00
\n

Se você precisar do horário local (por exemplo, para exibir ao usuário), use dateTimeOffset.LocalDateTime. Mas tenha cuidado: o horário local depende das configurações do servidor ou computador.

\n\n

2. De DateTime para Unix timestamp

\n

A conversão inversa é feita através do método ToUnixTimeSeconds() do DateTimeOffset.

\n
DateTime utcDateTime = new DateTime(2024, 7, 2, 0, 0, 0, DateTimeKind.Utc);\n\n// Cria um DateTimeOffset com indicação explícita de UTC\nDateTimeOffset dateTimeOffset = new DateTimeOffset(utcDateTime);\n\nlong unixTimestamp = dateTimeOffset.ToUnixTimeSeconds();\n\nConsole.WriteLine(unixTimestamp); // 1719878400
\n

É fundamental: sempre especifique DateTimeKind.Utc ao criar um DateTime que você pretende converter. Se não fizer isso, o DateTimeOffset assumirá que o horário é local e você obterá um timestamp incorreto — com um deslocamento do seu fuso horário.

\n\n

3. Trabalhando com milissegundos

\n

Às vezes, o timestamp é fornecido em milissegundos (por exemplo, do JavaScript). Para isso, ex

Blogs

Book Recommendations