DateTimeRange.cs – Um helper para trabalhar com intervalos de data

By | 9 de fevereiro de 2016

Calendar

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:

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:

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

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *