Пример: учитывая две даты ниже, финиш всегда больше или равен старту
start = 2001 Jan 01
finish = 2002 март 15
Итак, с 2001 января 01 до конца 2002 февраля
месяцев = 12 + 2 = 14
На март 2002 года
15/30 = 0,5
, поэтому общая сумма составляет 14,5 месяцев.
Это очень легко сделать вручную, но как я могу элегантно его кодировать?На данный момент у меня есть комбинация из множества циклов if и while для достижения того, чего я хочу, но я верю, что есть более простые решения.
Обновление: вывод должен быть точное (не приближение), например: если начало 2001 г. 01 января и окончание 16 апреля 2001 г., выходные данные должны быть 1 + 1 + 1 = 3 (для января, февраля и марта) и 16/31 = 0,516месяц, итого всего 3,516.
Другой пример: если я начну 5 июля 2001 года и закончу 10 июля 2002 года, то выходной должен быть за 11 месяцев до конца июня 2002 года, и (31-5) / 31 = 0,839 и 10/31 = 0,323 месяца, поэтому общее количество составляет 11 + 0,839 + 0,323 = 12,162.
Я расширил код Джоша Стодола и Hightechrider код:
public static decimal GetMonthsInRange(this IDateRange thisDateRange)
{
var start = thisDateRange.Start;
var finish = thisDateRange.Finish;
var monthsApart = Math.Abs(12*(start.Year - finish.Year) + start.Month - finish.Month) - 1;
decimal daysInStartMonth = DateTime.DaysInMonth(start.Year, start.Month);
decimal daysInFinishMonth = DateTime.DaysInMonth(finish.Year, finish.Month);
var daysApartInStartMonth = (daysInStartMonth - start.Day + 1)/daysInStartMonth;
var daysApartInFinishMonth = finish.Day/daysInFinishMonth;
return monthsApart + daysApartInStartMonth + daysApartInFinishMonth;
}