2

我已经设计了一个程序来查找第 n 个工作日而不使用循环。

请提出您对此的建议-

操纵工作日的算法 -

问题:查找从任何特定日期开始的第 n 个工作日的日期。

解决方案:

  1. 标准化到最近的星期一 -

    If today(or the initial day) happens to be something other than monday, bring the day to the closest monday by simple addition or subtraction.
    

    例如:初始日 - 10 月 17 日。这恰好是星期三。因此,通过减少 2 个日期来使这个星期一正常化。现在将这 2 个日期命名为初始标准化因子。

  2. 添加这几周的工作日数+周末数。

    eg:要增加10个工作日,我们需要增加12天。由于 10 天有 1 周,其中仅包括 1 个星期六和 1 个星期日。这是因为,我们正在正常化到最近的星期一。

  3. 摊销——

    现在从结束日期开始添加初始归一化因子(用于负初始归一化)和另一个常数因子(例如 k)。或者如果初始标准化是从星期五获得的,则加 1,恰好是 +3。如果开始日期在周六和周日,则视为周一。所以这一步不需要摊销。

    例如:假设如果初始归一化是从星期三开始的,则初始归一化因子是-2。因此将 2 添加到结束日期和常数 k。

    The constant k is either 2 or 0. 
    

常量定义 -

    If initial normalization factor is -3, then add 2 to the resulting date if the day before amortization is (wed,thu,fri) 
    If initial normalization factor is -2, then add 2 to the resulting date if the day before amortization is (thu,fri) 
    If initial normalization factor is -1, then add 2 to the resulting date if the day before amortization is (fri) 

例子 -

   Find the 15th working day from Oct,17 (wednesday).

第1步 -

初始标准化 = -2 现在开始日期是 10 月 15 日(星期一)。

第2步 -

add 15 working days -

15 days => 2 weeks
    weekends = 2 (2 sat, 2 sun)

    so add 15 + 4 = 19 days to Oct, 15 monday.

    end_date = 2, nov, Friday

步骤 3a -

end_date = end_date + initial normalization = 4, nov sunday

步骤 3b -

end_date = end_date + constant_factor = 4, nov, sunday + 2 = 6, nov (Tuesday)

交叉验证 -

 Add 15th working day to Oct, 17 wednesday

 Oct,17 + 3 (Oct 17,18,19) + 5 (Oct 22-26) + 5 (Oct 29 - Nov 2)  + 2 (Nov 5, Nov 6)

 Now the answer is 6, Nov, Tuesday.

我已经通过几个案例进行了验证。请分享您的建议。

拉森。

4

2 回答 2

5

首先,它是一个很好的算法,但我对边界条件有疑问:例如,如果我需要从今天开始找到第 0 个工作日怎么办:

第1步 -

initial normalization = -2 now start date is Oct,15 (monday).

第2步 -

add 0 working days -

0 days => 0 weeks
    weekends = 0
    so add 0 + 0 = 0 days to Oct, 15 monday.

    end_date = 15, oct, monday

步骤 3a -

end_date = end_date + initial normalization = 17, oct wednesday

步骤 3b -

end_date = end_date + constant_factor = 17, Oct wednesday or 19,oct friday based on whether constant factor is 0 or 2 as it be only one of these values.

现在让我们重复查找从今天开始的第一个工作日的步骤:

第1步 -

initial normalization = -2 now start date is Oct,15 (monday).

第2步 -

add 1 working days -

1 days => 0 weeks
    weekends = 0
    so add 1 + 0 = 1 days to Oct, 15 monday.

    end_date = 15, oct, monday

步骤 3a -

end_date = end_date + initial normalization = 17, oct wednesday

步骤 3b -

end_date = end_date + constant_factor = 17, Oct wednesday or 19,oct friday based on whether constant factor is 0 or 2 as it be only one of these values.

您是否注意到,算法对 0 和 1 给出相同的最终结果。如果事先定义 0 个工作日和 1 个工作日被视为相同的场景,这可能不是问题,但理想情况下它们应该给出不同的结果。

我还建议您考虑负面测试用例,例如,如果我需要从今天起找到第-6 个工作日怎么办,您的算法是否会正确地给我一个过去的日期?

于 2012-10-17T05:25:34.760 回答
2

让我们考虑从今天开始的第 0 个工作日(17 月 10 日,星期三)。

第1步 -

 start_date = 17/10 wed
 normalized date = 15/10 mon

第2步 -

end_date = 标准化日期 + 工作日 = 15/10 星期一 + 0 = 15/10 星期一

第 3 步 -

  amortized_back = end_date_before_amortization + normalization factor
                 = 15/10 + (+2) = 17/10 wed

  since the end_date_before_amortization falls on monday and initial normalization is 2, constant factor = 0.

  hence, end_date = 17/10 wed.

现在是案例 2,从今天开始的第一个工作日。

第1步 -

 start_date = 17/10 wed
 normalized date = 15/10 mon

第2步 -

end_date = 标准化日期 + 工作日 = 15/10 周一 + 1 = 16/10 周二 第 3 步 -

 amortized_back = end_date_before_amortization + normalization factor
                 = 16/10 + (+2) = 18/10 thu.

  since the end_date_before_amortization falls on tuesday and initial normalization is 2, constant factor = 0.

  hence, end_date = 18/10 thu.

看起来适用于第 0 和第 1 WD。

于 2012-10-17T16:41:48.473 回答