C#检查当前日期是否为当月的1、2或3日,忽略周末和附加列表<;日期时间>;

C#检查当前日期是否为当月的1、2或3日,忽略周末和附加列表<;日期时间>;,c#,datetime,C#,Datetime,我需要检查DateTime.Now是否在每个月的前3个工作日(从周一到周五)。我还需要提供一份关于国定假日的列表,并应相应处理 如果DateTime.现在是星期六,是本月的第1个工作日,前3个工作日是星期一、星期二、星期三(本月的第3、4、5个工作日) 这是一个好方法吗?如何添加带假日的列表,并检查当前日期是否为假日 我有一种感觉,我想得太多了,而且想得不好。我不知道为什么,但同样的感觉告诉我有一种更简单的方法。编辑:我没有足够仔细地阅读这个问题,尽管我以前的部分答案仍然适用。我在这里采用的方法

我需要检查DateTime.Now是否在每个月的前3个工作日(从周一到周五)。我还需要提供一份关于国定假日的
列表
,并应相应处理

如果DateTime.现在是星期六,是本月的第1个工作日,前3个工作日是星期一、星期二、星期三(本月的第3、4、5个工作日)

这是一个好方法吗?如何添加带假日的
列表
,并检查当前日期是否为假日


我有一种感觉,我想得太多了,而且想得不好。我不知道为什么,但同样的感觉告诉我有一种更简单的方法。编辑:我没有足够仔细地阅读这个问题,尽管我以前的部分答案仍然适用。我在这里采用的方法是创建一个方法,枚举一个月的工作日,然后从中提取3个

以下是方法:

public static IEnumerable<DateTime> BusinessDaysOfMonth(DateTime time)
{
    var month = new DateTime(time.Year, time.Month, 1);
    var nextMonth = month.AddMonths(1);

    var current = month;
    while(current < nextMonth)
    {
        if (IsWeekday(current) && !IsHoliday(current))
        {
            yield return current;
        }
        current = current.AddDays(1);
    }
}

旧答案:

好的,看来有三个条件需要确保。它们是:

  • 这是一个月的第一天、第二天或第三天
  • 今天不是星期六或星期天
  • 当前日期不包含在某些表示假日的日期集中
这相当直接地转化为代码:

public static bool IsFirstThreeDays(DateTime time) => time.Day < 4;

public static bool IsWeekday(DateTime time)
{
    var dow = time.DayOfWeek;
    return dow != DayOfWeek.Saturday && dow != DayOfWeek.Sunday;
}

public bool IsHoliday(DateTime time)
{
    ISet<DateTime> holidays = ??; // Decide whether this is a member or an arg
    return holidays.Contains(time.Date);
}

编辑:我没有足够仔细地阅读这个问题,尽管我以前的部分答案仍然适用。我在这里采用的方法是创建一个方法,枚举一个月的工作日,然后从中提取3个

以下是方法:

public static IEnumerable<DateTime> BusinessDaysOfMonth(DateTime time)
{
    var month = new DateTime(time.Year, time.Month, 1);
    var nextMonth = month.AddMonths(1);

    var current = month;
    while(current < nextMonth)
    {
        if (IsWeekday(current) && !IsHoliday(current))
        {
            yield return current;
        }
        current = current.AddDays(1);
    }
}

旧答案:

好的,看来有三个条件需要确保。它们是:

  • 这是一个月的第一天、第二天或第三天
  • 今天不是星期六或星期天
  • 当前日期不包含在某些表示假日的日期集中
这相当直接地转化为代码:

public static bool IsFirstThreeDays(DateTime time) => time.Day < 4;

public static bool IsWeekday(DateTime time)
{
    var dow = time.DayOfWeek;
    return dow != DayOfWeek.Saturday && dow != DayOfWeek.Sunday;
}

public bool IsHoliday(DateTime time)
{
    ISet<DateTime> holidays = ??; // Decide whether this is a member or an arg
    return holidays.Contains(time.Date);
}

这应该是你想要的。你必须提供这套假期

public static bool IsFirstThreeBusinessDays(DateTime date, HashSet<DateTime> holidays)
{
    DateTime dt = new DateTime(date.Year, date.Month, 1);
    int businessDaysSeen = 0;

    while (businessDaysSeen < 3)
    {
        if (dt.DayOfWeek != DayOfWeek.Saturday && 
            dt.DayOfWeek != DayOfWeek.Sunday && 
            !holidays.Contains(dt))
        {
            if (dt == date.Date)
            {
                return true;
            }

            businessDaysSeen++;
        }

        dt = dt.AddDays(1);
    }

    return false;
}
publicstaticboolsfirstthreebusinessdays(日期时间日期,HashSet假日)
{
DateTime dt=新的日期时间(date.Year,date.Month,1);
int businessdayssen=0;
while(businessdayseen<3)
{
如果(dt.DayOfWeek!=星期六和
dt.DayOfWeek!=DayOfWeek.Sunday&&
!假日。包含(dt))
{
如果(dt==date.date)
{
返回true;
}
businessdayssen++;
}
dt=dt.增加天数(1);
}
返回false;
}

