Quiero filtrar una matriz de objetos. El objetivo es filtrar los objetos entre dos objetos de intervalo de tiempo:
TimeSpan tsFrom = TimeSpan.Parse("16:00"); TimeSpan tsTo = TimeSpan.Parse("00:59");Por ejemplo, tengo este objeto:
TimeSpan dateObject = TimeSpan.Parse("22:05:22");El problema surge cuando trato de comparar si el objeto de fecha está entre tsFrom y tsTo:
if (dateObject > tsFrom && dateObject < tsTo) { // do something .... }Esto no funcionará para casos como ese. ¿Tienes alguna idea de cómo puedo hacer que esto funcione?
Estás queriendo trabajar con horas del día. El tipo de datos TimeSpan funciona con intervalos de tiempo (algo obvio por decir). Estos son conceptos distintos .
Las horas del día son precisamente lo que motivó la creación del nuevo tipo TimeOnly en .NET 6. Tiene un método IsBetween :
Determina si un tiempo cae dentro del rango provisto. Admite rangos "normales", como 10:00-12:00, y rangos que abarcan la medianoche, como 23:00-01:00.
Tenga en cuenta que IsBetween usa la convención más sensata de inicio inclusivo, final exclusivo, lo que significa que usaría 01:00 como el momento final y no excluiría accidentalmente, por ejemplo 00:59:17 de su período
Para versiones anteriores, le sugiero que se dé cuenta de que si To es menor que From (por ejemplo, representa un período que cruza la medianoche), debe verificar:
if ((tsTo > tsFrom && dateObject >= tsFrom && dateObject < tsTo) || (tsFrom > tsTo && (dateObject < tsTo || dateObject >= tsFrom))) { } Tenga en cuenta, una vez más, que esta lógica supone un origen inclusivo y un From To (su lógica original trató ambos extremos como exclusivos, lo que rara vez es correcto)
El problema con este es que está tratando de usar el método timeSpan de manera incorrecta, si lo hice bien, está tratando de verificar si el tiempo de dateObject se encuentra entre tsFrom y tsTo, el problema es que está tratando de referir a un día diferente con el tsTo, algo que el intervalo de tiempo no puede manejar. Lo arreglé usando dateTime para especificar al menos el día desde el que se toma la hora, sugiero cambiar el código a esto
string datevalue = @"15/03/2021 16:00:00"; DateTime start = DateTime.Parse(datevalue); datevalue = @"16/03/2021 00:59:00"; DateTime end = DateTime.Parse(datevalue); datevalue = @"15/03/2021 22:05:22"; DateTime obj = DateTime.Parse(datevalue); if (obj > start && obj < end) { //Do something }