Trabalhando com datas em C# (.NET): de ferramentas nativas a bibliotecas especializadas
Trabalhar com datas e horas é uma das tarefas principais no desenvolvimento de qualquer aplicação: desde serviços web até utilitários de desktop. A plataforma .NET fornece ferramentas nativas poderosas, como DateTime, DateTimeOffset e TimeSpan. No entanto, em cenários complexos (trabalho com fusos horários, intervalos legíveis por humanos, análise de formatos não padronizados), os desenvolvedores frequentemente recorrem a bibliotecas de terceiros. Neste artigo, vamos explorar as principais ferramentas para trabalhar com datas em C#.
1. Ferramentas nativas do .NET
Tipos básicos para trabalhar com datas no .NET:
DateTime— representa um momento no tempo (data + hora). Suporta operações de adição, subtração e comparação.DateTimeOffset— análogo ao DateTime, mas com indicação explícita do deslocamento em relação ao UTC. Recomendado para armazenar datas em sistemas distribuídos.TimeSpan— intervalo de tempo (por exemplo, 2 horas e 30 minutos).DateOnlyeTimeOnly(a partir do .NET 6) — para armazenamento separado de data e hora sem dados extras.
Exemplo de uso do DateTime:
using System;
DateTime now = DateTime.Now;DateTime utcNow = DateTime.UtcNow;DateTime specificDate = new DateTime(2025, 3, 15, 14, 30, 0);
// Formataçãostring formatted = now.ToString("dd.MM.yyyy HH:mm:ss");Console.WriteLine(formatted); // 15.03.2025 14:30:00
// AritméticaDateTime tomorrow = now.AddDays(1);TimeSpan diff = tomorrow - now;Console.WriteLine($"Até amanhã: {diff.TotalHours} horas");Análise de datas a partir de strings:
string dateStr = "2025-03-15";if (DateTime.TryParse(dateStr, out DateTime result)){ Console.WriteLine(result.ToShortDateString());}
// Análise com especificação de culturavar culture = new System.Globalization.CultureInfo("ru-RU");DateTime parsed = DateTime.Parse("15 de março de 2025", culture);2. Noda Time — trabalho avançado com datas e horas
Noda Time — uma biblioteca alternativa da comunidade, criada para eliminar as deficiências do DateTime nativo. Principais características:
- Separação clara de conceitos: Instant (momento em UTC), LocalDateTime (data+hora sem vínculo com fuso), ZonedDateTime (com fuso horário).
- Suporte completo a fusos horários através do banco de dados IANA (Olson).
- Tipos imutáveis (immutable) — seguros em código multi-thread.
- Intervalos legíveis por humanos (
Period): 2 anos, 3 meses, 5 dias.
Exemplo de trabalho com Noda Time:
using NodaTime;using NodaTime.Text;
// Momento atual em UTCInstant now = SystemClock.Instance.GetCurrentInstant();Console.WriteLine($"Instant: {now}");
// Conversão para hora local com fuso horárioDateTimeZone zone = DateTimeZoneProviders.Tzdb["Europe/Moscow"];ZonedDateTime moscowTime = now.InZone(zone);Console.WriteLine($"Hora em Moscou: {moscowTime}");
// Análise de data em formato específicovar pattern = LocalDatePattern.CreateWithInvariantCulture("yyyy-MM-dd");LocalDate date = pattern.Parse("2025-03-15").Value;Console.WriteLine(date); // 15 de março de 2025
// Trabalho com períodosLocalDate start = new LocalDate(2025, 1, 1);LocalDate end = new LocalDate(2025, 12, 31);Period period = Period.Between(start, end, PeriodUnits.Days);Console.WriteLine($"Dias entre as datas: {period.Days}");3. Humanizer — datas e intervalos legíveis por humanos
Humanizer — biblioteca para converter números, datas e strings em um formato amigável para humanos. No contexto de datas,
Também na biblioteca
ORM para Rust: comparação entre Diesel, SeaORM, SQLx e exemplos de código
Cacheamento em C++: biblioteca Cache++
Serialização de objetos em Java: guia completo para iniciantes
Monitoramento de aplicações C# (.NET) com AppMetrics