192

Using .NET 3.5

I want to determine if the current time falls in a time range.

So far I have the currentime:

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

I'm blanking out on how to get the time range converted and compared. Would this work?

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

UPDATE1: Thanks everyone for your suggestions. I wasn't familiar with the TimeSpan function.

John Saunders
  • 160,644
  • 26
  • 247
  • 397
John M
  • 14,338
  • 29
  • 91
  • 143

12 Answers12

320

For checking for a time of day 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
}

For absolute times 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
  • 24,478
  • 5
  • 49
  • 58
167

Some good answers here but none cover the case of your start time being in a different day than your end time. If you need to straddle the day boundary, then something like this may help:

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

Note that in this example the time boundaries are inclusive and that this still assumes less than a 24-hour difference between start and stop.

Nick
  • 3,722
  • 2
  • 26
  • 17
  • 1
    What if there are different time for different days? Is there a easy to compare that? http://stackoverflow.com/questions/22769557/how-to-compare-current-time-against-time-of-day – SearchForKnowledge Mar 31 '14 at 18:53
  • Good point, that makes sense. If the measured time passes through midnight then this would be the only answer that would still be correct. – SunsetQuest Mar 06 '15 at 04:45
  • 1
    thank you, after hours i tried for `11:57 pm` and this worked: `TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);` – Shaiju T Sep 01 '15 at 08:59
  • 2
    Thank you for that. The answer seems simple to come to, but it's kinda awkward to conceptualize. – Sam I am says Reinstate Monica Feb 18 '16 at 00:19
  • This is a great answer. I'm writing a method to determine whether the time of a given `DateTime` falls within specified business hours. Business hours could be on the same day, but they could also span two days (e.g., 3pm - 1am operating hours). – Drew Jan 20 '18 at 03:23
  • This post should be marked as the answer as it has 24h cycle completeness – wassx Sep 20 '22 at 19:27
27

A simple little extension function for this:

public static bool IsBetween(this DateTime now, TimeSpan start, TimeSpan end)
{
    var time = now.TimeOfDay;
    // Scenario 1: If the start time and the end time are in the same day.
    if (start <= end)
        return time >= start && time <= end;
    // Scenario 2: The start time and end time is on different days.
    return time >= start || time <= end;
}
André Snede
  • 9,899
  • 7
  • 43
  • 67
  • 3
    Good addition Andre. Wouldn't have thought to do an OR comparison for the different day case. – David Dec 10 '16 at 23:33
  • 7
    Great little piece of code but one problem with it. What if you specify the same start and end time. One assumption is that, it may mean it should span over a 24 hour period which means your condition which checks `start <= end` should be change to `start < end` and another assumption might be that it is on the same day but if this is the case, it will likely fail if you use Now.TimeOfDay as it includes milliseconds and causes to be out of range. – Thierry Mar 06 '18 at 15:51
  • @Thierry Nice catch :) You are welcome to try and fix it. – André Snede Mar 06 '18 at 16:00
  • 1
    Another variation to consider is changing the two `time <= end` to `time < end`. – HappyNomad Aug 11 '21 at 09:32
18
if (new TimeSpan(11,59,0) <= currentTime.TimeOfDay && new TimeSpan(13,01,0) >=  currentTime.TimeOfDay)
{
   //match found
}

if you really want to parse a string into a TimeSpan, then you can use:

    TimeSpan start = TimeSpan.Parse("11:59");
    TimeSpan end = TimeSpan.Parse("13:01");
JDunkerley
  • 12,355
  • 5
  • 41
  • 45
  • thank you, after hours i tried for `11:57 pm` and this worked: `TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);` – Shaiju T Sep 01 '15 at 08:59
16

Try using the TimeRange object in C# to complete your goal.

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

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

Here is where I got that example of using TimeRange

stewsha
  • 1,829
  • 2
  • 13
  • 16
  • 16
    TimeRange is not a class from any C# library. It is an external class that can be downloaded at the link above. – Jpsy Jan 19 '12 at 10:45
9

The TimeOfDay property returns a TimeSpan value.

Try the following code:

TimeSpan time = DateTime.Now.TimeOfDay;

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

Also, new DateTime() is the same as DateTime.MinValue and will always be equal to 1/1/0001 12:00:00 AM. (Value types cannot have non-empty default values) You want to use DateTime.Now.

SLaks
  • 868,454
  • 176
  • 1,908
  • 1,964
2

You're very close, the problem is you're comparing a DateTime to a TimeOfDay. What you need to do is add the .TimeOfDay property to the end of your Convert.ToDateTime() functions.

Michael La Voie
  • 27,772
  • 14
  • 72
  • 92
1

Will this be simpler for handling the day boundary case? :)

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
  • 141
  • 3
  • 14
0

We didn't want our service to run during the night. So we created this condition to check that current time in within the time window of 9am (today) and 1am (the next day):

if (DateTime.Now > DateTime.Now.Date && DateTime.Now <= DateTime.Now.Date.AddHours(1.00) || 
DateTime.Now >= DateTime.Now.Date.AddHours(9))
{
 // Current Time is within specified time window.
}
Mimina
  • 2,603
  • 2
  • 29
  • 21
0

4 times checking

public static void GetTime()
        {
            var dt =  DateTime.Now;
            int hours = dt.Hour;
            int min = dt.Minute;

            if (hours >= 1 && hours <= 12)
            {
                //Good Morning
            }
            else if (hours >= 12 && hours <= 16)
            {
                //Good Afternoon
            }
            else if (hours >= 16 && hours <= 21)
            {
                //Good Evening
            }
            else if (hours >= 21 && hours <= 24)
            {
                //Good Night
            }
        }
rob
  • 1
  • As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Sep 14 '22 at 00:38
-1

Using Linq we can simplify this by this

 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))
ECie
  • 1,265
  • 4
  • 21
  • 50
-2
 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");
        }

    }
 }