Introdução: Por que trabalhar com datas e horas em C# é essencial para qualquer desenvolvedor
Todo desenvolvedor C# mais cedo ou mais tarde se depara com a necessidade de processar datas e horas. Seja para registro de eventos, cálculo de prazos em uma aplicação de negócios ou simplesmente exibir a data atual na tela — não há como evitar o domínio de DateTime e TimeSpan. Neste artigo, abordaremos todos os aspectos principais: desde a criação de objetos até o trabalho com fusos horários e desempenho. O material é adequado tanto para iniciantes quanto para programadores experientes que desejam sistematizar seus conhecimentos.
Tipos principais para trabalhar com data e hora no .NET
No .NET, existem vários tipos, cada um resolvendo uma tarefa específica. Vamos analisar os principais.
DateTime — a base de tudo
DateTime é uma estrutura que representa um momento no tempo (data e hora). Ela suporta um intervalo de 01/01/0001 a 31/12/9999. É possível criar um objeto de várias maneiras:
// Data e hora atuaisDateTime now = DateTime.Now;// Data e hora atuais em UTCDateTime utcNow = DateTime.UtcNow;// Data específicaDateTime specificDate = new DateTime(2025, 3, 15);// Data e hora com precisão de segundosDateTime withTime = new DateTime(2025, 3, 15, 14, 30, 0);// Data de hoje (hora 00:00:00)DateTime today = DateTime.Today;TimeSpan — intervalos de tempo
TimeSpan representa um intervalo de tempo (a diferença entre duas datas). É útil para calcular a duração de operações:
// Criando um intervaloTimeSpan interval = new TimeSpan(2, 5, 30); // 2 horas, 5 minutos, 30 segundos// Diferença entre datasDateTime start = DateTime.Now;System.Threading.Thread.Sleep(1000); // simulação de trabalhoDateTime end = DateTime.Now;TimeSpan duration = end - start;Console.WriteLine($"Passaram {duration.TotalSeconds} segundos");DateTimeOffset — data com fuso horário
Para aplicações modernas que trabalham com usuários de diferentes regiões, o DateTimeOffset é crucial. Ele armazena data e hora juntamente com o deslocamento do UTC:
// Hora atual com deslocamento localDateTimeOffset localOffset = DateTimeOffset.Now;// Hora com deslocamento específicoDateTimeOffset customOffset = new DateTimeOffset(2025, 3, 15, 12, 0, 0, TimeSpan.FromHours(3));// Conversão para UTCDateTime utc = localOffset.UtcDateTime;Formatação e parsing de datas
A exibição correta de datas para o usuário e a leitura de dados a partir de strings são habilidades obrigatórias.
Formatação: ToString() e padrões personalizados
O método ToString() aceita uma string de formato. Os formatos padrão mais populares são:
"d"— data curta (15/03/2025)"D"— data completa (15 de março de 2025)"t"— hora curta (14:30)"T"— hora completa (14:30:00)"g"— formato geral data/hora (15/03/2025 14:30)
Exemplos de formatação personalizada:
DateTime dt = new DateTime(2025, 3, 15, 14, 30, 45);Console.WriteLine(dt.ToString("yyyy-MM-dd")); // 2025-03-15Console.WriteLine(dt.ToString("dd.MM.yyyy HH:mm")); // 15.03.2025 14:30Console.WriteLine(dt.ToString("dddd, MMMM yyyy")); // sábado, março 2025 (depende da cultura)Parsing: convertendo string em data
Para um parsing confiável, use DateTime.TryParse ou DateTime.ParseExact:
string dateString = "15.03.2025";if (DateTime.TryParse(dateString, out DateTime result)){ Console.WriteLine($"Sucesso: {result}");}else{ Console.WriteLine("Erro de parsing");}
// Parsing exato com especificação de formatostring exactString = "2025-03-15 14:30:00";DateTime parsed = DateTime.ParseExact(exactString, "yyyy-MM-dd HH:mm