这应该是您想要的。你必须提供这套假期

public static bool IsFirstThreeBusinessDays(DateTime date, HashSet<DateTime> holidays)
{
    DateTime dt = new DateTime(date.Year, date.Month, 1);
    int businessDaysSeen = 0;

    while (businessDaysSeen < 3)
    {
        if (dt.DayOfWeek != DayOfWeek.Saturday && 
            dt.DayOfWeek != DayOfWeek.Sunday && 
            !holidays.Contains(dt))
        {
            if (dt == date.Date)
            {
                return true;
            }

            businessDaysSeen++;
        }

        dt = dt.AddDays(1);
    }

    return false;
}
publicstaticboolsfirstthreebusinessdays(日期时间日期,HashSet假日)
{
DateTime dt=新的日期时间(date.Year,date.Month,1);
int businessdayssen=0;
while(businessdayseen<3)
{
如果(dt.DayOfWeek!=星期六和
dt.DayOfWeek!=DayOfWeek.Sunday&&
!假日。包含(dt))
{
如果(dt==date.date)
{
返回true;
}
businessdayssen++;
}
dt=dt.增加天数(1);
}
返回false;
}

您也可以使用LINQ执行此操作

public static bool IsFirstThreeBusinessDays(DateTime date, HashSet<DateTime> holidays)
{
    var query =
        Enumerable.Range(1, DateTime.DaysInMonth(date.Year, date.Month))
            .Select(o => new DateTime(date.Year, date.Month, o))
            .Where(o => o.DayOfWeek != DayOfWeek.Saturday && o.DayOfWeek != DayOfWeek.Sunday
                && !holidays.Contains(o))
            .Take(3);

    return query.Contains(date);
}
publicstaticboolsfirstthreebusinessdays(日期时间日期,HashSet假日)
{
变量查询=
可枚举的.范围(1,DateTime.DaysInMonth(date.Year,date.Month))
.选择(o=>newdatetime(date.Year,date.Month,o))
.其中(o=>o.DayOfWeek!=DayOfWeek.周六和&o.DayOfWeek!=DayOfWeek.周日
&&!假期。包含(o))
.采取(3);
返回查询。包含(日期);
}

您也可以使用LINQ执行此操作

public static bool IsFirstThreeBusinessDays(DateTime date, HashSet<DateTime> holidays)
{
    var query =
        Enumerable.Range(1, DateTime.DaysInMonth(date.Year, date.Month))
            .Select(o => new DateTime(date.Year, date.Month, o))
            .Where(o => o.DayOfWeek != DayOfWeek.Saturday && o.DayOfWeek != DayOfWeek.Sunday
                && !holidays.Contains(o))
            .Take(3);

    return query.Contains(date);
}
publicstaticboolsfirstthreebusinessdays(日期时间日期,HashSet假日)
{
变量查询=
可枚举的.范围(1,DateTime.DaysInMonth(date.Year,date.Month))
.选择(o=>newdatetime(date.Year,date.Month,o))
.其中(o=>o.DayOfWeek!=DayOfWeek.周六和&o.DayOfWeek!=DayOfWeek.周日
&&!假期。包含(o))
.采取(3);
返回查询。包含(日期);
}

您如何定义假期?DateTime有一个“年”部分,这意味着您不能简单地将DateTime对象设置为(例如)9月1日,并期望它每年“升起一面旗帜”。您需要创建一个描述重复日期的描述符对象,然后对照它检查当前日期只是关于界面的一个注意事项:您最好接受任何
DateTime
,而不是只对
DateTime进行硬编码。现在
。(零参数重载可以调用带有
DateTime.Now
的单参数重载。)从那里,一个助手函数
DateTime GetNextBusinessDay(DateTime-day)
可以简化实现。@Nissim假期并不总是在每年的同一个月/日,所以你需要一个完整的DateTime来知道给定的日期是否是假日。此函数提供的列表只需要包含当前月份的假日日期。如何定义假日?DateTime有一个“年”部分,这意味着您不能简单地将DateTime对象设置为(例如)9月1日,并期望它每年“升起一面旗帜”。您需要创建一个描述重复日期的描述符对象,然后对照它检查当前日期只是关于界面的一个注意事项:您最好接受任何
DateTime
,而不是只对
DateTime进行硬编码。现在
。(零参数重载可以调用带有
DateTime.Now
的单参数重载。)从那里,一个助手函数
DateTime GetNextBusinessDay(DateTime-day)
可以简化实现。@Nissim假期并不总是在每年的同一个月/日,所以你需要一个完整的DateTime来知道给定的日期是否是假日。提供给此函数的列表只需要包含