计算有效工作日(跳过节假日)

本文提供了一段用于计算给定日期之后的第n个工作日的代码实现,该方法能够自动跳过周末和法定节假日。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际开发过程中,我们很多时候会遇到节假日处理的问题。由于前段时间工作需要,所以通过各种平台搜集资料,整理出下面的代码。

备注:主要是给定一个初始日期,然后给定一个时间范围,要求自动跳过节假日以及双休日,最后返回一个工作日的日期,具体代码如下:





        /// <summary>
        /// 根据指定日期,计算出给定时间间隔的下一个工作日的日期
        /// </summary>
        /// <param name="dt">给定的日期</param>
        /// <param name="n">时间间隔</param>
        /// <returns>下一个工作日的日期</returns>
        private static DateTime ResultDateTime(DateTime dt, int n)
        {
            DateTime temp = dt;
            int count = 0;
            if (temp != null)
            {
                do
                {
                    temp = temp.AddDays(1);
                    string strTempDate = temp.ToString().Split(' ')[0];
                    string[] st = strTempDate.Split('/');
                    string y = st[0];
                    string m = "";
                    string d = "";
                    if (st[1].Length == 1)
                    {
                        m = "0" + st[1];
                    }
                    else
                    {
                        m = st[1];
                    }
                    if (st[2].Length == 1)
                    {
                        d = "0" + st[2];
                    }
                    else
                    {
                        d = st[2];
                    }
                    string s = y + m + d;
                    // 节假日API http://www.easybots.cn/
                    string strUrl = "http://www.easybots.cn/api/holiday.php?d=" + s;
                    Uri uri = new Uri(strUrl);
                    WebRequest req = WebRequest.Create(uri);
                    WebResponse resp = req.GetResponse();
                    StreamReader reader = new StreamReader(resp.GetResponseStream(), Encoding.ASCII);
                    string strTemp = reader.ReadToEnd();
                    strTemp = strTemp.Split(':')[1];
                    // 1 为休息日,2 为节假日
                    if (strTemp.Contains('0'))
                    {
                        count++;
                    }
                } while (count != n);
            }
            else
            {
                return Convert.ToDateTime("0000/1/1");
            }
            return temp;
        }

### 如何在项目管理软件的甘特图中配置跳过节假日 #### MindManager 中设置特殊假日 对于像春节这样的特殊节日,MindManager 提供了灵活的方式来进行处理。当创建时间表类型的思维导图并切换到甘特视图时,默认情况下已经区分了工作日和周末。然而,针对特定的公共假期或公司内部放假安排,则需手动调整。 - **添加非工作时段**:可以通过自定义日历来实现这一点。进入“工具”菜单下的选项设置里找到关于工作时间的部分,这里允许指定哪些日期应被标记为不工作的日子[^1]。 ```python # 假设有一个函数用于设定非工作日列表 def set_non_working_days(holiday_list): for day in holiday_list: mindmanager_calendar.mark_as_holiday(day) holiday_list = ["2023-01-21", "2023-01-22"] # 春节期间的具体休息日 set_non_working_days(holiday_list) ``` #### WPS 表格中的考虑事项 虽然WPS表格也可以用来构建简单的甘特图表来跟踪进度,但它不具备内置的日历功能去识别具体的节假日。因此,在这种环境下想要绕过某些天数的话,可能就需要依靠外部的数据源或者是通过公式计算排除掉这些日期的影响[^2]。 #### 使用 DHTMLX Gantt 设置全局日历 如果采用的是基于Web的应用程序如DHTMLX Gantt库开发定制化解决方案,则可以直接利用其强大的API接口完成此操作。这涉及到修改默认的工作模式以及引入额外的日程条目代表特别事件(比如法定假日),从而确保它们不会影响任务计划的实际执行周期[^3]。 ```javascript // 定义一个包含所有中国国定假日的对象数组 var holidays = [ {start_date:"2023-01-21", end_date:"2023-01-27"}, // 春节假期限定 ]; gantt.init("gantt_here"); gantt.config.work_time = false; // 关闭标准工时检测以便我们可以完全控制可用性 for (let i=0;i<holidays.length;i++){ gantt.addHoliday(new Date(holidays[i].start_date), new Date(holidays[i].end_date)); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值