Descobrir se o horário atual cai em um intervalo de tempo

Usando o .NET 3.5

Eu quero determinar se a hora atual cai em um intervalo de tempo.

Até agora eu tenho o tempo atual:

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

Eu estou apagando em como obter o intervalo de tempo convertido e comparado. Isso funcionaria?

 if (Convert.ToDateTime("11:59") = currentTime.TimeOfDay) { //match found } 

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

Para verificar a 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 horários 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 } 

Algumas boas respostas aqui, mas nenhuma cobrem o caso de sua hora de início em um dia diferente do seu tempo final. Se você precisa ultrapassar o limite do dia, algo assim 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 pressupõe menos de uma diferença de 24 horas entre o start e o stop .

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

Se você realmente quer analisar uma string em um TimeSpan, então você pode usar:

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

Tente usar o object TimeRange em C # para concluir seu objective.

 TimeRange timeRange = new TimeRange(); timeRange = TimeRange.Parse("13:00-14:00"); bool IsNowInTheRange = timeRange.IsIn(DateTime.Now.TimeOfDay); Console.Write(IsNowInTheRange); 

Aqui é onde eu tenho esse exemplo de usar TimeRange

Uma pequena function 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; } 

A propriedade TimeOfDay retorna um valor TimeSpan .

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, o new DateTime() é o mesmo que DateTime.MinValue e sempre será igual a 1/1/0001 12:00:00 AM . (Tipos de valor não podem ter valores padrão não vazios) Você deseja usar DateTime.Now .

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 de suas funções Convert.ToDateTime ().

Usando o Linq podemos simplificar isso

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

Isso será mais simples para lidar com o caso do limite do dia? 🙂

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