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