Encuentre si la hora actual cae en un rango de tiempo

147

Usando .NET 3.5

Quiero determinar si la hora actual cae en un rango de tiempo.

Hasta ahora tengo el tiempo actual:

DateTime currentTime = new DateTime();
currentTime.TimeOfDay;

Estoy explicando cómo convertir y comparar el rango de tiempo. ¿Funcionaría esto?

if (Convert.ToDateTime("11:59") <= currentTime.TimeOfDay 
    && Convert.ToDateTime("13:01") >= currentTime.TimeOfDay)
{
   //match found
}

ACTUALIZACIÓN1: Gracias a todos por sus sugerencias. No estaba familiarizado con la función TimeSpan.

John M
fuente
Duplicado: stackoverflow.com/questions/1408165/…
Alfred Myers
3
¿Necesitas preocuparte por cruzar la medianoche?
gjutras 01 de
1
cruzar la medianoche no es una preocupación, pero nada de lo que incluye la medianoche es seguro que una pesadilla de mi experiencia en programación ...
John M

Respuestas:

258

Para verificar la hora del día, use:

TimeSpan start = new TimeSpan(10, 0, 0); //10 o'clock
TimeSpan end = new TimeSpan(12, 0, 0); //12 o'clock
TimeSpan now = DateTime.Now.TimeOfDay;

if ((now > start) && (now < end))
{
   //match found
}

Para tiempos absolutos use:

DateTime start = new DateTime(2009, 12, 9, 10, 0, 0)); //10 o'clock
DateTime end = new DateTime(2009, 12, 10, 12, 0, 0)); //12 o'clock
DateTime now = DateTime.Now;

if ((now > start) && (now < end))
{
   //match found
}
Frank Bollack
fuente
¿Cómo contar el número de partidos? Por ejemplo, quiero contar cuántos sábados y domingos hay en el rango.
pbies
@pmbiesiada: Esto está completamente fuera del alcance de la pregunta original (y la respuesta). Debería hacer esta una nueva pregunta, pero haga un serach aquí en SO si algo así ha sido respondido anteriormente. Buena suerte.
Frank Bollack
1
¿Qué pasa si hay diferentes horarios para diferentes días? ¿Hay alguna manera fácil de comparar eso? stackoverflow.com/questions/22769557/…
SearchForKnowledge
@SearchForKnowledge: ¿Comparar para qué? Sea más específico sobre lo que desea lograr o dé algunos ejemplos.
Frank Bollack
44
La respuesta a continuación debe ser la aceptada ... Esta no verifica los TimeSpans durante días, por ejemplo, de 22:00:00 a 02:00:00 ...
FranzHuber23
118

Algunas buenas respuestas aquí, pero ninguna cubren el caso de que su hora de inicio esté en un día diferente a su hora de finalización. Si necesita montar el límite del día, algo como esto puede ayudar:

TimeSpan start = TimeSpan.Parse("22:00"); // 10 PM
TimeSpan end = TimeSpan.Parse("02:00");   // 2 AM
TimeSpan now = DateTime.Now.TimeOfDay;

if (start <= end)
{
    // start and stop times are in the same day
    if (now >= start && now <= end)
    {
        // current time is between start and stop
    }
}
else
{
    // start and stop times are in different days
    if (now >= start || now <= end)
    {
       // current time is between start and stop
    }
}

Tenga en cuenta que en este ejemplo los límites de tiempo son inclusivos y que esto todavía supone una diferencia de menos de 24 horas entre starty stop.

Mella
fuente
1
¿Qué pasa si hay diferentes horarios para diferentes días? ¿Hay alguna manera fácil de comparar eso? stackoverflow.com/questions/22769557/…
SearchForKnowledge
Buen punto, eso tiene sentido. Si el tiempo medido pasa hasta la medianoche, entonces esta sería la única respuesta que aún sería correcta.
Sunsetquest
1
gracias, después de las horas que intenté 11:57 pmy esto funcionó: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut
1
Gracias por eso. La respuesta parece simple, pero es un poco incómodo conceptualizarla.
Soy Sam, dice Reinstate Monica
Esta es una respuesta genial. Estoy escribiendo un método para determinar si el tiempo de un determinado DateTimecae dentro de las horas hábiles especificadas. El horario comercial podría ser el mismo día, pero también podría abarcar dos días (por ejemplo, 3pm - 1am horas de operación).
Dibujó el
17
if (new TimeSpan(11,59,0) <= currentTime.TimeOfDay && new TimeSpan(13,01,0) >=  currentTime.TimeOfDay)
{
   //match found
}

