Come posso verificare se l’ora corrente è compresa tra un intervallo di tempo?

Dispongo di un servizio che l’utente può configurare per l’esecuzione durante le ore “non di punta”. Hanno la possibilità di impostare l’intervallo di tempo che il servizio può eseguire.

Per esempio:

L’utente A lavora dalle 8:00 alle 17:00, quindi vogliono programmare l’esecuzione dell’app tra le 17:30 e le 7:30.

L’utente B lavora dalle 9:00 alle 6:00, quindi programmano che l’app venga eseguita tra le 6:30 e le 20:30.

Il punto è che l’app utilizza il proprio computer mentre non lo è.

Dato un DateTime dell’ora corrente, un DateTime dell’inizio e un DateTime dell’ora di fine, come posso verificare se la corrente è tra inizio e fine.

La parte più difficile per me è che il tempo può superare il confine di mezzanotte.

Se startTime e endTime rappresentano un singolo intervallo di tempo (si verificherà solo una volta e startTime e endTime rappresentano la data e l’ora di avvio / arresto), è facile come dire

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

Se si tratta di un evento ricorrente (si verifica ogni giorno, durante un intervallo), è ansible effettuare confronti utilizzando la proprietà TimeOfDay . (Il caso ricorrente è quello in cui devi considerare uno start / stop che attraversa la mezzanotte)

 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: questo codice presuppone che se start == end , quindi copre tutte le volte. Hai fatto un commento a questo effetto su un altro post)

Ad esempio, per verificare se è tra 5 AM e 9:30 PM

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

Se startTime e endTime sono DateTime s, potresti dire

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

Quindi presumo dalla domanda che vuoi sapere se viene data un’ora di inizio e di fine per un giorno (esclusa la data effettiva, cioè 1/1/1900 o qualcosa del genere) per vedere se c’è un altro tempo con il tempo specificato da inizio e fine. Ad esempio, se l’inizio è 9pm e la fine è 9am, accetta 10pm ma rifiuta 10am.

Puoi farlo sia per i tipi di intervallo di tempo (i tempi sono uguali, la fine è dopo l’inizio, la fine è prima dell’avvio) che è semplice:

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

Oppure puoi estendere l'intervallo di inizio e fine in modo tale che la fine sia sempre successiva all'avvio in quanto tale:

 if (end<=start) end += <24 hours> if (time return time<=end 

Suppongo che tu stia salvando l’ora di inizio e di fine nel file di configurazione delle applicazioni, quindi tutto ciò che devi fare è impostare la flag su “on” quando si verifica l’ora di avvio e impostarla su “off” quando si verifica il tempo di arresto.

In questo modo non è necessario controllare costantemente se “ora” è “tra inizio e fine”.

if (corrente> = start && current <= stop)

(o senza =)

Penso che sia tutto ciò di cui hai bisogno?

il confine di mezzanotte è un’aringa rossa: tutto ciò che devi sapere è lo stato di entrambi i confronti.

Se fai cose come gestire i fine settimana in modo diverso, allora hai altra logica, ma il confronto di base è semplice.

 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!!!