obtener - Cómo saber si un DateTime se encuentra entre un DateRange en C#
obtener la fecha de un datetimepicker en vb net (5)
Necesito saber si una Fecha se encuentra entre un DateRange. Tengo tres fechas:
// The date range
DateTime startDate;
DateTime endDate;
DateTime dateToCheck;
La solución fácil es hacer una comparación, pero ¿hay alguna forma más inteligente de hacerlo?
Gracias por adelantado.
He encontrado que la siguiente biblioteca es la más útil al hacer cualquier tipo de cálculo de fecha. Todavía estoy sorprendido de que nada de esto sea parte del framework .Net.
http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET
No, hacer una comparación simple me parece bien:
return dateToCheck >= startDate && dateToCheck < endDate;
Cosas para pensar sin embargo:
-
DateTime
es un tipo algo extraño en términos de zonas horarias. Podría ser UTC, podría ser "local", podría ser ambiguo. Asegúrate de que estás comparando manzanas con manzanas, por así decirlo. - Considere si sus puntos de inicio y fin deben ser inclusivos o exclusivos. He hecho que el código anterior lo trate como un límite inferior inclusivo y un límite superior exclusivo.
Puede usar métodos de extensión para que sea un poco más legible:
public static class DateTimeExtensions
{
public static bool InRange(this DateTime dateToCheck, DateTime startDate, DateTime endDate)
{
return dateToCheck >= startDate && dateToCheck < endDate;
}
}
Ahora puedes escribir:
dateToCheck.InRange(startDate, endDate)
Puedes usar:
return (dateTocheck >= startDate && dateToCheck <= endDate);
Usualmente creo la implementación de Fowler''s Range para tales cosas.
public interface IRange<T>
{
T Start { get; }
T End { get; }
bool Includes(T value);
bool Includes(IRange<T> range);
}
public class DateRange : IRange<DateTime>
{
public DateRange(DateTime start, DateTime end)
{
Start = start;
End = end;
}
public DateTime Start { get; private set; }
public DateTime End { get; private set; }
public bool Includes(DateTime value)
{
return (Start <= value) && (value <= End);
}
public bool Includes(IRange<DateTime> range)
{
return (Start <= range.Start) && (range.End <= End);
}
}
El uso es bastante simple:
DateRange range = new DateRange(startDate, endDate);
range.Includes(date)