Trabalho com datas e horas em C#: técnicas avançadas e dicas

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

Trabalho avançado com datas e horas em C#: da teoria aos problemas reais

Trabalhar com datas e horas é uma das tarefas mais comuns e, ao mesmo tempo, traiçoeiras no desenvolvimento. No nível inicial, simplesmente criamos DateTime.Now e o exibimos no console. Mas quando o projeto supera os limites de brinquedo, surgem complexidades: horário de verão, fusos horários diferentes, alta precisão de cálculos ou a necessidade de trabalhar com datas sem fuso horário. Neste artigo, abordaremos técnicas avançadas de trabalho com datas e horas em C# (.NET) que o ajudarão a escrever código confiável e previsível.



1. DateTime, DateTimeOffset e TimeSpan: escolhendo a ferramenta certa

Muitos desenvolvedores usam DateTime por padrão, sem pensar em suas limitações. Em um nível avançado, é importante entender a diferença entre os três tipos principais.



DateTime

Armazena data e hora. Seu principal problema é a ambiguidade. A propriedade Kind (Local, Utc, Unspecified) nem sempre é definida explicitamente, o que leva a erros na serialização ou comparação.



DateTimeOffset

Armazena data, hora e deslocamento em relação ao UTC. Este é o tipo recomendado para armazenar momentos no tempo, pois define inequivocamente um ponto na linha do tempo. Por exemplo, 2025-03-15T14:00:00+03:00 é sempre um momento específico, independentemente do fuso horário do usuário.



TimeSpan

Representa um intervalo de tempo, não um momento específico. Usado para aritmética: diferença entre datas, timeouts, duração de operações.



// Exemplo: DateTime vs DateTimeOffsetDateTime localNow = DateTime.Now; // Kind = LocalDateTime utcNow = DateTime.UtcNow; // Kind = Utc

DateTimeOffset preciseNow = DateTimeOffset.Now; // Sempre com indicação de deslocamento

// Comparação: DateTimeOffset é mais inequívocoConsole.WriteLine(preciseNow.Offset); // +03:00 ou -05:00 etc.


Dica: Para novos projetos, use DateTimeOffset para armazenar momentos no tempo, TimeSpan para intervalos e DateTime apenas quando realmente necessário (por exemplo, para compatibilidade com código legado).



2. Parsing e formatação: como não obter FormatException

O parsing de datas a partir de strings é uma fonte de muitos erros, especialmente se as strings vêm de usuários ou de diferentes culturas.



Parsing dependente de cultura

Use CultureInfo.InvariantCulture para troca interna de dados (por exemplo, JSON, API). Para entrada do usuário, considere a cultura do usuário.



// Parsing considerando a culturastring dateString = "15.03.2025";var ruCulture = new CultureInfo("ru-RU");DateTime parsedDate = DateTime.Parse(dateString, ruCulture);

// Parsing invariante (recomendado para API)string isoString = "2025-03-15T14:00:00Z";DateTimeOffset parsedIso = DateTimeOffset.Parse(isoString, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);


TryParseExact para confiabilidade

Se o formato da string for conhecido, use TryParseExact com especificação explícita do formato. Isso elimina exceções inesperadas.



string input = "2025-03-15 14:30";string format = "yyyy-MM-dd HH:mm";if (DateTime.TryParseExact(input, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result)){    Console.WriteLine($"Sucesso: {result}");}else{    Console.WriteLine("Erro de parsing");}


Formatação personalizada

Os especificadores padrão (d, D, t, T) são bons, mas para controle preciso, use strings de formato personalizadas.



DateTime now = DateTime.Now;Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss.fff")); // 2025-03-15 14:30:45.123Console.WriteLine(now.ToString("dd MMMM yyyy, dddd"));      // 15 de março de 2025, sábado                

Blogs

Book Recommendations