Descubra se a hora atual cai em um intervalo de tempo

147

Usando o .NET 3.5

Quero determinar se o horário atual cai em um intervalo de tempo.

Até agora eu tenho o tempo atual:

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

Estou pensando em como obter o intervalo de tempo convertido e comparado. Isso funcionaria?

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

UPDATE1: Obrigado a todos por suas sugestões. Eu não estava familiarizado com a função TimeSpan.

John M
fonte
Duplicado: stackoverflow.com/questions/1408165/…
Alfred Myers
3
Você precisa se preocupar em atravessar a meia-noite?
Gjutras
1
cruzando a meia-noite não é uma preocupação, mas nada que se estende da meia-noite é certeza de uma maldição da minha experiência em programação ...
John M

Respostas:

258

Para verificar uma hora do dia, 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 tempos 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
fonte
Como contar o número de correspondências? Por exemplo, quero contar quantos sábados e domingos estão no intervalo.
pbies
@ pmbiesiada: Isso está completamente fora do escopo da pergunta original (e da resposta). Você deve fazer disso uma nova pergunta, mas faça uma pesquisa aqui no SO se algo assim já tiver sido respondido antes. Boa sorte.
precisa saber é o seguinte
1
E se houver um tempo diferente para dias diferentes? É fácil comparar isso? stackoverflow.com/questions/22769557/…
SearchForKnowledge
@SearchForKnowledge: compare para quê? Seja mais específico sobre o que deseja realizar ou dê alguns exemplos.
precisa saber é o seguinte
4
A resposta abaixo deve ser a aceita ... Essa não verifica o TimeSpans durante dias, por exemplo, das 22:00:00 às 02:00:00 ...
FranzHuber23
117

Algumas boas respostas aqui, mas nenhuma abordam o caso do horário de início em um dia diferente do horário de término. Se você precisar ultrapassar o limite do dia, algo como isso pode ajudar:

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

Observe que, neste exemplo, os limites de tempo são inclusivos e que isso ainda assume menos de uma diferença de 24 horas entre starte stop.

usuario
fonte
1
E se houver um tempo diferente para dias diferentes? É fácil comparar isso? stackoverflow.com/questions/22769557/…
SearchForKnowledge
Bom ponto, isso faz sentido. Se o tempo medido passar pela meia-noite, essa seria a única resposta que ainda estaria correta.
Sunsetquest
1
obrigado, depois de horas que eu tentei 11:57 pme funcionou: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut
1
Obrigado por isso. A resposta parece simples, mas é meio complicado de conceituar.
Sam I am diz Restabelecer Monica
Esta é uma ótima resposta. Estou escrevendo um método para determinar se o horário de um determinado horário DateTimeestá dentro do horário comercial especificado. O horário comercial pode ser no mesmo dia, mas também pode durar dois dias (por exemplo, das 15:00 às 01:00 horas de operação).
Drew
17
if (new TimeSpan(11,59,0) <= currentTime.TimeOfDay && new TimeSpan(13,01,0) >=  currentTime.TimeOfDay)
{
   //match found
}

se você realmente deseja analisar uma string em um TimeSpan, pode usar:

    TimeSpan start = TimeSpan.Parse("11:59");
    TimeSpan end = TimeSpan.Parse("13:01");
JDunkerley
fonte
obrigado, depois de horas que eu tentei 11:57 pme funcionou: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut
16

Uma pequena função de extensão simples para isso:

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
fonte
3
Boa adição Andre. Não teria pensado em fazer uma comparação OR para o caso de um dia diferente.
David
3
Grande pequeno pedaço de código, mas com um problema. E se você especificar o mesmo horário de início e término. Uma suposição é que isso pode significar um período de 24 horas, o que significa que sua condição start <= enddeve ser alterada nas verificações start < ende outra suposição pode ser que seja no mesmo dia, mas se for esse o caso, provavelmente falhará se você usa o Now.TimeOfDay, pois inclui milissegundos e faz com que fique fora do intervalo.
Thierry
@ Thierry captura agradável :) Você está convidado a tentar corrigi-lo.
André Snede Kock
14

Tente usar o objeto TimeRange em C # para concluir seu objetivo.

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

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

Aqui é onde eu peguei esse exemplo de uso do TimeRange

stewsha
fonte
12
TimeRange não é uma classe de nenhuma biblioteca C #. É uma classe externa que pode ser baixada no link acima.
perfil completo de Jpsy
6

A TimeOfDaypropriedade retorna um TimeSpanvalor.

Tente o seguinte 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
}

Além disso, new DateTime()é o mesmo que DateTime.MinValuee sempre será igual a 1/1/0001 12:00:00 AM. (Os tipos de valor não podem ter valores padrão não vazios). Você deseja usar DateTime.Now.

SLaks
fonte
2

Você está muito perto, o problema é que você está comparando um DateTime com um TimeOfDay. O que você precisa fazer é adicionar a propriedade .TimeOfDay ao final das suas funções Convert.ToDateTime ().

Michael La Voie
fonte
2

Isso será mais simples para lidar com o caso de limite de dias? :)

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
fonte
0

Usando o Linq, podemos simplificar isso dessa maneira

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