195

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.

3
  • Duplicate: stackoverflow.com/questions/1408165/… Oct 1, 2009 at 15:14
  • 3
    Do you need to be concerned with crossing midnight?
    – gjutras
    Oct 1, 2009 at 15:15
  • 1
    crossing midnight isn't a concern but anything that spans midnight is sure a bane of my programming experience...
    – John M
    Oct 1, 2009 at 15:51

12 Answers 12

323

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
}
10
  • How to count the number of matches? For example I want to count how many saturdays and sundays are in the range.
    – pbies
    Sep 4, 2013 at 19:28
  • @pmbiesiada: This is completely out of the scope of the original question (and the answer). You should make this a new question, but do a serach here on SO if something like this has been answered before. Good luck. Sep 5, 2013 at 15:11
  • 2
    What if there are different time for different days? Is there a easy to compare that? stackoverflow.com/questions/22769557/… Mar 31, 2014 at 18:50
  • @SearchForKnowledge: Compare for what? Please be more specific about what you want to accomplish or give some examples. Apr 1, 2014 at 8:19
  • 12
    The answer below should be the accepted one... This one doesn't check for TimeSpans over days, e.g. from 22:00:00 to 02:00:00... Nov 8, 2017 at 20:36
174
+50

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.

6
  • 1
    What if there are different time for different days? Is there a easy to compare that? stackoverflow.com/questions/22769557/… Mar 31, 2014 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. Mar 6, 2015 at 4: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 1, 2015 at 8:59
  • 2
    Thank you for that. The answer seems simple to come to, but it's kinda awkward to conceptualize. Feb 18, 2016 at 0: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, 2018 at 3:23
28

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;
}
4
  • 3
    Good addition Andre. Wouldn't have thought to do an OR comparison for the different day case.
    – David
    Dec 10, 2016 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 6, 2018 at 15:51
  • @Thierry Nice catch :) You are welcome to try and fix it. Mar 6, 2018 at 16:00
  • 1
    Another variation to consider is changing the two time <= end to time < end.
    – HappyNomad
    Aug 11, 2021 at 9: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");
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 1, 2015 at 8: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

1
  • 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, 2012 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.

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.

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

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
            }
        }
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.
    – Community Bot
    Sep 14, 2022 at 0:38
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.
}
-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))
-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");
        }

    }
 }
0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.