如何检查当天是否为工作日

时间:2012-07-15 19:38:22

标签: c#

我的应用程序需要在工作日和工作时间内运行。

在应用程序配置中,我以格式

设置了开始时间
Monday-Friday
9:00AM-5:30PM

现在,我有一个问题,如何检查当前是否在当天限制之内(时间很容易 - 用DateTime.ParseExact解析时间并且简单分支会做),但我不知道如何解析日。

我试过了:

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_daysr.end_day是字符串

但问题发生在周末测试期间 - 显然,在DayOfWeek enum,星期日是一周的第一天(参考MSDN page上的评论

我想我可以使用当前代码做一些体操,但我正在寻找最易读的代码。

修改 很抱歉误解 - 工作日不是从星期一到星期五 - 它们在配置文件中被定义为字符串,它们甚至可以从星期五到星期六 - 这会破坏我的原始代码。

10 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:11)

来自Hans Passant's对原始问题的评论:

  

如果小于开始日,只需在结束日添加7即可。同样的,   如果它小于开始日,则添加7天。

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
}

答案 2 :(得分:4)

DateTime

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

答案 3 :(得分:0)

这是解决问题的优雅方案。它是一个可以轻松导入其他项目的类。编码允许程序员动态分配要检查的天数,并将它们作为字符串数组传递给类。当您将数据传递给此类的实例进行处理时,数据可以来自数据库或进行硬编码。如果您下班,则返回True值,如果您当天正在工作,则返回False。在课程下面我提供了一个简单的实现示例。这个类的特点是:动态分配你已经离开的日子,简单的错误处理程序通过在比较它们之前将字符串设置为小写,轻松地与具有你的工作计划的数据库集成,你的休假时间可能并不总是相同。轻松集成为硬编码的休假天数。

// 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!!!");
    }
}

答案 4 :(得分:0)

我们也可以采用类似的方法来检查给定的小时是否在两小时之间。以下是算法

checkIfFallsInRange(index,start,end)

bool normalPattern = start <= end ;

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

答案 5 :(得分:0)

我确定当天是否是工作日的简单解决方案是:

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

假设星期日/星期六是非工作日。否则,用户可以指定非工作日。并且是易于使用的扩展。

注意:为了避免循环,可能会产生一个标志。

答案 6 :(得分:-1)

您可以使用DayOfWeek枚举来查看日期是星期日还是星期六。 http://msdn.microsoft.com/en-us/library/system.dayofweek.aspx我希望这可以提供帮助。

答案 7 :(得分:-1)

以下行将返回“星期日”

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

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

答案 8 :(得分:-1)

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

答案 9 :(得分:-1)

SELECT *
FROM
(
    SELECT a.*, b.ResultTest, b.ResultState2,
        ROW_NUMBER() OVER (PARTITION BY a.Id ORDER BY a.ID DESC) rn
    FROM A a
    LEFT JOIN B b
        ON a.Id = b.GasReceptionId
    WHERE
        a.OrganizationGasId = 4212
) t
WHERE t.rn = 1;