C#跳过工作日,计算几个工作日之后到期的方法

需求:消费者投诉企业,企业在2个工作日之内做出应答。

分析:1.工作日要刨去周末和法定节假日,而且每年的节假日不一样。

2.消费者可以在任意时间发起投诉,如果在非工作日发起了投诉,那么计算时间应该从工作日开始计算,就要刨去当日的时和分。

以下是代码:

public class HolidayHelper

    {

        /// <summary>

        /// 判断法定工作日

        /// </summary>

        /// <param name="dt">时间</param>

        /// <returns>0上班,1不需要上班的周末(也包括节假日),2法定节假日</returns>

        public static int IsHolidayOrWeek(DateTime dt)

        {

            //特殊的周末(周末却上班)

            string[] specalWeek2009 = { "0104", "0124", "0201", "0531", "0927", "1010" };

            string[] specalWeek2010 = { "0220", "0221", "0612", "0613", "0919", "0925", "0926", "1009" };

            string[] specalWeek2011 = { "0130", "0212", "0402", "1008", "1009" };

            string[] specalWeek2012 = { "0129", "0331", "0401", "0428", "0929" };

            string[] specalWeek2013 = { "0105", "0106", "0216", "0217", "0407", "0427", "0428", "0608", "0609", "0922", "0929", "1012" };

            string[] specalWeek2014 = { "0126", "0208", "0504", "0928", "1011" };

            string[] specalWeek2015 = { "0104", "0215", "0228", "0906", "1010" };

            string[] specalWeek2016 = { "0206", "0214", "0612", "0918", "1008", "1009" };

            string[] specalWeek2017 = { "0122", "0204", "0401", "0527", "0930" };

            //法定假日

            string[] holiday2009 = { "0101", "0102", "0103", "0125", "0126", "0127", "0128", "0129", "0130", "0131", "0404", "0405", "0406", "0501", "0502", "0503", "0528", "0529", "0530", "1001", "1002", "1003", "1004", "1005", "1006", "1007", "1008", };

            string[] holiday2010 = { "0101", "0102", "0103", "0213", "0214", "0215", "0216", "0217", "0218", "0219", "0403", "0404", "0405", "0501", "0502", "0503", "0614", "0615", "0616", "0922", "0923", "0924", "1001", "1002", "1003", "1004", "1005", "1006", "1007" };

            string[] holiday2011 = { "0101", "0102", "0103", "0202", "0203", "0204", "0205", "0206", "0207", "0208", "0403", "0404", "0405", "0430", "0501", "0502", "0604", "0605", "0606", "0910", "0911", "0912", "1001", "1002", "1003", "1004", "1005", "1006", "1007", };

            string[] holiday2012 = { "0101", "0102", "0103", "0122", "0123", "0124", "0125", "0126", "0127", "0128", "0402", "0403", "0404", "0429", "0430", "0501", "0622", "0623", "0624", "0930", "1001", "1002", "1003", "1004", "1005", "1006", "1007", };

            string[] holiday2013 = { "0101", "0102", "0103", "0209", "0210", "0211", "0212", "0213", "0214", "0215", "0404", "0405", "0406", "0429", "0430", "0501", "0610", "0611", "0612", "0919", "0920", "0921", "1001", "1002", "1003", "1004", "1005", "1006", "1007", };

            string[] holiday2014 = { "0101", "0131", "0201", "0202", "0203", "0204", "0205", "0206", "0405", "0406", "0407", "0501", "0502", "0503", "0602", "0908", "1001", "1002", "1003", "1004", "1005", "1006", "1007", };

            string[] holiday2015 = { "0101", "0102", "0103", "0218", "0219", "0220", "0221", "0222", "0223", "0224", "0404", "0405", "0406", "0501", "0502", "0503", "0620", "0621", "0622", "0903", "0904", "0905", "0927", "1001", "1002", "1003", "1004", "1005", "1006", "1007", };

            string[] holiday2016 = { "0101", "0207", "0208", "0209", "0210", "0211", "0212", "0213", "0404", "0501", "0502", "0609", "0610", "0611", "0915", "0916", "0917", "1001", "1002", "1003", "1004", "1005", "1006", "1007", };

            string[] holiday2017 = { "0101", "0102", "0127", "0128", "0129", "0130", "0131", "0201", "0202", "0403", "0404", "0501", "0529", "0530", "1001", "1002", "1003", "1004", "1005", "1006", };

            bool isHoildayOrWeek = false;

            //取年

            string weekYear = dt.Year.ToString();

            //取月日

            string[] weekDate = { dt.ToString("MMdd") };

            //判断周末

            if ((int)dt.DayOfWeek == 0 || (int)dt.DayOfWeek == 6)

            {

                //周末是否需要上班

                switch (weekYear)

                {

                    case "2009":

                        isHoildayOrWeek = specalWeek2009.Intersect(weekDate).Count() == 0;

                        break;

                    case "2010":

                        isHoildayOrWeek = specalWeek2010.Intersect(weekDate).Count() == 0;

                        break;

                    case "2011":

                        isHoildayOrWeek = specalWeek2011.Intersect(weekDate).Count() == 0;

                        break;

                    case "2012":

                        isHoildayOrWeek = specalWeek2012.Intersect(weekDate).Count() == 0;

                        break;

                    case "2013":

                        isHoildayOrWeek = specalWeek2013.Intersect(weekDate).Count() == 0;

                        break;

                    case "2014":

                        isHoildayOrWeek = specalWeek2014.Intersect(weekDate).Count() == 0;

                        break;

                    case "2015":

                        isHoildayOrWeek = specalWeek2015.Intersect(weekDate).Count() == 0;

                        break;

                    case "2016":

                        isHoildayOrWeek = specalWeek2016.Intersect(weekDate).Count() == 0;

                        break;

                    case "2017":

                        isHoildayOrWeek = specalWeek2017.Intersect(weekDate).Count() == 0;

                        break;

                }

            }

            if (isHoildayOrWeek)

            {

                return 1;

            }

            //判断法定节假日

            switch (weekYear)

            {

                case "2009":

                    isHoildayOrWeek = holiday2009.Intersect(weekDate).Count() > 0;

                    break;

                case "2010":

                    isHoildayOrWeek = holiday2010.Intersect(weekDate).Count() > 0;

                    break;

                case "2011":

                    isHoildayOrWeek = holiday2011.Intersect(weekDate).Count() > 0;

                    break;

                case "2012":

                    isHoildayOrWeek = holiday2012.Intersect(weekDate).Count() > 0;

                    break;

                case "2013":

                    isHoildayOrWeek = holiday2013.Intersect(weekDate).Count() > 0;

                    break;

                case "2014":

                    isHoildayOrWeek = holiday2014.Intersect(weekDate).Count() > 0;

                    break;

                case "2015":

                    isHoildayOrWeek = holiday2015.Intersect(weekDate).Count() > 0;

                    break;

                case "2016":

                    isHoildayOrWeek = holiday2016.Intersect(weekDate).Count() > 0;

                    break;

                case "2017":

                    isHoildayOrWeek = holiday2017.Intersect(weekDate).Count() > 0;

                    break;

            }

            if (isHoildayOrWeek)

            {

                return 2;

            }

            return 0;

        }

        /// <summary>

        /// 工作日时间差

        /// </summary>

        /// <param name="days">几个工作日后</param>

        /// <returns>延迟毫秒数</returns>

        public static double GetDelpyTime(int days)

        {

            int sign = 0;

            for (int i = 0; i < days; i++)

            {

                if (i == 0 && IsHolidayOrWeek(DateTime.Now.AddDays(i)) > 0)

                {

                    //非工作日发起的投诉,要抹掉小时和分钟                   

                    sign = 1;

                }

                if (IsHolidayOrWeek(DateTime.Now.AddDays(i)) > 0)

                {

                    days = days + 1;

                };

            }

            TimeSpan ts = new TimeSpan();

            if (sign == 1)

            {

                ts = (DateTime.Now.AddDays(days) - DateTime.Now.AddHours(DateTime.Now.Hour).AddMinutes(DateTime.Now.Minute));

            }

            else

            {

                ts = DateTime.Now.AddDays(days) - DateTime.Now;

            }

            return ts.TotalMilliseconds;

        }

    }

