2009-02-26 11 views
21

Tengo un servicio que el usuario puede configurar para funcionar durante las horas "fuera del horario punta". Tienen la capacidad de establecer el marco de tiempo que el servicio puede ejecutar.¿Cómo puedo verificar si la hora actual es entre en un marco de tiempo?

Por ejemplo:

Un usuario trabaja 8 5pm, de modo que desea programar la aplicación para funcionar 17:30-7:30 am.

El usuario B trabaja de 9 p.m. a 6 a.m., por lo que programan la aplicación para que se ejecute entre las 6:30 a.m. y las 8:30 p.m.

El punto es que la aplicación usa su computadora mientras que no lo son.

Dado un DateTime de la hora actual, un DateTime del inicio y un DateTime del tiempo de paro, ¿cómo puedo verificar si la corriente está entre el inicio y la parada?

La parte difícil para mí es que el tiempo puede cruzar el límite de la medianoche.

Respuesta

44

Si startTime y endTime representan un único intervalo de tiempo (que sólo ocurrirá una vez, y startTime y endTime representan la fecha y la hora de inicio/parada), entonces es tan fácil como decir

bool isTimeBetween = someTime >= startTime && someTime <= endTime; 

Si es un evento recurrente (ocurre todos los días, durante algún intervalo), puede hacer comparaciones usando la propiedad TimeOfDay. (El caso recurrente es aquel en el que usted tiene que considerar un arranque/parada que cruza la medianoche)

static public bool IsTimeOfDayBetween(DateTime time, 
             TimeSpan startTime, TimeSpan endTime) 
{ 
    if (endTime == startTime) 
    { 
     return true; 
    } 
    else if (endTime < startTime) 
    { 
     return time.TimeOfDay <= endTime || 
      time.TimeOfDay >= startTime; 
    } 
    else 
    { 
     return time.TimeOfDay >= startTime && 
      time.TimeOfDay <= endTime; 
    } 

} 

(Nota: Este código se supone que si start == end, a continuación, se cubre todo momento Usted ha hecho un comentario a este efecto. en otro post)

Por ejemplo, para comprobar si se trata de 05 a.m.-09:30 PM

IsTimeOfDayBetween(someTime, new TimeSpan(5, 0, 0), new TimeSpan(21, 30, 0)) 

Si startTime y endTime son DateTime s, se podría decir

IsTimeOfDayBetween(someTime, startTime.TimeOfDay, endTime.TimeOfDay) 
+0

starttime y tiempo final son de fecha y hora también, no lapso de tiempo – scottm

+0

En mi @scotty aplicación – scottm

+0

- derecho, entiendo ahora:] he proporcionado una examp para mostrar cómo se puede hacer eso (el segundo) –

1

Supongo que está guardando las horas de inicio y finalización en el archivo de configuración de aplicaciones, por lo que todo lo que tiene que hacer es configurar su aplicación para marcar "on" cuando se produce la "hora de inicio" y ajústelo en "off" cuando ocurre el tiempo de parada.

De esta manera no tiene que estar constantemente comprobando si "ahora" es "entre el inicio y el final" veces.

+0

El usuario establece la hora de encendido y apagado en un archivo de configuración. Ingresan algo así como "inicio: 8:00 pm; fin: 6: 00am". La aplicación es un servicio que se ejecuta todo el tiempo, en las computadoras de algunos usuarios, ingresarán de 8:00 a.m. a 8:00 a.m. indicando que tiene todas las 24 horas del día disponibles en ese sistema. – scottm

+0

Exactamente, y dado que el servicio se está ejecutando todo el tiempo, solo tiene que activarse a las 8 p.m. ... luego procesar cosas si está "encendido" ... a las 6 a.m. se apaga (establece una marca) . Por lo tanto, no hay necesidad de la matemática "entre". –

0

si (actual> = empezar & & actual < = parada)

(o sin =)

creo que es todo lo que necesita?

el límite de la medianoche es una pista falsa: todo lo que necesita saber es el estado de las dos comparaciones.

Si hace cosas como manejar los fines de semana de manera diferente, entonces tiene otra lógica, pero la comparación básica es simple.

2

Así que supongo que a partir de la pregunta que desea saber si se da una hora de inicio y finalización de un día (sin incluir la fecha real, es decir, 1/1/1900 o algo así) para ver si en otro momento es con el tiempo especificado por inicio y fin. Por ejemplo, si el inicio es a las 9 p.m. y el final es a las 9 a.m., acepte las 10 p.m. pero rechace las 10 a.m.

Esto se puede hacer ya sea por tiempo tipos de rango (tiempos son iguales, el extremo está después del inicio, final es antes del inicio), que es simple:

if (end==start) return true 
else if (end>start) return start<=time && time<=end 
else return !(time>end && time<start) 

O puede extender el rango de inicio y fin, tales ese fin es siempre después de la puesta como tal:

if (end<=start) end += <24 hours> 
if (time<start) time+= <24 hours> 
return time<=end 
-1
DateTime t1; 
t1 = DateTime.Now; 

// loop inbetween start and end time  

if (t1>=start_time &&t1<=end_time) 

{ 
    //your code/action 
} 

//if you are using sql to get values 

start_time = Convert.ToDateTime(row.Cells[10].Text); 
end_time = Convert.ToDateTime(row.Cells[11].Text); 
//convert them to string or you will get some error!!! 
Cuestiones relacionadas