zoukankan      html  css  js  c++  java
  • [转]获取有效工作日封装类

    在做项目的时候要求得到该月的有效工作日,于是开始写静态方法,后来由于还要获取当月开始到现在的有效工作日,于是再写方法,最后因为以后的项目还要用于是继续扩展,直接封装出一个类来。

    由于时间问题,静态方法整理可能不是很好,希望大家提意见,以便更改。

    源码下载:https://files.cnblogs.com/tishifu/WorkDateProvider.rar

    /*************************************************
     *
     *   Creator: Xingmai
     *   Date   : 2007-07-16
     *  
     *   Edit   :
     *   Date   :
     *   Content: cs
     *
     * ***********************************************/

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace Xingmai.Support
    {
        /// <summary>
        /// 获取有效工作日
        /// </summary>
        public class WorkDateProvider
        {
            #region 静态方法段

            /// <summary>
            /// 在一段内获取有效工作日
            /// </summary>
            /// <param name="dt1">开始日期</param>
            /// <param name="dt2">结束日期</param>
            /// <param name="intNoContain">不包含日期数</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateBy2Date(DateTime dt1, DateTime dt2, int intNoContain)
            {
                //判断不包含天数是否合法
                if (intNoContain <= 0)
                    throw (new Exception("不包含天数必须大于0"));

                return GetWorkDateBy2Date(dt1, dt2) - intNoContain;
            }

            /// <summary>
            /// 在一段内获取有效工作日
            /// </summary>
            /// <param name="dt1">开始日期</param>
            /// <param name="dt2">结束日期</param>
            /// <param name="intNoContain">不包含日期数</param>
            /// <param name="intContain">包含日期数</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateBy2Date(DateTime dt1, DateTime dt2, int intNoContain, int intContain)
            {
                if (intContain <= 0)
                    throw (new Exception("包含天数必须大于0"));

                return GetWorkDateBy2Date(dt1, dt2, intNoContain) + intContain;
            }

            /// <summary>
            /// 在一段内获取有效工作日
            /// </summary>
            /// <param name="dt1">开始日期</param>
            /// <param name="dt2">结束日期</param>
            /// <param name="strarrNoContain">不包含日期列表</param>
            /// <param name="strarrContain">包含日期列表</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateBy2Date(DateTime dt1, DateTime dt2, string[] strarrNoContain, string[] strarrContain)
            {
                int intContain = 0;
                foreach (string strContain in strarrContain)
                {
                    try
                    {
                        DateTime dtDuring = DateTime.Parse(strContain);
                        if (dt1 <= dtDuring && dtDuring <= dt2)
                            switch (dtDuring.DayOfWeek) //判断是否本来不是工作日的日期
                            {
                                case DayOfWeek.Saturday:
                                case DayOfWeek.Sunday:
                                    intContain++;
                                    break;
                                default:
                                    break;
                            }
                    }
                    catch (Exception ex)
                    {
                        throw (ex);
                    }
                }
                return GetWorkDateBy2Date(dt1, dt2, strarrNoContain) + intContain;
            }

            /// <summary>
            /// 在一段内获取有效工作日
            /// </summary>
            /// <param name="dt1">开始日期</param>
            /// <param name="dt2">结束日期</param>
            /// <param name="strarrNoContain">不包含日期列表</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateBy2Date(DateTime dt1, DateTime dt2, string[] strarrNoContain)
            {
                int intNotContain = 0;

                foreach (string strNoContain in strarrNoContain)
                {

                    try
                    {
                        DateTime dtDuring = DateTime.Parse(strNoContain);
                        if (dt1 <= dtDuring && dtDuring <= dt2)
                        {
                            switch (dtDuring.DayOfWeek)//判断原来是工作日
                            {
                                case DayOfWeek.Monday:
                                case DayOfWeek.Tuesday:
                                case DayOfWeek.Wednesday:
                                case DayOfWeek.Thursday:
                                case DayOfWeek.Friday:
                                    intNotContain++;
                                    break;
                                default:
                                    break;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        throw (ex);
                    }
                }

                return GetWorkDateBy2Date(dt1, dt2, intNotContain);
            }

            /// <summary>
            /// 在一段内获取有效工作日
            /// </summary>
            /// <param name="dt1">开始日期</param>
            /// <param name="dt2">结束日期</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateBy2Date(DateTime dt1, DateTime dt2)
            {
                if (dt1 > dt2)
                    throw (new Exception("开始日期必须大于结束日期"));

                int intTotalDays = 0;

                for (DateTime dtDuring = dt1; dtDuring <= dt2; dtDuring = dtDuring.AddDays(1))
                {
                    switch (dtDuring.DayOfWeek)//判断是否为工作日
                    {
                        case DayOfWeek.Monday:
                        case DayOfWeek.Tuesday:
                        case DayOfWeek.Wednesday:
                        case DayOfWeek.Thursday:
                        case DayOfWeek.Friday:
                            intTotalDays++;
                            break;
                        case DayOfWeek.Saturday:
                        case DayOfWeek.Sunday:
                            break;
                    }
                }
                return intTotalDays;
            }

            /// <summary>
            /// 获取制定年月的有效工作日
            /// </summary>
            /// <param name="intMonth">月份</param>
            /// <param name="intYear">年份</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByMonthAndYear(int intMonth, int intYear)
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", intYear, intMonth));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", intYear, intMonth, System.DateTime.DaysInMonth(intYear, intMonth)));
                return GetWorkDateBy2Date(dt1, dt2);
            }

            /// <summary>
            /// 获取制定年月的有效工作日
            /// </summary>
            /// <param name="intMonth">月份</param>
            /// <param name="intYear">年份</param>
            /// <param name="intNoContain">不包含日期数</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByMonthAndYear(int intMonth, int intYear, int intNoContain)
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", intYear, intMonth));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", intYear, intMonth, System.DateTime.DaysInMonth(intYear, intMonth)));
                return GetWorkDateBy2Date(dt1, dt2, intNoContain);
            }

            /// <summary>
            /// 获取制定年月的有效工作日
            /// </summary>
            /// <param name="intMonth">月份</param>
            /// <param name="intYear">年份</param>
            /// <param name="intNoContain">不包含日期数</param>
            /// <param name="intContain">包含日期数</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByMonthAndYear(int intMonth, int intYear, int intNoContain, int intContain)
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", intYear, intMonth));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", intYear, intMonth, System.DateTime.DaysInMonth(intYear, intMonth)));
                return GetWorkDateBy2Date(dt1, dt2, intNoContain, intContain);
            }

            /// <summary>
            /// 获取制定年月的有效工作日
            /// </summary>
            /// <param name="intMonth">月份</param>
            /// <param name="intYear">年份</param>
            /// <param name="strarrNoContain">不包含日期列表</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByMonthAndYear(int intMonth, int intYear, string[] strarrNoContain)
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", intYear, intMonth));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", intYear, intMonth, System.DateTime.DaysInMonth(intYear, intMonth)));
                return GetWorkDateBy2Date(dt1, dt2, strarrNoContain);
            }

            /// <summary>
            /// 获取制定年月的有效工作日
            /// </summary>
            /// <param name="intMonth">月份</param>
            /// <param name="intYear">年份</param>
            /// <param name="strarrNoContain">不包含日期列表</param>
            /// <param name="strarrContain">包含日期列表</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByMonthAndYear(int intMonth, int intYear, string[] strarrNoContain, string[] strarrContain)
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", intYear, intMonth));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", intYear, intMonth, System.DateTime.DaysInMonth(intYear, intMonth)));
                return GetWorkDateBy2Date(dt1, dt2, strarrNoContain, strarrContain);
            }

            /// <summary>
            /// 获取本年制定月的有效工作日
            /// </summary>
            /// <param name="intMonth">月份</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByMonthThisYear(int intMonth)
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", DateTime.Now.Date.Year, intMonth));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", DateTime.Now.Date.Year, intMonth, System.DateTime.DaysInMonth(DateTime.Now.Date.Year, intMonth)));
                return GetWorkDateBy2Date(dt1, dt2);
            }

            /// <summary>
            /// 获取本年制定月的有效工作日
            /// </summary>
            /// <param name="intMonth">月份</param>
            /// <param name="intNoContain">不包含日期数</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByMonthThisYear(int intMonth, int intNoContain)
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", DateTime.Now.Date.Year, intMonth));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", DateTime.Now.Date.Year, intMonth, System.DateTime.DaysInMonth(DateTime.Now.Date.Year, intMonth)));
                return GetWorkDateBy2Date(dt1, dt2, intNoContain);
            }

            /// <summary>
            /// 获取本年制定月的有效工作日
            /// </summary>
            /// <param name="intMonth">月份</param>
            /// <param name="intNoContain">不包含日期数</param>
            /// <param name="intContain">包含日期数</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByMonthThisYear(int intMonth, int intNoContain, int intContain)
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", DateTime.Now.Date.Year, intMonth));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", DateTime.Now.Date.Year, intMonth, System.DateTime.DaysInMonth(DateTime.Now.Date.Year, intMonth)));
                return GetWorkDateBy2Date(dt1, dt2, intNoContain, intContain);
            }

            /// <summary>
            /// 获取本年制定月的有效工作日
            /// </summary>
            /// <param name="intMonth">月份</param>
            /// <param name="strarrNoContain">不包含日期列表</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByMonthThisYear(int intMonth, string[] strarrNoContain)
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", DateTime.Now.Date.Year, intMonth));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", DateTime.Now.Date.Year, intMonth, System.DateTime.DaysInMonth(DateTime.Now.Date.Year, intMonth)));
                return GetWorkDateBy2Date(dt1, dt2, strarrNoContain);
            }

            /// <summary>
            /// 获取本年制定月的有效工作日
            /// </summary>
            /// <param name="intMonth">月份</param>
            /// <param name="strarrNoContain">不包含日期列表</param>
            /// <param name="strarrContain">包含日期列表</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByMonthThisYear(int intMonth, string[] strarrNoContain, string[] strarrContain)
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", DateTime.Now.Date.Year, intMonth));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", DateTime.Now.Date.Year, intMonth, System.DateTime.DaysInMonth(DateTime.Now.Date.Year, intMonth)));
                return GetWorkDateBy2Date(dt1, dt2, strarrNoContain, strarrContain);
            }

            /// <summary>
            /// 获取本年本月的有效工作日
            /// </summary>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByThisMonthThisYear()
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", DateTime.Now.Date.Year, DateTime.Now.Date.Month));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", DateTime.Now.Date.Year, DateTime.Now.Date.Month, System.DateTime.DaysInMonth(DateTime.Now.Date.Year, DateTime.Now.Date.Month)));
                return GetWorkDateBy2Date(dt1, dt2);
            }

            /// <summary>
            /// 获取本年本月的有效工作日
            /// </summary>
            /// <param name="intNoContain">不包含日期数</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByThisMonthThisYear(int intNoContain)
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", DateTime.Now.Date.Year, DateTime.Now.Date.Month));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", DateTime.Now.Date.Year, DateTime.Now.Date.Month, System.DateTime.DaysInMonth(DateTime.Now.Date.Year, DateTime.Now.Date.Month)));
                return GetWorkDateBy2Date(dt1, dt2, intNoContain);
            }

            /// <summary>
            /// 获取本年本月的有效工作日
            /// </summary>
            /// <param name="intNoContain">不包含日期数</param>
            /// <param name="intContain">包含日期数</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByThisMonthThisYear(int intNoContain, int intContain)
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", DateTime.Now.Date.Year, DateTime.Now.Date.Month));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", DateTime.Now.Date.Year, DateTime.Now.Date.Month, System.DateTime.DaysInMonth(DateTime.Now.Date.Year, DateTime.Now.Date.Month)));
                return GetWorkDateBy2Date(dt1, dt2, intNoContain, intContain);
            }

            /// <summary>
            /// 获取本年本月的有效工作日
            /// </summary>
            /// <param name="strarrNoContain">不包含日期列表</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByThisMonthThisYear(string[] strarrNoContain)
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", DateTime.Now.Date.Year, DateTime.Now.Date.Month));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", DateTime.Now.Date.Year, DateTime.Now.Date.Month, System.DateTime.DaysInMonth(DateTime.Now.Date.Year, DateTime.Now.Date.Month)));
                return GetWorkDateBy2Date(dt1, dt2, strarrNoContain);
            }

            /// <summary>
            /// 获取本年本月的有效工作日
            /// </summary>
            /// <param name="strarrNoContain">不包含日期列表</param>
            /// <param name="strarrContain">包含日期列表</param>
            /// <returns>有效工作日数</returns>
            public static int GetWorkDateByThisMonthThisYear(string[] strarrNoContain, string[] strarrContain)
            {
                DateTime dt1 = DateTime.Parse(string.Format("{0}-{1}-01", DateTime.Now.Date.Year, DateTime.Now.Date.Month));
                DateTime dt2 = DateTime.Parse(string.Format("{0}-{1}-{2}", DateTime.Now.Date.Year, DateTime.Now.Date.Month, System.DateTime.DaysInMonth(DateTime.Now.Date.Year, DateTime.Now.Date.Month)));
                return GetWorkDateBy2Date(dt1, dt2, strarrNoContain, strarrContain);
            }

            #endregion

            #region 内部变量

            protected int _WorkDateYear = DateTime.Now.Year;
            protected int _WorkDateMonth = DateTime.Now.Month;
            protected string[] _NoContainDays = null;
            protected string[] _ContainDays = null;
            protected DateTime _WorkDateStart = DateTime.Now;
            protected DateTime _WorkDateEnd = DateTime.Now;
            protected GetDaysType _GetDaysType = GetDaysType.ByMonthAndYear;
            #endregion

            #region 属性

            /// <summary>
            /// 制定年份
            /// </summary>
            public int WorkDateYear
            {
                set
                {
                    _WorkDateYear = value;
                }
                get
                {
                    return _WorkDateYear;
                }
            }

            /// <summary>
            /// 制定月份
            /// </summary>
            public int WorkDateMonth
            {
                set
                {
                    _WorkDateMonth = value;
                }
                get
                {
                    return _WorkDateMonth;
                }
            }

            /// <summary>
            /// 不包含日期
            /// </summary>
            public string[] NoContainDays
            {
                set
                {
                    _NoContainDays = value;
                }
                get
                {
                    return _NoContainDays;
                }
            }

            /// <summary>
            /// 包含日期
            /// </summary>
            public string[] ContainDays
            {
                set
                {
                    _ContainDays = value;
                }
                get
                {
                    return _ContainDays;
                }
            }

            /// <summary>
            /// 开始日期
            /// </summary>
            public DateTime WorkDateStart
            {
                set
                {
                    _WorkDateStart = value;
                }
                get
                {
                    return _WorkDateStart;
                }
            }

            /// <summary>
            /// 结束日期
            /// </summary>
            public DateTime WorkDateEnd
            {
                set
                {
                    _WorkDateEnd = value;
                }
                get
                {
                    return _WorkDateEnd;
                }
            }

            /// <summary>
            /// 获取工作日类型
            /// </summary>
            public GetDaysType EmunGetDaysType
            {
                set
                {
                    _GetDaysType = value;
                }
                get
                {
                    return _GetDaysType;
                }
            }

            #endregion

            #region 调用枚举

            /// <summary>
            /// 获取工作日类型枚举
            /// </summary>
            public enum GetDaysType
            {
                ByDateStartAndEnd,
                ByMonthAndYear
            }
            #endregion

            #region 实例构造函数

            /// <summary>
            /// 默认本年本月获取有效工作日
            /// </summary>
            public WorkDateProvider()
            {
                EmunGetDaysType = GetDaysType.ByMonthAndYear;
            }

            /// <summary>
            /// 设定开始日期和结束日期获取有效工作日
            /// </summary>
            /// <param name="dt1">开始日期</param>
            /// <param name="dt2">结束日期</param>
            public WorkDateProvider(DateTime dt1, DateTime dt2)
            {
                WorkDateStart = dt1;
                WorkDateEnd = dt2;
                EmunGetDaysType = GetDaysType.ByDateStartAndEnd;
            }

            /// <summary>
            /// 设定本年指定月的有效工作日
            /// </summary>
            /// <param name="intMonth">月份</param>
            public WorkDateProvider(int intMonth)
            {
                WorkDateMonth = intMonth;
                EmunGetDaysType = GetDaysType.ByMonthAndYear;
            }

            /// <summary>
            /// 设定指定年月的有效工作日
            /// </summary>
            /// <param name="intMonth">月份</param>
            /// <param name="intYear">年份</param>
            public WorkDateProvider(int intMonth, int intYear)
            {
                WorkDateMonth = intMonth;
                WorkDateYear = intYear;
                EmunGetDaysType = GetDaysType.ByMonthAndYear;
            }

            #endregion

            #region 实例方法段

            /// <summary>
            /// 获取有效时间
            /// </summary>
            /// <returns>有效工作日数</returns>
            public int GetWorkDays()
            {
                return GetWorkDays(EmunGetDaysType);
            }

            /// <summary>
            /// 获取有效时间
            /// </summary>
            /// <param name="getDaysType">获取时间类型</param>
            /// <returns>有效工作日数</returns>
            public int GetWorkDays(GetDaysType getDaysType)
            {
                if (getDaysType == GetDaysType.ByDateStartAndEnd)
                    return GetWorkDayByDateStartAndEnd();
                else
                    return GetWorkDayByYearAndMonth();
            }

            /// <summary>
            /// 获取制定年月的有效工作日
            /// </summary>
            /// <returns>有效工作日数</returns>
            private int GetWorkDayByYearAndMonth()
            {
                WorkDateStart = DateTime.Parse(string.Format("{0}-{1}-01", WorkDateYear, WorkDateMonth));
                WorkDateEnd = DateTime.Parse(string.Format("{0}-{1}-{2}", WorkDateYear, WorkDateMonth, DateTime.DaysInMonth(WorkDateYear, WorkDateMonth)));
                return GetWorkDayByDateStartAndEnd();
            }

            /// <summary>
            /// 获取开始日期到结束日期之间的有效工作日
            /// </summary>
            /// <returns>有效工作日数</returns>
            protected int GetWorkDayByDateStartAndEnd()
            {
                //判断时间有效性           
                if (WorkDateStart > WorkDateEnd)
                    throw (new Exception("开始日期大于结束日期"));

                int intNoContainDays = 0;
                int intContainDays = 0;
                int intTotalDays = 0;

                //计算不包含日期数
                if (NoContainDays != null)
                    foreach (string strNoContain in NoContainDays)
                    {
                        DateTime dtDuring = DateTime.Parse(strNoContain);
                        if (WorkDateStart <= dtDuring && dtDuring <= WorkDateEnd)
                        {
                            switch (dtDuring.DayOfWeek)
                            {
                                case DayOfWeek.Monday:
                                case DayOfWeek.Tuesday:
                                case DayOfWeek.Wednesday:
                                case DayOfWeek.Thursday:
                                case DayOfWeek.Friday:
                                    intNoContainDays++;
                                    break;
                                default:
                                    break;
                            }
                        }
                    }

                //计算包含日期数
                if (ContainDays != null)
                    foreach (string strContain in ContainDays)
                    {
                        DateTime dtDuring = DateTime.Parse(strContain);
                        if (WorkDateStart <= dtDuring && dtDuring <= WorkDateEnd)
                        {
                            switch (dtDuring.DayOfWeek)
                            {
                                case DayOfWeek.Saturday:
                                case DayOfWeek.Sunday:
                                    intContainDays++;
                                    break;
                                default:
                                    break;
                            }
                        }
                    }

                //计算常规日期数
                for (DateTime dtDuring = WorkDateStart; dtDuring <= WorkDateEnd; dtDuring = dtDuring.AddDays(1))
                {
                    switch (dtDuring.DayOfWeek)
                    {
                        case DayOfWeek.Monday:
                        case DayOfWeek.Tuesday:
                        case DayOfWeek.Wednesday:
                        case DayOfWeek.Thursday:
                        case DayOfWeek.Friday:
                            intTotalDays++;
                            break;
                        default:
                            break;
                    }
                }

                return intTotalDays - intNoContainDays + intContainDays;
            }

            #endregion
        }
    }

  • 相关阅读:
    数据结构实验报告(四)
    数据结构实验报告(三)
    数据结构实验报告(一)
    数据结构实验报告(二)
    Java基础之排序
    1070 Mooncake
    1071 Speech Patterns
    1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit
    5403. Find the Kth Smallest Sum of a Matrix With Sorted Rows
    1072 Gas Station
  • 原文地址:https://www.cnblogs.com/SoulStore/p/835976.html
Copyright © 2011-2022 走看看