si realmente desea analizar una cadena en un TimeSpan, puede usar:

    TimeSpan start = TimeSpan.Parse("11:59");
    TimeSpan end = TimeSpan.Parse("13:01");
JDunkerley
fuente
gracias, después de las horas que intenté 11:57 pmy esto funcionó: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut
16

Una pequeña función de extensión simple para esto:

public static bool IsBetween(this DateTime now, TimeSpan start, TimeSpan end)
{
    var time = now.TimeOfDay;
    // If the start time and the end time is in the same day.
    if (start <= end)
        return time >= start && time <= end;
    // The start time and end time is on different days.
    return time >= start || time <= end;
}
André Snede Kock
fuente
3
Buena adición Andre. No hubiera pensado hacer una comparación OR para el caso de día diferente.
David
3
Gran código pequeño pero un problema con él. ¿Qué sucede si especifica la misma hora de inicio y finalización? Una suposición es que, puede significar que debe extenderse durante un período de 24 horas, lo que significa que su condición a la que se start <= enddeben cambiar los controles start < endy otra suposición podría ser que es el mismo día, pero si este es el caso, es probable que falle si usa Now.TimeOfDay ya que incluye milisegundos y hace que esté fuera de rango.
Thierry
@Thierry Nice catch :) Puedes intentar solucionarlo.
André Snede Kock
14

Intente usar el objeto TimeRange en C # para completar su objetivo.

TimeRange timeRange = new TimeRange();
timeRange = TimeRange.Parse("13:00-14:00");

bool IsNowInTheRange = timeRange.IsIn(DateTime.Now.TimeOfDay);
Console.Write(IsNowInTheRange);

Aquí es donde obtuve ese ejemplo de uso de TimeRange

stewsha
fuente
12
TimeRange no es una clase de ninguna biblioteca de C #. Es una clase externa que se puede descargar en el enlace de arriba.
Jpsy
6

La TimeOfDaypropiedad devuelve un TimeSpanvalor.

Prueba el siguiente código:

TimeSpan time = DateTime.Now.TimeOfDay;

if (time > new TimeSpan(11, 59, 00)        //Hours, Minutes, Seconds
 && time < new TimeSpan(13, 01, 00)) {
    //match found
}

Además, new DateTime()es igual DateTime.MinValuey siempre será igual a 1/1/0001 12:00:00 AM. (Los tipos de valor no pueden tener valores predeterminados no vacíos) que desee usar DateTime.Now.

SLaks
fuente
2

Estás muy cerca, el problema es que estás comparando un DateTime con un TimeOfDay. Lo que debe hacer es agregar la propiedad .TimeOfDay al final de sus funciones Convert.ToDateTime ().

Michael La Voie
fuente
2

¿Será esto más sencillo para manejar el caso límite del día? :)

TimeSpan start = TimeSpan.Parse("22:00");  // 10 PM
TimeSpan end = TimeSpan.Parse("02:00");    // 2 AM
TimeSpan now = DateTime.Now.TimeOfDay;

bool bMatched = now.TimeOfDay >= start.TimeOfDay &&
                now.TimeOfDay < end.TimeOfDay;
// Handle the boundary case of switching the day across mid-night
if (end < start)
    bMatched = !bMatched;

if(bMatched)
{
    // match found, current time is between start and end
}
else
{
    // otherwise ... 
}
Elliott
fuente
0

Usando Linq podemos simplificar esto con esto

 Enumerable.Range(0, (int)(to - from).TotalHours + 1)
            .Select(i => from.AddHours(i)).Where(date => date.TimeOfDay >= new TimeSpan(8, 0, 0) && date.TimeOfDay <= new TimeSpan(18, 0, 0))
Edu Cielo
fuente
0
 using System;

 public class Program
 {
    public static void Main()
    {
        TimeSpan t=new TimeSpan(20,00,00);//Time to check

        TimeSpan start = new TimeSpan(20, 0, 0); //8 o'clock evening

        TimeSpan end = new TimeSpan(08, 0, 0); //8 o'clock Morning

        if ((start>=end && (t<end ||t>=start))||(start<end && (t>=start && t<end)))
        {
           Console.WriteLine("Mached");
        }
        else
        {
            Console.WriteLine("Not Mached");
        }

    }
 }
Patel Vishal
fuente