Алгоритмы. C#. Расчет вхождения одного периода в другой
Очень часто приходится сталкиваться, что один и тот же кусок кода используется в разных программах. Все бы ничего, но иногда встречается код, на который тратится относительно много времени, хочется его где-то сохранить и использовать простым копи пастом. Поэтому, было принято решение выкладывать описание некоторых алгоритмов в блог — для обсуждения и хранения.
Сегодня представляю вам алгоритм расчета количества дней вхождения одного периода в другой.
В коде встречается конструкция totalDays++. Прибавляет один день к результату. Объясняю для чего. К примеру, вы пишите программу для отдела кадров. Сотрудник берет больничный с 27.07 по 3.08. Вам нужно подсчитать сколько дней больничного было взято в августе месяце. Выполняете функцию со следующими параметрами:
CountDaysInRange(DateTime.Parse("1.08.2011"), DateTime.Parse("31.08.2011"), DateTime.Parse("27.07.2011"), DateTime.Parse("3.08.2011"));
В итоге количество дней должно получиться 3.08 — 1.08 + 1 = 3 дня. Т.е. сотрудник августе месяце был на больничном 3 дня.
Полный код метода.
/// <summary>
/// Расчет количества дней одного период в другой
/// </summary>
/// <param name="startRange">Начало заданного периода</param>
/// <param name="endRange">Конец заданного периода</param>
/// <param name="startD">Начало расчетного периода</param>
/// <param name="endD">Конец расчетного периода</param>
/// <returns>Количество дней</returns>
public int CountDaysInRange(DateTime startRange, DateTime endRange, DateTime startD, DateTime endD)
{
int totalDays = 0; //общее количество дней входящих в заданный период
// startRange|-------------------|endRange заданный период
// startD|--------|endD расчетный период
if ((startRange >= startD && startRange < = endD) && (endRange >= startD && endRange >= endD))
{
totalDays += (endD - startRange).Days;
//если необходимо добавить один день.
//период 1-4 = 4 дня
//например: 4-1 = 3, тогда totalDays + 1
totalDays++;
}
else
// startRange|-------------------|endRange заданный период
// startD|--------|endD расчетный период
if ((endRange >= startD && endRange < = endD) && startRange <= startD)
{
totalDays += (endRange - startD).Days;
//если необходимо добавить один день.
//период 1-4 = 4 дня
//например: 4-1 = 3, тогда totalDays + 1
totalDays++;
}
else
// startRange|----------|endRange заданный период
// startD|----------------|endD расчетный период
if ((startRange >= startD && startRange < = endD) && (endRange >= startD && endRange < = endD))
{
totalDays += (endRange - startRange).Days;
//если необходимо добавить один день.
//период 1-4 = 4 дня
//например: 4-1 = 3, тогда totalDays + 1
totalDays++;
}
else
// startRange|-------------------|endRange заданный период
// startD|--------|endD расчетный период
if ((startD >= startRange && startD < = endRange) && (endD >= startRange && endD <= endRange))
{
totalDays += (endD - startD).Days;
//если необходимо добавить один день.
//период 1-4 = 4 дня
//например: 4-1 = 3, тогда totalDays + 1
totalDays++;
}
return totalDays;
}
Популярность: 4%
Если у вас возникли вопросы, вы можете оставить их в комментариях

