This should do it. The key is to reduce days by 1 if there are odd number of leap days in between the given 2 dates.
/// <summary>
/// //Assume DateTime dt1 < DateTime dt2, print out difference between dt1 to dt2 in years, months, weeks and days
/// </summary>
/// <param name="dt1"></param>
/// <param name="dt2"></param>
static void DateDiff(DateTime dt1, DateTime dt2)
{
DateTime zeroTime = new DateTime(1, 1, 1);
int leapDaysInBetween = CountLeapDays(dt1, dt2);
TimeSpan span = dt2 - dt1;
int years = (zeroTime + span).Year - 1;
int months = (zeroTime + span).Month - 1;
int days = (zeroTime + span).Day - (leapDaysInBetween % 2 == 1 ? 1 : 0);
int weeks = days / 7;
int remainingdays = days % 7;
Console.WriteLine(String.Format("\nThe difference between date {0} and date {1} is: \n\t {2} year(s), {3} month(s), and {4} day(s).", dt1, dt2, years, months, days));
Console.WriteLine(String.Format("\nThe difference between date {0} and date {1} is: \n\t {2} year(s), {3} month(s), {4} week(s) and {5} day(s).", dt1, dt2, years, months, weeks, remainingdays));
}
private static int CountLeapDays(DateTime dt1, DateTime dt2)
{
int leapDaysInBetween = 0;
int year1 = dt1.Year, year2 = dt2.Year;
DateTime dateValue;
for (int i = year1; i <= year2; i++)
{
if (DateTime.TryParse("02/29/" + i.ToString(), out dateValue))
{
if (dateValue >= dt1 && dateValue <= dt2)
leapDaysInBetween++;
}
}
return leapDaysInBetween;
}
Had run these tests:
static void Main(string[] args)
{
DateDiff(new DateTime(2010, 1, 1), new DateTime(2012, 2, 9));
DateDiff(new DateTime(2010, 1, 1), new DateTime(2012, 4, 9));
DateDiff(new DateTime(2010, 1, 1), new DateTime(2020, 2, 9));
DateDiff(new DateTime(2010, 1, 1), new DateTime(2020, 4, 9));
DateDiff(new DateTime(2020, 2, 29), new DateTime(2021, 2, 28));
DateDiff(new DateTime(2019, 2, 28), new DateTime(2021, 2, 28));
}
These are the printouts:
The difference between date 1/1/2010 12:00:00 AM and date 4/9/2012 12:00:00 AM is:
2 year(s), 3 month(s), and 9 day(s).
The difference between date 1/1/2010 12:00:00 AM and date 4/9/2012 12:00:00 AM is:
2 year(s), 3 month(s), 1 week(s) and 2 day(s).
The difference between date 1/1/2010 12:00:00 AM and date 2/9/2020 12:00:00 AM is:
10 year(s), 1 month(s), and 9 day(s).
The difference between date 1/1/2010 12:00:00 AM and date 2/9/2020 12:00:00 AM is:
10 year(s), 1 month(s), 1 week(s) and 2 day(s).
The difference between date 1/1/2010 12:00:00 AM and date 4/9/2020 12:00:00 AM is:
10 year(s), 3 month(s), and 9 day(s).
The difference between date 1/1/2010 12:00:00 AM and date 4/9/2020 12:00:00 AM is:
10 year(s), 3 month(s), 1 week(s) and 2 day(s).
The difference between date 2/29/2020 12:00:00 AM and date 2/28/2021 12:00:00 AM is:
1 year(s), 0 month(s), and 0 day(s).
The difference between date 2/29/2020 12:00:00 AM and date 2/28/2021 12:00:00 AM is:
1 year(s), 0 month(s), 0 week(s) and 0 day(s).
The difference between date 2/28/2019 12:00:00 AM and date 2/28/2021 12:00:00 AM is:
2 year(s), 0 month(s), and 1 day(s).
The difference between date 2/28/2019 12:00:00 AM and date 2/28/2021 12:00:00 AM is:
2 year(s), 0 month(s), 0 week(s) and 1 day(s).