Как рассчитать фактическую разницу месяцев (календарный год, а не приближение) между двумя данными датами в C #? - PullRequest
7 голосов
/ 20 июля 2010

Пример: учитывая две даты ниже, финиш всегда больше или равен старту

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;
}

Ответы [ 11 ]

0 голосов
/ 20 июля 2010

Это должно привести вас туда, куда вам нужно идти:

DateTime start = new DateTime(2001, 1, 1);
DateTime finish = new DateTime(2002, 3, 15);
double diff = (finish - start).TotalDays / 30;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...