Trabalho com datas em C# (.NET): visão geral completa de bibliotecas e ferramentas integradas
O processamento de datas e horas é uma das tarefas mais comuns no desenvolvimento. No ecossistema C# (.NET), existe tanto uma funcionalidade integrada poderosa (System.DateTime) quanto bibliotecas de terceiros que simplificam cenários complexos: trabalho com fusos horários, formatação, intervalos e análise. Neste artigo, abordaremos as principais ferramentas, incluindo os recursos modernos do .NET 6+ e pacotes NuGet populares.
1. Recursos integrados: DateTime, DateOnly, TimeOnly
A classe base System.DateTime está disponível desde as primeiras versões do .NET. Ela suporta:
- Criação de data:
new DateTime(2025, 3, 15) - Aritmética:
date.AddDays(10),date.AddMonths(-1) - Comparação:
date1 > date2 - Formatação:
date.ToString("yyyy-MM-dd")
A partir do .NET 6, surgiram os tipos DateOnly e TimeOnly — eles não têm vínculo com fuso horário e armazenam apenas data ou apenas hora. Isso é útil para aniversários, horários de trabalho e agendas.
using System;
DateOnly birthday = new DateOnly(1990, 5, 20);TimeOnly alarm = new TimeOnly(7, 30);
Console.WriteLine($"Data: {birthday}, Hora: {alarm}");// Saída: Data: 20.05.1990, Hora: 07:302. TimeSpan — intervalos de tempo
Para trabalhar com intervalos de tempo, usa-se TimeSpan. Ele permite calcular a diferença entre datas, duração de operações e timeouts.
DateTime start = DateTime.Now;// ... execução do código ...DateTime end = DateTime.Now;
TimeSpan elapsed = end - start;Console.WriteLine($"Decorrido: {elapsed.TotalSeconds} seg.");3. Noda Time — trabalho avançado com datas
Noda Time (NuGet: NodaTime) — é uma biblioteca de Jon Skeet (autor de um livro popular sobre C#). Ela resolve problemas do DateTime:
- Separação clara entre "momento no tempo" (
Instant), "data no calendário" (LocalDate) e "hora com fuso" (ZonedDateTime). - Suporte a calendários (islâmico, hebraico, japonês).
- Imutabilidade de todos os tipos.
- Tratamento correto de fusos horários através do banco de dados IANA (tzdata).
using NodaTime;
Instant now = SystemClock.Instance.GetCurrentInstant();DateTimeZone zone = DateTimeZoneProviders.Tzdb["Europe/Moscow"];ZonedDateTime moscowTime = now.InZone(zone);
Console.WriteLine($"Hora atual em Moscou: {moscowTime:yyyy-MM-dd HH:mm}");
// Trabalhando com LocalDateLocalDate today = LocalDate.FromDateTime(DateTime.Today);LocalDate nextWeek = today.PlusDays(7);Noda Time é especialmente útil em projetos onde a precisão dos fusos horários é crítica (logs, reservas, sistemas internacionais).
4. Humanizer — datas legíveis por humanos
Humanizer (NuGet: Humanizer.Core) — biblioteca para converter números, datas e horas em linguagem natural. Ela é capaz de:
- Mostrar tempo relativo: "3 minutos atrás", "em 2 dias".
- Flexionar nomes de meses e dias da semana.
- Formatar intervalos de tempo: "1 hora 30 minutos".
using Humanizer;
DateTime pastDate = DateTime.UtcNow.AddHours(-5);Console.WriteLine(pastDate.Humanize()); // "5 horas atrás"
TimeSpan span = new TimeSpan(2, 45, 0);Console.WriteLine(span.Humanize()); // "2 horas 45 minutos"Humanizer suporta localização (português — Humanizer.Core.pt).
5. FluentDateTime — interface fluente para DateTime
FluentDateTime (NuGet: FluentDateTime) — adiciona métodos de extensão para uma
Também na biblioteca
Geração de PDF em Java: visão geral das bibliotecas iText, Apache PDFBox, OpenPDF
Criação de aplicações CLI em TypeScript: visão geral de frameworks e ferramentas
Spring Boot + Kotlin: Guia Completo com Exemplos para Kotlin