Trova se l'ora corrente cade in un intervallo di tempo


147

Utilizzando .NET 3.5

Voglio determinare se l'ora corrente cade in un intervallo di tempo.

Finora ho il tempo corrente:

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

Sto cercando di capire come convertire e confrontare l'intervallo di tempo. Funzionerebbe?

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

AGGIORNAMENTO1: grazie a tutti per i vostri suggerimenti. Non avevo familiarità con la funzione TimeSpan.



3
Devi preoccuparti di attraversare la mezzanotte?
Gjutras,

1
attraversare la mezzanotte non è un problema, ma tutto ciò che attraversa la mezzanotte è sicuramente una rovina della mia esperienza di programmazione ...
John M

Risposte:


258

Per verificare l'ora del giorno, utilizzare:

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
}

Per tempi assoluti usare:

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
}

Come contare il numero di partite? Ad esempio, voglio contare quanti sabato e domenica sono compresi nell'intervallo.
pbies,

@pmbiesiada: questo è completamente fuori dall'ambito della domanda originale (e della risposta). Dovresti fare di questo una nuova domanda, ma fai un serach qui su SO se qualcosa di simile ha già ricevuto una risposta. In bocca al lupo.
Frank Bollack,

1
E se ci fossero tempi diversi per giorni diversi? Esiste un modo semplice per confrontarlo? stackoverflow.com/questions/22769557/…
SearchForKnowledge

@SearchForKnowledge: confronta per cosa? Si prega di essere più specifici su ciò che si desidera realizzare o fornire alcuni esempi.
Frank Bollack,

4
La risposta qui sotto dovrebbe essere quella accettata ... Questa non controlla i TimeSpan per giorni, ad es. Dalle 22:00:00 alle 02:00:00 ...
FranzHuber23,

118

Alcune buone risposte qui, ma nessuna copre il caso in cui l'ora di inizio sia in un giorno diverso dall'ora di fine. Se hai bisogno di scavalcare il confine del giorno, qualcosa di simile potrebbe aiutare:

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

Si noti che in questo esempio i limiti di tempo sono inclusivi e che ciò presuppone ancora una differenza inferiore a 24 ore tra starte stop.


1
E se ci fossero tempi diversi per giorni diversi? Esiste un modo semplice per confrontarlo? stackoverflow.com/questions/22769557/…
SearchForKnowledge

Buon punto, ha senso. Se il tempo misurato passa attraverso la mezzanotte, questa sarebbe l'unica risposta che sarebbe comunque corretta.
Sunsetquest

1
grazie, dopo ore ho provato 11:57 pme questo ha funzionato: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut

1
Grazie per questo. La risposta sembra semplice da trovare, ma è un po 'scomodo concettualizzare.
Sam, sono io, dice Reinstate Monica, il

Questa è un'ottima risposta Sto scrivendo un metodo per determinare se il tempo di un dato DateTimerientra in determinate ore lavorative. L'orario di lavoro potrebbe essere lo stesso giorno, ma potrebbero anche durare due giorni (ad esempio, dalle 15:00 all'01: 00 ore di funzionamento).
Ha

17
if (new TimeSpan(11,59,0) <= currentTime.TimeOfDay && new TimeSpan(13,01,0) >=  currentTime.TimeOfDay)
{
   //match found
}

se vuoi davvero analizzare una stringa in un TimeSpan, puoi usare:

    TimeSpan start = TimeSpan.Parse("11:59");
    TimeSpan end = TimeSpan.Parse("13:01");

grazie, dopo ore ho provato 11:57 pme questo ha funzionato: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut

16

Una semplice piccola funzione di estensione per questo:

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;
}

3
Buona aggiunta Andre. Non avrei pensato di fare un confronto OR per il caso del giorno diverso.
David,

3
Grande piccolo pezzo di codice ma un problema con esso. Che cosa succede se si specifica lo stesso orario di inizio e fine. Un'ipotesi è che, potrebbe significare che dovrebbe estendersi per un periodo di 24 ore, il che significa che la tua condizione in cui start <= enddovrebbero essere cambiati i controlli start < ende un'altra ipotesi potrebbe essere che è nello stesso giorno, ma se questo è il caso, probabilmente fallirà se utilizzi Now.TimeOfDay in quanto include millisecondi e fa sì che non sia compreso nell'intervallo.
Thierry,

@Thierry Nice catch :) Puoi provare a risolverlo.
André Snede Kock,

14

Prova a utilizzare l'oggetto TimeRange in C # per completare il tuo obiettivo.

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

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

Ecco dove ho preso quell'esempio dell'utilizzo di TimeRange


12
TimeRange non è una classe di nessuna libreria C #. È una classe esterna che può essere scaricata al link sopra.
Jpsy,

6

La TimeOfDayproprietà restituisce un TimeSpanvalore.

Prova il seguente codice:

TimeSpan time = DateTime.Now.TimeOfDay;

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

Inoltre, new DateTime()è uguale DateTime.MinValuee sarà sempre uguale a 1/1/0001 12:00:00 AM. (I tipi di valore non possono avere valori predefiniti non vuoti) Si desidera utilizzare DateTime.Now.


2

Sei molto vicino, il problema è che stai confrontando un DateTime con un TimeOfDay. Quello che devi fare è aggiungere la proprietà .TimeOfDay alla fine delle tue funzioni Convert.ToDateTime ().


2

Sarà più semplice gestire il caso limite giornaliero? :)

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 ... 
}

0

Usando Linq possiamo semplificarlo in questo modo

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

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");
        }

    }
 }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.