如何检查当前日期是否为工作日?

20

我有一个应用程序,需要在工作日内,并且在工作时间内运行。

在应用程序配置中,我已经设置了开始时间,格式为

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枚举中,星期日是一周的第一天(参考MSDN页面的评论)。

我想我可以在当前代码上做些操作,但我正在寻找最可读的代码。

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


2
如果结束日期小于开始日期,只需将7添加到结束日期。同样地,如果日期小于开始日期,也将7添加到日期。 - Hans Passant
@HansPassant,没错,这个可行!如果可以的话,请发布答案,我会选择它! - Nemanja Boric
3
请发布您所使用的代码,并将其标记为答案。 - Hans Passant
枚举类型本质上是整数,但我通常建议不要使用 <> 来评估枚举。问题在于,如果您添加/删除枚举选项(或重新排列它们的顺序),则必须搜查代码以找到所有 int 评估并更改它们。相反,使用显式的等式检查,例如 if(myEnumValue == MyEnum.One || myEnumValue == MyEnum.Two) 而不是 if((int)myEnumValue < 2)。这样做可以提供类型安全性(不确定是否是正确的名称。我的意思是删除枚举选项将产生编译时错误),减少魔法数字,并提高可读性。 - Flater
10个回答

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

1
这不起作用,我认为它与我的原始代码相同。例如,如果我在星期六设置了计算机,并将end_day设置为星期日。 - Nemanja Boric
1
我明白了...所以你不是想知道它是否是工作日,而是想知道它是否在变量sr.start_day和sr.end_day的两个字符串之间? - Hogan
-1:虽然这对大多数西方国家来说是正确的,但在许多国家并不适用。请参阅en.wikipedia.org/wiki/Workweek_and_weekend。 - joce

12

以下是来自Hans Passant在我的原始问题下的评论:

 

如果结束日期小于开始日期,则将结束日期加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
}

+1。这是相当有争议的,但也证明了C#是一种能够完成工作的语言。赞。 - Hans Passant
这很好地回答了我所问的问题 :-). - Nemanja Boric

5

日期时间扩展

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

你返回一个布尔数组吗? - Hogan
1
@Hogan Mustafa创建了一个新的DayOfWeek实例数组,然后调用Contains()方法,该方法返回一个布尔值。完全合法。请注意,您需要导入System.Linq才能使其正常工作。 - rumblefx0

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

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

1
请删除您的 Twitter 链接,这是不必要的。此外,需要一些解释,仅由代码片段组成的答案并不是好的答案。 - Flater
1
不要在此(或任何其他)回答中添加您的Twitter链接。 - ChrisF
虽然这段代码片段可能解决了问题,但是包括解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您的代码建议的原因。 - Isma

0
我们也可以采用类似的方法来检查给定的小时是否在两个小时之间。以下是算法:
checkIfFallsInRange(index,start,end)

bool normalPattern = start <= end ;

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

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

它假设星期日/星期六不是工作日。否则用户可以指定非工作日。这是为了方便使用而扩展的。

注意:为避免循环,可以创建一个位标志。


-1
下面这行代码将返回“Sunday”。
string nameOfTheDay = DateTime.Now.ToString("dddd", new System.Globalization.CultureInfo("en-GB")).ToLower();

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

虽然对于(大多数?)西方国家来说是正确的,但在许多国家中并不适用。请参阅en.wikipedia.org/wiki/Workweek_and_weekend。 - joce

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

1
-1:虽然这对(大多数?)西方国家来说是正确的,但在许多国家并不适用。请参见https://en.wikipedia.org/wiki/Workweek_and_weekend。 - joce

-1

谢谢,但不完全是我要求的。 - Nemanja Boric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接