C#中获取指定日期区间所有的年月

不多说看效果

 

 

 

code部分

目前支持开始日期小于结束日期的算法,其余的自己脑补哈.

 

  [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            int startDT = 201701;
            int endDT = 201805;
             
            DateTime dt1 = Convert.ToDateTime(FamatDate(startDT.ToString()));
            DateTime dt2 = Convert.ToDateTime(FamatDate(endDT.ToString()));
             
            var mlist = GetMonthList(dt1, dt2);

            
        }

     
 

        /// <summary>
        /// 获取指定日期 之间的月份列表 
        /// 例如201701-201809
        /// 将会罗列出这期间所有的月份
        /// 目前只支持开始日期小于结束日期
        /// </summary>
        /// <param name="dtStart"></param>
        /// <param name="dtEnd"></param>
        /// <returns></returns>
        public  List<string > GetMonthList(DateTime  dtStart,DateTime dtEnd)
        {
            int year1, year2;
            int month1, month2;

            if (dtStart <= dtEnd)
            {
                year1 = dtStart.Year;
                year2 = dtEnd.Year;
                month1 = dtStart.Month;
                month2 = dtEnd.Month;
            }
            else
            {
                year1 = dtEnd.Year;
                year2 = dtStart.Year;
                month1 = dtEnd.Month;
                month2 = dtStart.Month;
                throw new Exception("暂不支持开始日期大于结束日期的计算方法");
            }

            var list = new List<string>();
            var dtResult = toResult(dtStart, dtEnd, DiffResultFormat.yymm);
            if (dtResult.Length>0 && dtResult.Length==2)
            {
                bool isBreak = false;

                int yearCount = dtResult[0];
                int monthCount = dtResult[1];
                if (yearCount>0)
                {
                    while (year1 <= year2)
                    {
                        if (!isBreak)
                        {
                            list.Add(year1.ToString() + month1.ToString("D2"));
                            month1++;
                            if (month1 > 12)
                            {
                                year1++;
                                month1 = 1;

                                if (year1 == year2)//遍历到达同一年级别了 则开始计算月
                                {
                                    if (month1< month2)
                                    {
                                        while (month1 != month2)
                                        {
                                            list.Add(year1.ToString() + month1.ToString("D2"));
                                            month1++;
                                            if (month1==month2)
                                            {
                                                list.Add(year1.ToString() + month1.ToString("D2"));
                                                isBreak = true;
                                                break;
                                            }
                                        }
                                    }
                                   
                                }

                            }
                        }
                        else
                        {
                            break;
                        }
                      
                    }
                }
                else if(monthCount>0 &&!isBreak)
                {
                    while ( month1 != month2)
                    {
                        list.Add(year1.ToString() + month1.ToString("D2"));
                        month1++;
                        if (month1 > month2)
                        {
                            break;
                        }
                    }
                    //把最末尾的也计算进去
                    list.Add(year2.ToString() + month2.ToString("D2"));
                }
                else
                {
                    list.Add(year1.ToString() + month1.ToString("D2"));
                }


            }

            return list;
        }


        /// <summary>
        /// 将数字形式的日期转换为标准的日期格式 字符串
        /// </summary>
        /// <param name="date"></param>
        /// <returns></returns>
        public string FamatDate(string date)
        {
            var dt = DateTime.ParseExact(date, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture);
            return dt.ToString("yyyy-MM");
        }


        /// <summary>
        /// 计算日期间隔
        /// </summary>
        /// <param name="d1">要参与计算的其中一个日期</param>
        /// <param name="d2">要参与计算的另一个日期</param>
        /// <param name="drf">决定返回值形式的枚举</param>
        /// <returns>一个代表年月日的int数组,具体数组长度与枚举参数drf有关</returns>
        public static int[] toResult(DateTime d1, DateTime d2, DiffResultFormat drf)
        {
            #region 数据初始化
            DateTime max;
            DateTime min;
            int year;
            int month;
            int tempYear, tempMonth;
            if (d1 > d2)
            {
                max = d1;
                min = d2;
            }
            else
            {
                max = d2;
                min = d1;
            }
            tempYear = max.Year;
            tempMonth = max.Month;
            if (max.Month < min.Month)
            {
                tempYear--;
                tempMonth = tempMonth + 12;
            }
            year = tempYear - min.Year;
            month = tempMonth - min.Month;
            #endregion
            #region 按条件计算
            if (drf == DiffResultFormat.dd)
            {
                TimeSpan ts = max - min;
                return new int[] { ts.Days };
            }
            if (drf == DiffResultFormat.mm)
            {
                return new int[] { month + year * 12 };
            }
            if (drf == DiffResultFormat.yy)
            {
                return new int[] { year };
            }
            return new int[] { year, month };
            #endregion
        }
    }

    /// <summary>
    /// 关于返回值形式的枚举
    /// </summary>
    public enum DiffResultFormat
    {
        /// <summary>
        /// 年数和月数
        /// </summary>
        yymm,
        /// <summary>
        /// 年数
        /// </summary>
        yy,
        /// <summary>
        /// 月数
        /// </summary>
        mm,
        /// <summary>
        /// 天数
        /// </summary>
        dd,
    }
}

  

 

-----不要随意转载.

辛苦写的尽管有些烂.

但应该可以为您提供一个思路

posted @ 2017-04-05 14:25  秦岭深处写代码  阅读(2280)  评论(1)    收藏  举报