Skip to main content
 首页 » 编程设计

c#之在 ajax 日历扩展器控件中禁用周末和国定假日

2024年02月13日37落叶无声

我一直在尝试为我的应用程序使用 ajax CalenderExtender。

我的应用程序中有许多小操作,例如将持续时间添加到任务的开始日期以查找完成日期,如果结束日期发生更改(取决于开始日期)则更改任务的持续时间等。

但是,当我执行所有这些操作时,我想跳过所有假期和星期六、星期日的计算,例如。一个任务从 01/23/2014 开始,持续时间为 5 天,应该在 01/29/2014(为 sat n sun 持续时间增加 2 天)而不是 01/27/2014 结束。其他操作也应执行相同的操作。

有办法吗?

请您参考如下方法:

对于周日和周六,这很容易。只需检查 DateTime.DayOfWeek您日期的属性。

如果您有一个将在 start 日期开始并将在 end 日期结束的操作,您可以像这样查看星期六或星期日的日期:

List<DateTime> satsAndSundays; 
for (DateTime temp = start; temp <= end; temp.AddDays(1)) 
{ 
    if (temp.DayOfWeek == DayOfWeek.Sunday || 
        temp.DayOfWeek == DayOfWeek.Saturday) 
    { 
        satsAndSundays.add(temp); 
    } 
} 

因为您可以通过执行以下操作知道开始和结束之间有多少天:

TimeSpan span = end - start; 
int totalDays = (int)span.TotalDays; 
// TotalDays is actually a double, I'm just discarding the non integer part. 

您可以通过执行 totalDays - satsAndSundays.Count 找出您在那里有多少工作日。

编辑:我刚刚再次阅读了这个问题。如果您希望任务在给定日期开始,并花费 x 个工作日,您可以这样做:

DateTime end = start; 
for (int i = x; i >= 0;) // the third parameter of the for is empty on purpose 
{ 
    end = end.AddDays(1); 
    if (end.DayOfWeek != DayOfWeek.Saturday && 
        end.DayOfWeek != DayOfWeek.Sunday) 
    { 
        i--; 
    } 
} 

循环之后,end 将在 start 之后的 x 个工作日(前提是中间没有假期)。

不过,对于节假日,框架中没有相应的算法。您需要从某些来源(文件、数据库、Web 服务等)获取它们。或者您可以编写自己的程序来计算它们 - 大多数不在固定日期的假期在发生时确实遵循公式。但是请注意,假期可能因文化和地区而异。例如,如果您的应用程序要在全国范围内使用,那么实现全市假期可能需要付出很大的努力。根据您的需要,让用户输入哪些日子是假期,或者创建您自己的数据库,您的应用程序可以访问和使用它甚至可能更好。