在ajax日历扩展器控件中禁用周末和国家假期

时间:2014-01-23 11:54:14

标签: c# asp.net ajax calendar

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

我的应用程序中有许多小操作,例如添加任务的开始日期以查找完成日期,更改任务的结束日期(取决于其开始日期)等等。

但是,当我做所有这些操作时,我想跳过所有假期和星期六,星期日,从例如的计算。从2014年1月23日开始,持续时间为5天的任务应于2014年1月29日完成(为持续时间的持续时间增加2天),而不是01/27/2014。同样也应该对其他操作执行。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:3)

对于星期日和星期六,这很容易。只需查看日期的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);
    }
}

由于你可以通过以下方式知道startend之间有多少天:

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--;
    }
}

如果循环,endx start {{1}}之后的工作日(假设中间没有假期)。

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

答案 1 :(得分:1)

试试这个..

private string GetDatesOfSundays(DateTime DatMonth)  
    {  
        string sReturn = "";  
        int iDayOffset = DatMonth.Day - 1;  
        DatMonth = DatMonth.AddDays(System.Convert.ToDouble(-DatMonth.Day + 1));  
        DateTime DatMonth2 = DatMonth.AddMonths(1).AddDays(System.Convert.ToDouble(-1));  
        while (DatMonth < DatMonth2)  
        {  
            if (DatMonth.DayOfWeek == System.DayOfWeek.Sunday)  
            {  
                if (sReturn.Length > 0) sReturn += ",";  
                sReturn += DatMonth.ToShortDateString();  
            }  
            DatMonth = DatMonth.AddDays(1.0);  
        }  
        return sReturn;  
    }