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,
}
}
-----不要随意转载.
辛苦写的尽管有些烂.
但应该可以为您提供一个思路

浙公网安备 33010602011771号