Алгоритмы. 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%

Теги: ,

Если у вас возникли вопросы, вы можете оставить их в комментариях

Оставить комментарий

(обязательно)

(обязательно)


 

MAXCACHE: 0.32MB/0.03777 sec