Как рассчитать количество месяцев между двумя датами? - PullRequest
0 голосов
/ 20 апреля 2009

Требования:

  • Рассчитать количество месяцев между двумя датами: receiveDate и DueDate.
  • как оптимистично, так и пессимистично нужны расчеты

Предположения:

  • dueDate всегда будет последним днем ​​месяца.

Я уже вычислил пессимистический расчет (имеется в виду, что просрочка за один день считается за весь месяц:

if(receiveDate > dueDate)
    receiveDate.Month - dueDate.Month + (receiveDate.Year - dueDate.Year) * 12;

Поиск в Интернете показал несколько похожих примеров, чтобы подтвердить это.

Теперь мои инстинкты говорят мне, что оптимистический расчет будет таким же, минус один месяц, но по какой-то причине он просто не выглядит правильным. Я на правильном пути или я что-то упускаю?

Ответы [ 5 ]

1 голос
/ 20 апреля 2009

Ты прав; если вы ищете число полных месяцев между двумя датами, вычтите 1 (при условии, что receiveDate не выпадает на последний день месяца, в этом случае у вас будет остаток 0 дней в любом случае) получит ваш ответ.

0 голосов
/ 07 июня 2016
int GetMonthsCount(DateTime dtStart, DateTime dtEnd)
{
    return (int)Math.Round((dtEnd - dtStart).TotalMonths);
}
0 голосов
/ 12 ноября 2013

Я делаю эту дополнительную проверку, чтобы получить точное количество месяцев:

numberOfMonths = receiveDate.Month - dueDate.Month + (receiveDate.Year - dueDate.Year) * 12; if (receiveDate.Day> dueDate.Day) numberOfMonths -;

0 голосов
/ 22 мая 2012

Ваша формула рассчитывает количество месяцев между первым месяцем полученной даты и первым месяцем срока платежа. Поскольку большинство элементов времени в TimeSpan выражается как TotalXXX, кажется странным, что они не учли TotalMonths и TotalYears.

Я думаю, это потому, что не существует фиксированного количества дней от месяца к месяцу, поэтому трудно понять, что имеет смысл с точки зрения выражения дробного остатка.

Моя формула такая ...


int nMonthDiff_FirstToFirst = DateTime.Now.Month - testDate.Month + ((DateTime.Now.Year - testDate.Year)* 12);

double dMonthDiff = (double)nMonthDiff_FirstToFirst + (DateTime.Now - testDate.AddMonths(nMonthDiff_FirstToFirst)).TotalDays / (double)DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);

Так что я делаю, в основном, получаю разницу в месяце, как у вас (с первого по первый месяц), затем я проецирую свой testDate на будущее по разнице в месяце. Затем с этим TimeSpan я получаю TotalDays и делю это на количество дней в этом месяце. Таким образом, я представляю дробную часть с точки зрения оставшихся дней месяца.

Так что, если вы собираетесь отправиться 5 мая 2012 г. -> 3 июня 2012 г., ваша формула вернет 1 для разницы за месяц, когда еще не закончился целый месяц. В моей формуле TotalDays прогнозируемой даты будет давать отрицательное дробное число дней, а при добавлении к разнице «первый-первый» месяц будет принимать ее по мере необходимости.

0 голосов
/ 20 апреля 2009

Если вам не нужно хранить дни месяца в исчислении, я думаю, что это путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...