源码下载地址:C#计算两个日期间隔的年月日,精确到天,无视闰年等-C#文档类资源-CSDN文库
最新版本代码在最下面,欢迎下载交流指正。
/// <summary>
///
/// </summary>
/// <param name="MinDate"></param>
/// <param name="MaxDate"></param>
/// <returns></returns>
public static string GetDiffDate(DateTime MinDate, DateTime MaxDate)
{
string result = "";
GetDiffDateModel flag = new GetDiffDateModel();
GetDiffDateModel _minDate =new GetDiffDateModel();
_minDate.Year = MinDate.Year;
_minDate.Month = MinDate.Month;
_minDate.Day = MinDate.Day;
GetDiffDateModel _maxDate = new GetDiffDateModel();
_maxDate.Year = MaxDate.Year;
_maxDate.Month = MaxDate.Month;
_maxDate.Day = MaxDate.Day;
//只比较年月日
DateTime _MinDate = new DateTime(MinDate.Year, MinDate.Month, MinDate.Day);
DateTime _MaxDate = new DateTime(MaxDate.Year, MaxDate.Month, MaxDate.Day);
//防呆
if (_MinDate >= _MaxDate)
{
result = "开始日期大于截止日期!";
return result;
}
//年
flag.Year = _maxDate.Year - _minDate.Year;
if (flag.Year <= 0) { flag.Year = 0; }
//月
if(_maxDate.Month< _minDate.Month)
{
flag.Year--;
flag.Month = (_maxDate.Month+12) - _minDate.Month;
}
else
{
flag.Month = _maxDate.Month - _minDate.Month;
}
//日
if (_maxDate.Day < _minDate.Day)
{
flag.Month--;
if(flag.Month<=0)
{
flag.Year--;
flag.Month = 11;
}
flag.Day = (_maxDate.Day + DateTime.DaysInMonth(_maxDate.Year, _maxDate.Month-1)) - _minDate.Day;
}
else
{
flag.Day = _maxDate.Day - _minDate.Day;
}
//格式化文本年月日
if (flag.Day > 0)
{
if (flag.Day == 31)
{
flag.Month++;
flag.Day=0;
}
else
{
if(flag.Year>0 || flag.Month>0)
{
result ="零"+ flag.Day.ToString() + "天";
}
else
{
result = flag.Day.ToString() + "天";
}
}
}
if (flag.Month > 0)
{
if (flag.Day == 12)
{
flag.Year++;
flag.Month = 0;
}
else
{
result = flag.Month.ToString() + " 个月"+ result;
}
}
if (flag.Year > 0) { result = flag.Year.ToString() + "年"+ result; }
return result;
}
public class GetDiffDateModel
{
public int Year { get; set; }
public int Month { get; set; }
public int Day { get; set; }
}
经过很久很久时间的验证,最终推出无错版。源代码如下:欢迎验证留言。
/// <summary>
/// 计算两个日期间隔的年月日
/// </summary>
/// <param name="MinDate"></param>
/// <param name="MaxDate"></param>
/// <returns></returns>
public static string GetDiffDate(DateTime MinDate, DateTime MaxDate)
{
string result = "";
GetDiffDateModel flag = new GetDiffDateModel();
GetDiffDateModel _minDate =new GetDiffDateModel();
_minDate.Year = MinDate.Year;
_minDate.Month = MinDate.Month;
_minDate.Day = MinDate.Day;
GetDiffDateModel _maxDate = new GetDiffDateModel();
_maxDate.Year = MaxDate.Year;
_maxDate.Month = MaxDate.Month;
_maxDate.Day = MaxDate.Day;
//只比较年月日
DateTime _MinDate = new DateTime(MinDate.Year, MinDate.Month, MinDate.Day);
DateTime _MaxDate = new DateTime(MaxDate.Year, MaxDate.Month, MaxDate.Day);
int flageDay = 0;
//防呆
if (_MinDate >= _MaxDate)
{
result = "开始日期大于截止日期!";
return result;
}
//年
flag.Year = _maxDate.Year - _minDate.Year;
if (flag.Year <= 0) { flag.Year = 0; }
//月
if(_maxDate.Month< _minDate.Month)
{
if (flag.Year<=0)
{
result = "年份计算异常!";
return result;
}
else
{
flag.Year--;
}
flag.Month = (_maxDate.Month+12) - _minDate.Month;
}
else
{
flag.Month = _maxDate.Month - _minDate.Month;
}
//日
if (_maxDate.Day < _minDate.Day)
{
if (flag.Month <= 0)
{
flag.Year--;
flag.Month = 12;
}
switch(_maxDate.Month)
{
case 2:
flageDay = DateTime.DaysInMonth(_maxDate.Year, _maxDate.Month);
int year = _maxDate.Year;
if (year % 4 == 0 && year % 100 != 0)
{
if (flageDay == 29 && _maxDate.Day == 29)
{
flag.Day = 0;
flag.Month++;
}
else
{
flag.Day = _maxDate.Day;
}
}
else
{
if (flageDay == 28 && _maxDate.Day == 28)
{
flag.Day = 0;
flag.Month++;
}
else
{
flag.Day = _maxDate.Day;
}
}
break;
}
if(_maxDate.Month==1 || _maxDate.Month == 3 || _maxDate.Month == 5 || _maxDate.Month == 7 || _maxDate.Month == 8 || _maxDate.Month == 10 || _maxDate.Month == 12)
{
if(_maxDate.Day==31)
{
flag.Day = 0;
flag.Month++;
}
else
{
flag.Day = _maxDate.Day;
}
}
else if(_maxDate.Month == 4 || _maxDate.Month == 6 || _maxDate.Month == 9 || _maxDate.Month == 11)
{
if (_maxDate.Day == 30)
{
flag.Day = 0;
flag.Month++;
}
else
{
flag.Day = _maxDate.Day;
}
}
flag.Month--;
}
else
{
flag.Day = _maxDate.Day - _minDate.Day;
}
//格式化文本年月日
if (flag.Day > 0)
{
if (flag.Day == 31)
{
flag.Month++;
flag.Day=0;
}
else
{
if(flag.Year>0 || flag.Month>0)
{
result ="零"+ flag.Day.ToString() + "天";
}
else
{
result = flag.Day.ToString() + "天";
}
}
}
if (flag.Month > 0)
{
if (flag.Day == 12)
{
flag.Year++;
flag.Month = 0;
}
else
{
result = flag.Month.ToString() + " 个月"+ result;
}
}
if (flag.Year > 0) { result = flag.Year.ToString() + "年"+ result; }
return result;
}
public class GetDiffDateModel
{
public int Year { get; set; }
public int Month { get; set; }
public int Day { get; set; }
}
//2023年5月25日 修复天数计算异常的BUG
//调用代码
private void button1_Click(object sender, EventArgs e)
{
DateTime date1 = dateTimePicker1.Value;//开始日期
DateTime date2 = dateTimePicker2.Value;//截止日期
textBox1.Text = dateTimeDiff.GetDiffDate(date1, date2);
}
/// <summary>
/// 计算两个日期间隔的年月日
/// </summary>
/// <param name="MinDate"></param>
/// <param name="MaxDate"></param>
/// <returns></returns>
public static string GetDiffDate(DateTime MinDate, DateTime MaxDate)
{
string result = "";
GetDiffDateModel flag = new GetDiffDateModel();
GetDiffDateModel _minDate = new GetDiffDateModel();
_minDate.Year = MinDate.Year;
_minDate.Month = MinDate.Month;
_minDate.Day = MinDate.Day;
GetDiffDateModel _maxDate = new GetDiffDateModel();
_maxDate.Year = MaxDate.Year;
_maxDate.Month = MaxDate.Month;
_maxDate.Day = MaxDate.Day;
//只比较年月日
DateTime _MinDate = new DateTime(MinDate.Year, MinDate.Month, MinDate.Day);
DateTime _MaxDate = new DateTime(MaxDate.Year, MaxDate.Month, MaxDate.Day);
int flageDay = 0;
//防呆
if (_MinDate >= _MaxDate)
{
result = "开始日期大于截止日期!";
return result;
}
//年
flag.Year = _maxDate.Year - _minDate.Year;
if (flag.Year <= 0) { flag.Year = 0; }
//月
if (_maxDate.Month < _minDate.Month)
{
if (flag.Year <= 0)
{
result = "年份计算异常!";
return result;
}
else
{
flag.Year--;
}
flag.Month = (_maxDate.Month + 12) - _minDate.Month;
}
else
{
flag.Month = _maxDate.Month - _minDate.Month;
}
//日
if (_maxDate.Day < _minDate.Day)
{
if (flag.Month <= 0)
{
flag.Year--;
flag.Month = 12;
}
else
{
}
_maxDate.Month = _maxDate.Month - 1;
switch (_maxDate.Month)
{
case 2:
flageDay = DateTime.DaysInMonth(_maxDate.Year, _maxDate.Month);
int year = _maxDate.Year;
if (year % 4 == 0 && year % 100 != 0)
{
if (flageDay == 29 && _maxDate.Day == 29)
{
flag.Day = 0;
flag.Month++;
}
else
{
flag.Day = _maxDate.Day + 29 - (_minDate.Day);
}
}
else
{
if (flageDay == 28 && _maxDate.Day == 28)
{
flag.Day = 0;
flag.Month++;
}
else
{
flag.Day = _maxDate.Day + 28 - (_minDate.Day);
}
}
break;
}
if (_maxDate.Month == 1 || _maxDate.Month == 3 || _maxDate.Month == 5 || _maxDate.Month == 7 || _maxDate.Month == 8 || _maxDate.Month == 10 || _maxDate.Month == 12)
{
if (_maxDate.Day == 31)
{
flag.Day = 0;
flag.Month++;
}
else
{
flag.Day = _maxDate.Day+31 - (_minDate.Day);
}
}
else if (_maxDate.Month == 4 || _maxDate.Month == 6 || _maxDate.Month == 9 || _maxDate.Month == 11)
{
if (_maxDate.Day == 30)
{
flag.Day = 0;
flag.Month++;
}
else
{
flag.Day = _maxDate.Day + 30 - (_minDate.Day);
}
}
flag.Month--;
}
else
{
flag.Day = _maxDate.Day - _minDate.Day;
}
//格式化文本年月日
if (flag.Day > 0)
{
if (flag.Day == 31)
{
flag.Month++;
flag.Day = 0;
}
else
{
if (flag.Year > 0 || flag.Month > 0)
{
result = "零" + flag.Day.ToString() + "天";
}
else
{
result = flag.Day.ToString() + "天";
}
}
}
if (flag.Month > 0)
{
if (flag.Day == 12)
{
flag.Year++;
flag.Month = 0;
}
else
{
result = flag.Month.ToString() + " 个月" + result;
}
}
if (flag.Year > 0) { result = flag.Year.ToString() + "年" + result; }
return result;
}
}