switch - Cómo comprobar si un DateTime es más tarde que otro en C#
sentencia switch en c++ (11)
Tengo dos objetos DateTime
: StartDate
y EndDate
. Quiero asegurarme de que StartDate
sea antes de EndDate
. ¿Cómo se hace esto en C #?
Consulte el método DateTime.Compare
Me gustaría demostrar que si convierte a .Fecha, no necesita preocuparse por horas / minutos / segundos, etc.
[Test]
public void ConvertToDateWillHaveTwoDatesEqual()
{
DateTime d1 = new DateTime(2008, 1, 1);
DateTime d2 = new DateTime(2008, 1, 2);
Assert.IsTrue(d1 < d2);
DateTime d3 = new DateTime(2008, 1, 1,7,0,0);
DateTime d4 = new DateTime(2008, 1, 1,10,0,0);
Assert.IsTrue(d3 < d4);
Assert.IsFalse(d3.Date < d4.Date);
}
Probablemente sea demasiado tarde, pero para beneficiar a otras personas que puedan tropezar con esto, utilicé un método de extensión para hacer esto usando IComparable
esta manera:
public static class BetweenExtension
{
public static bool IsBetween<T>(this T value, T min, T max) where T : IComparable
{
return (min.CompareTo(value) <= 0) && (value.CompareTo(max) <= 0);
}
}
El uso de este método de extensión con IComparable
hace que este método sea más genérico y lo hace utilizable con una amplia variedad de tipos de datos y no solo fechas.
Lo usarías así:
DateTime start = new DateTime(2015,1,1);
DateTime end = new DateTime(2015,12,31);
DateTime now = new DateTime(2015,8,20);
if(now.IsBetween(start, end))
{
//Your code here
}
Puede usar los operadores <o> sobrecargados.
Por ejemplo:
DateTime d1 = new DateTime(2008, 1, 1);
DateTime d2 = new DateTime(2008, 1, 2);
if (d1 < d2) { ...
Tenía el mismo requisito, pero al usar la respuesta aceptada, no cumplía todas las pruebas de mi unidad. El problema para mí es cuando tienes un objeto nuevo, con fechas de inicio y finalización y tienes que establecer la fecha de inicio (en esta etapa tu fecha de finalización tiene el valor de fecha mínimo 01/01/0001) - esta solución pasó todo mi unidad prueba:
public DateTime Start
{
get { return _start; }
set
{
if (_end.Equals(DateTime.MinValue))
{
_start = value;
}
else if (value.Date < _end.Date)
{
_start = value;
}
else
{
throw new ArgumentException("Start date must be before the End date.");
}
}
}
public DateTime End
{
get { return _end; }
set
{
if (_start.Equals(DateTime.MinValue))
{
_end = value;
}
else if (value.Date > _start.Date)
{
_end = value;
}
else
{
throw new ArgumentException("End date must be after the Start date.");
}
}
}
Se pierde el caso límite donde las fechas de inicio y finalización pueden ser 01/01/0001 pero no me preocupa eso.
if (new DateTime(5000) > new DateTime(1000))
{
Console.WriteLine("i win");
}
StartDate < EndDate
if (StartDate < EndDate)
// code
si solo quieres las fechas, y no el momento
if (StartDate.Date < EndDate.Date)
// code
if (StartDate>=EndDate)
{
throw new InvalidOperationException("Ack! StartDate is not before EndDate!");
}
if(StartDate < EndDate)
{}
DateTime admite operadores de comparación normales.
if(dateTimeA > dateTimeB) Console.WriteLine("Do your own homework");