谢谢大家。

打赏随意:

时间: 2024-08-08 20:12:01

C#跳过工作日,计算几个工作日之后到期的方法的相关文章

一个简单的工作日计算

一个简单的工作日计算: function getWorkDay(dtBegin:TDateTime;IncDays:Integer):TDateTime; const days: array[1..7] of string=('7','1','2','3','4', '5','6'); var week1:string; x:integer; begin //日期 x:=1; while (x<=IncDays) do begin //判断是否周末 week1:=days[DayOfWeek(d

JSP中对页面跳转的不同方法引出HTTP无状态的应对方法

首先我们来看今天所学应用到的一个例子,当我们做了一个登陆页面,提交表单后往往需要跳转到另外一个页面.这里可以用两个方法,方法如下: 1.response用法: response.sendRedirect("URL");  (是对服务器请求的响应) 2.request的用法: request.getRequestDispatcher("URL").forward(request, response);   (是装载着客户端请求的信息集合) 但是两种用法是有所不同的.r

工作日计算问题思路和实现

项目中眼下已有一周表存储了一年中全部的假日,给定查询起始日期和结束日期,推导出查询时间段内工作日是多少.为了简化这个问题,须要以下几个如果. 1. 不考虑周六周日,将其视作普通工作日 2. 假日没有交叠情况.不会出现10月1日到7日是国庆节,当中又有一个其他的节日 给出假日表的设计,某个假日都有起始时间和结束时间.这里仅仅取月日,这样就能表示每一年的假日. CREATE TABLE [dbo].[holiday]( [begin_time] [varchar](50) NULL, [end_ti

工作日计算

因工作需要,需要编写一个在指定日期后自动加上几天的计算工作日期,需要自动越过假期和周六.周日(上班还不能越过如2014-01-26日) 比如2014-09-25, 加1天就是2014-09-26, 加2天就是2014-09-29, 加3天就是2014-09-30, 加4天就是2014-10-09, 加5天就是2014-10-10, 加6天就是2014-10-13 网上有类似的基本都不能,只能自己写一个 1 print 'compiling procedure dbo.workday_add ..

PostgreSQL 当月最后一天的工作日 , 计算日期是星期几

可以用pg自带函数select extract(dow from current_date),之所以没用主要是展示一下通过数学方法计算日期的原理. drop function if exists getDateWeek(date);drop function if exists intervalDay(date);drop function if exists getMonMaxDay(integer,integer);drop function if exists getMonMaxDate(

安装zabbix web配置无法跳到第三步Configure DB connection的解决方法

今天在安装Zabbix 2.4的时候,在Web界面配置相关信息发现第二步Check of pre-requisites检测正确后,点击下一步,无法跳到Configure DB connection配置界面,会直接跳转到第一步Welcome界面,原因在于: 配置zabbix的时候修改了PHP代码的用户和所属组,但是为修改PHP的session保存路径的用户和所属组没有修改. 解决方法: chown  -R www.www  /var/lib/php/session/ 

Linux下的一个高速跳转到上N层文件夹的简单方法

编辑文件 vim .bashrc  (使改动在当前用户下有效) 或者 vim /etc/profile (须要在root用户下运行,使改动在全部用户下有效) 在文件结尾加入别名 alias cd1='cd ..' alias cd2='cd ../..' alias cd3='cd ../../..' alias cd4='cd ../../../..' alias cd5='cd ../../../../..' alias cd6='cd ../../../../../..' 保存文件退出 为

计算HTMLElement尺寸的一些属性和方法

Properties: clientHeight: 返回元素内部的高度(单位像素),包含内边距,但不包括水平滚动条.边框和外边距. clientWidth: 表示元素的内部宽度,以像素计.该属性包括内边距,但不包括垂直滚动条(如果有的话).边框和外边距. clientTop: 一个元素顶部边框的宽度(以像素表示).不包含顶部外边距或内边距.clientTop是只读的. clientLeft: 表示一个元素的左边框的宽度,以像素表示.如果元素的文本方向是从右向左(RTL, right-to-lef

vs中使用M_PI的问题及解决 角度转弧度&amp;根据弧度计算圆周上点的坐标的方法

M_PI 是一个宏定义,圆周率的定义           C/C++ code #define M_PI 3.14159265358979323846 此宏定义和编译器有关,TC中M_PI宏就定义在<math.h>里面. 但vc的<math.h>中没有了M_PI的宏定义.因此编译时会出错,提示:“M_PI”: 未声明的标识符. 解决方法:自己定义.   角度转弧度: #define AngleToRadian(angle) (M_PI/180.0f)*angle 以正东面为0度起点