【发布时间】:2014-07-28 17:01:39
【问题描述】:
我知道有人问过类似的问题,但我觉得这个问题有不同的要求。
我需要检查当前日期是该月最后一个工作日的第 N 天还是第 N 天。如果是,我开始另一个任务,否则我退出。
类似:
void doTask()
{
if (NthFirstOrNthLastBusinessDay())
{ // do stuff }
else
{ // do nothing }
}
bool NthFirstOrNthLastBusinessDay()
{}
到目前为止,我想我可以按照答案here 来获取当月的最后一个工作日(同样是当月的第一个工作日),然后应用一堆条件来计算第 N 个工作日那个日期。
有没有更好的办法?
例如,如果 N 为 4,我的任务应该仅在今天是该月的第 4 个工作日或该月最后一个工作日的第 4 个工作日时运行。
本质上,我每天都会调用这个方法,它检查当前日期是否满足这个条件,如果满足则运行任务,否则不运行。
所以,我的任务应该在 2014 年 7 月 28 日和 2014 年 8 月 6 日运行,然后是 2014 年 8 月 26 日,依此类推。
编辑: 这是我在 N=4 的情况下编写的一些代码:
/// <summary>
/// Checks if the current day is the 4th business day or the 4th last business day of the month
/// </summary>
/// <returns> True if current day satisfies condition, false otherwise </returns>
private bool NthFirstOrNthLastBusinessDay()
{
return (IsFourthBusinessDay() || IsFourthFromLastBusinessDay());
}
/// <summary>
/// Checks if today is the fourth business day of the month
/// </summary>
/// <returns> True if today satisfies condition, else false </returns>
private bool IsFourthBusinessDay()
{
var dateToday = DateTime.Today;
var firstDayOfThisMonth = new DateTime(dateToday.Year, dateToday.Month, 1);
switch (firstDayOfThisMonth.DayOfWeek)
{
case DayOfWeek.Sunday:
firstDayOfThisMonth = firstDayOfThisMonth.AddDays(4);
break;
case DayOfWeek.Monday:
firstDayOfThisMonth = firstDayOfThisMonth.AddDays(3);
break;
case DayOfWeek.Tuesday:
firstDayOfThisMonth = firstDayOfThisMonth.AddDays(3);
break;
default:
firstDayOfThisMonth = firstDayOfThisMonth.AddDays(5);
break;
} // firstDayOfMonth now contains first business day of month
return dateToday == firstDayOfThisMonth;
}
/// <summary>
/// Checks if today is the fourth from last business day of the month
/// </summary>
/// <returns> True if today satisfies condition, else false </returns>
private bool IsFourthFromLastBusinessDay()
{
var dateToday = DateTime.Today;
var lastDayOfThisMonth = new DateTime(dateToday.Year, dateToday.Month, DateTime.DaysInMonth(dateToday.Year, dateToday.Month));
switch (lastDayOfThisMonth.DayOfWeek)
{
case DayOfWeek.Saturday:
lastDayOfThisMonth = lastDayOfThisMonth.AddDays(-4);
break;
case DayOfWeek.Friday:
lastDayOfThisMonth = lastDayOfThisMonth.AddDays(-3);
break;
case DayOfWeek.Thursday:
lastDayOfThisMonth = lastDayOfThisMonth.AddDays(-3);
break;
default:
lastDayOfThisMonth = lastDayOfThisMonth.AddDays(-5);
break;
} // firstDayOfMonth now contains first business day of month
return dateToday == lastDayOfThisMonth;
}
现在我需要调整一般 N 的值。有更好的方法吗?
【问题讨论】:
-
我不明白你所说的第 n 个第一个或第 n 个最后一个是什么意思……对我来说,一个例子应该是:“本月的第三个第一个工作日是什么?”这没有意义
-
我认为这意味着Nth或Nth from last...?为什么不找到所有工作日并将它们放入
List。然后days[3]每月第三个工作日。 -
@Tom 很抱歉造成混乱。添加了用例。是不是更清楚了?
-
@crashmstr,你是对的。英语不是我的母语,抱歉。另外,我觉得应该有比你更好的解决方案,因为我应该能够检查当天,而不是每次运行任务时计算该月的所有工作日。你怎么看?
-
要检查一天是否是第 N 个(或倒数第 N 个)工作日,您需要知道之前(或之后)有多少个工作日。因此,您仍然需要检查其他日子,对吗?