Olá pessoal! Como vão de carnaval?
Neste post venho compartilhar com vocês uma pequena classe que criei em um projeto para trabalhar com intervalos de datas, facilitando algumas coisas. Segue o código:
?Download DateTimeRange.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | using System; public class DateTimeRange { public DateTime StartDate { get; } public DateTime EndDate { get; } public TimeSpan Duration => EndDate - StartDate; private DateTimeRange(DateTime? startDate, DateTime? endDate) { StartDate = startDate ?? DateTime.MinValue; EndDate = endDate ?? DateTime.MaxValue; } public static DateTimeRange Create(DateTime? startDate = null, DateTime? endDate = null) => new DateTimeRange(startDate, endDate); public bool HasDate(DateTime date) => StartDate <= date && EndDate >= date; public bool HasDate(DateTime? date) => date != null && HasDate(date.Value); public bool HasRange(DateTimeRange range) => HasDate(range.StartDate) || HasDate(range.EndDate) || range.HasDate(StartDate) || range.HasDate(EndDate); public bool HasRange(DateTime? startDate, DateTime? endDate) => HasRange(Create(startDate, endDate)); } |
Alguns exemplos de uso:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var dtInicio = new DateTime(2016, 2, 1); //01/02/2016 var dtFim = new DateTime(2016, 2, 10); //10/02/2016 var data1 = new DateTime(2016, 2, 6); //06/02/2016 var data2 = new DateTime(2016, 2, 15); //15/02/2016 var data3 = new DateTime(2016, 3, 1); //01/03/2016 var range = DateTimeRange.Create(dtInicio, dtFim); //01/02/2016 - 10/02/2016 Console.WriteLine(range.HasDate(data1)); //true Console.WriteLine(range.HasDate(data2)); //false var newRange1 = DateTimeRange.Create(data1, data2); //06/02/2016 - 15/02/2016 var newRange2 = DateTimeRange.Create(data2, data3); //15/02/2016 - 01/03/2016 Console.WriteLine(range.HasRange(newRange1)); //true Console.WriteLine(range.HasRange(newRange2)); //false |
E de brinde no pacote, estes extension methods para facilitar criar o objeto:
?Download DateTimeExtensions.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | using System; public static class DateTimeExtensions { public static DateTimeRange RangeUntil(this DateTime startDate, DateTime? endDate) => DateTimeRange.Create(startDate, endDate); public static DateTimeRange RangeUntil(this DateTime? startDate, DateTime? endDate) => DateTimeRange.Create(startDate, endDate); public static DateTimeRange RangeSince(this DateTime endDate, DateTime? startDate) => DateTimeRange.Create(startDate, endDate); public static DateTimeRange RangeSince(this DateTime? endDate, DateTime? startDate) => DateTimeRange.Create(startDate, endDate); } |
Exemplo de uso:
1 2 | var range1 = DateTime.Now.RangeUntil(DateTime.Now.AddDays(10)); //intervalo entre hoje e daqui a 10 dias var range2 = DateTime.Now.AddDays(10).RangeSince(DateTime.Now); //intervalo entre hoje e daqui a 10 dias |
O projeto está disponível no github: https://github.com/augustoclaro/datetimerange
E também pode ser instalado via Nuget:
Install Package DateTimeRange
Espero que gostem!
Att,
Augusto Claro