Nemanja Boric
Nemanja Boric

Reputation: 22157

How can I check if current day is working day

I have application that needs to be run on working days, and within working hours.

In application configuration, I've set start time in format

Monday-Friday
9:00AM-5:30PM

Now, I have a problem how to check if current day is within day boundare is (for the time is easy - parse time with DateTime.ParseExact and simple branch will do), but I don't know how to parse days.

I've tried with:

DayOfWeek day = DateTime.Now.DayOfWeek;
if (day >= (DayOfWeek)Enum.Parse(typeof(DayOfWeek), sr.start_day) &&
    day <= (DayOfWeek)Enum.Parse(typeof(DayOfWeek), sr.end_day))
{ /* OK */ }

sr.start_day and sr.end_day are strings

but the problem occurred during weekend testing - apparently, in DayOfWeek enum, Sunday is first day of the week (refering to the comments on MSDN page

I suppose I could do some gymnastics with current code, but I am looking for the most readable code available.

Edit Sorry for the misunderstanding - working days are not from Monday to Friday - they are defined as strings in config file, and they can be even from Friday to Saturday - which breaks my original code.

Upvotes: 20

Views: 40491

Answers (10)

Abdullah AlSubaiee
Abdullah AlSubaiee

Reputation: 19

DayOfWeek Day = DateTime.Today.DayOfWeek;
int Time = DateTime.Now.Hour;
if (Day != DayOfWeek.Saturday && Day != DayOfWeek.Sunday)
 {
 if (Time >= 8 && Time <= 16)
 {
   //It is Weekdays work hours from 8 AM to 4 PM
 {
 }
else
 {
   // It is Weekend
 }

Upvotes: 0

Chris B.
Chris B.

Reputation: 93

My simple solution to determining if the current day is a workday or not is:

public static bool IsWorkDay(this DateTime dt)
{
    return IsWorkDay(dt, DayOfWeek.Sunday, DayOfWeek.Saturday);
}

public static bool IsWorkDay(this DateTime dt, params DayOfWeek[] noneWorkDays)
{
    return !noneWorkDays.Contains(dt.DayOfWeek);
}

It assumes Sunday / Saturday are non-work days. Otherwise the user can specify the non-work days. And is an extension for easy of use.

Note: To avoid a loop could created a bit flag.

Upvotes: 0

We can also follow similar approach of checking if a given hour is between two hours. Following is the algorithm

checkIfFallsInRange(index,start,end)

bool normalPattern = start <= end ;

if ( normalPattern)
   return index>=start && index<=end;
else
  return index>=start || index <=end;

Upvotes: 0

Michael
Michael

Reputation: 1

This is an elegant solution for the problem. It's a class that can easily be imported into other projects. The coding allows the programmer to dynamically assign what days to check for and pass them as a string array to the class. The data can come from a database or be hard coded when you pass it to an instance of this class for processing. It returns the values of True if you're off work and False if you're working that day. Below the class I provided a simple example of implementation. This class features: Dynamic allocation of what days you have off, Simple error handler by setting strings to lowercase before comparing them, Easily integrated with a database that has your work schedule where your days off may not always be the same. Easily integrated as a hard coded number of days off.

// The Class To Check If You're Off Work

class DayOffChecker
{
    public bool CheckDays(List<string> DaysOff)
    {
        string CurrentDay = DateTime.Now.DayOfWeek.ToString();
        CurrentDay.ToLower();
        foreach (string DayCheck in DaysOff)
        {
            DayCheck.ToLower();
            if (CurrentDay == DayCheck)
            {
                return (true);
            }
        }
        return (false);
    }
}

// Example usage code:

class Program
{
    List<string> DaysOff = List<string>();
    DaysOff.Add("Saturday");  // Add some values to our list.
    DaysOff.Add("Sunday");
    DayOffChecker CheckToday = new DayOffChecker();
    if(CheckToday.CheckDays(DaysOff))
    {
        Console.WriteLine("You're Off Today!!!");
    }
}

Upvotes: 0

Mustafa G&#252;lmez
Mustafa G&#252;lmez

Reputation: 161

extention for DateTime

public static bool IsWeekend(this DateTime date)
    {
        return new[] {DayOfWeek.Sunday, DayOfWeek.Saturday}.Contains(date.DayOfWeek);
    }

Upvotes: 5

zamir
zamir

Reputation: 11

    public bool IsWeekend(DateTime dateToCheck)
    {
        DayOfWeek day = (DayOfWeek) dateToCheck.Day;
        return ((day == DayOfWeek.Saturday) || (day == DayOfWeek.Sunday)); 
    }

Upvotes: -1

Nemanja Boric
Nemanja Boric

Reputation: 22157

From Hans Passant's comment on my original question:

Just add 7 to the end day if it is less than the start day. Similarly, add 7 to day if it is less than the start day.

DayOfWeek day = DateTime.Now.DayOfWeek;
DayOfWeek start_day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), sr.start_day);
DayOfWeek end_day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), sr.end_day);

if (end_day < start_day)
    end_day += 7;

if (day < start_day)
    day += 7;

if (day >= start_day && day <= end_day)
{ 
   //Action
}

Upvotes: 12

HatSoft
HatSoft

Reputation: 11191

The line below will return "Sunday"

string nameOfTheDay = DateTime.Now.ToString("dddd", new System.Globalization.CultureInfo("en-GB")).ToLower();

if(nameOfTheDay != "sunday" && nameOfTheDay != "saturday")
{
//Do Stuff
}

Upvotes: -1

mattiaerre
mattiaerre

Reputation: 9

You can use the DayOfWeek enumeration in order to see if a date is Sunday or Saturday. http://msdn.microsoft.com/en-us/library/system.dayofweek.aspx I hope this can help.

Upvotes: -1

Hogan
Hogan

Reputation: 70513

if ((day >= DayOfWeek.Monday) && (day <= DayOfWeek.Friday))
{
    // action
}

Upvotes: 16

Related Questions