Trabalho com datas em C# (.NET): ferramentas integradas e bibliotecas populares
Trabalhar com datas e horas é uma das tarefas essenciais em qualquer desenvolvimento sério. No ecossistema C# (.NET), existem tanto tipos integrados poderosos (DateTime, DateTimeOffset, TimeSpan) quanto bibliotecas de terceiros que simplificam operações complexas — como lidar com fusos horários, representação legível para humanos e parsing de formatos não padronizados. Neste artigo, analisaremos detalhadamente as principais ferramentas para trabalhar com datas em C#.
Tipos integrados do .NET
A classe base System.DateTime fornece métodos para criação, comparação, aritmética e formatação de datas. Ela suporta um intervalo de 01/01/0001 a 31/12/9999.
// Criação de dataDateTime now = DateTime.Now; // hora localDateTime utcNow = DateTime.UtcNow; // UTCDateTime specific = new DateTime(2025, 3, 15, 14, 30, 0);
// AritméticaDateTime tomorrow = now.AddDays(1);TimeSpan diff = tomorrow - now;Console.WriteLine(diff.TotalHours); // 24
// Parsingstring dateStr = "2025-12-31";DateTime parsed = DateTime.Parse(dateStr, CultureInfo.InvariantCulture);
// FormataçãoConsole.WriteLine(now.ToString("dd.MM.yyyy HH:mm")); // 15.03.2025 14:30DateTimeOffset é uma versão aprimorada que armazena o deslocamento em relação ao UTC. É recomendado para aplicações que trabalham com diferentes fusos horários.
DateTimeOffset nowOffset = DateTimeOffset.Now;Console.WriteLine(nowOffset.Offset); // +03:00 (depende do sistema)TimeSpan — para representar intervalos de tempo. Ideal para medir a duração de operações.
TimeSpan duration = new TimeSpan(2, 15, 30); // 2 horas 15 minutos 30 segundosConsole.WriteLine(duration.TotalMinutes); // 135.5Biblioteca NodaTime
NodaTime é uma biblioteca alternativa para trabalhar com datas e horas, criada por Jon Skeet (autor de livros sobre C#). Ela resolve muitos problemas do DateTime, como ambiguidade e falta de tipagem forte para zonas horárias.
Instalação via NuGet:
dotnet add package NodaTimeTipos principais:
Instant— um momento no tempo (análogo ao Unix timestamp)LocalDateTime— data+hora sem vínculo com fuso horárioZonedDateTime— data+hora em um fuso horário específicoDurationePeriod— intervalos (análogos ao TimeSpan, mas Period considera unidades de calendário)
using NodaTime;
// Momento atual em UTCInstant now = SystemClock.Instance.GetCurrentInstant();Console.WriteLine(now.ToDateTimeUtc()); // pode ser convertido para DateTime
// Trabalhando com fusos horáriosDateTimeZone tz = DateTimeZoneProviders.Tzdb["Europe/Moscow"];ZonedDateTime moscowTime = now.InZone(tz);Console.WriteLine(moscowTime); // 2025-03-15T17:30:00 Europe/Moscow (+03)
// Period — diferença em unidades de calendárioLocalDate start = new LocalDate(2024, 1, 1);LocalDate end = new LocalDate(2025, 3, 15);Period period = Period.Between(start, end);Console.WriteLine($"Passaram {period.Years} anos, {period.Months} meses, {period.Days} dias");// Passaram 1 anos, 2 meses, 14 diasVantagens do NodaTime: tipagem forte, trabalho correto com fusos horários históricos, suporte a calendários (islâmico, hebraico, etc.), ausência de ambiguidades na mudança de horário.
Biblioteca Humanizer
Humanizer é uma biblioteca para "humanizar" dados, incluindo datas e intervalos. Ela permite exibir datas de forma legível: "ontem", "daqui a 3 horas", "2 dias atrás".
Instalação:
dotnet add package HumanizerExemplos de uso
Também na biblioteca
HikariCP para Java: guia completo com exemplos práticos
Criptografia em Swift: criptografia e hash para iOS/macOS
Trabalho com imagens em Swift: redimensionamento e corte para iOS/macOS
Validação de dados em Go (Golang): bibliotecas, abordagens e exemplos de código
Planejador de tarefas em TypeScript: guia detalhado sobre a biblioteca node-schedule