Przerwy pracownicze

0

Witam,
próbuje właśnie napisać fragment kodu, który będzie wyliczał czas zakończenia danego zadania uwzględniając tzw. przerwy pracownicze.
W dobie mam 3 sztywne 15 minutowe przerwy.
Dane wejściowe to start zadania i jego "surowy" czas trwania.
Może się zdarzyć, że zadanie będzie trwało 6h i nie trafi na przerwę, a może trwać 15 minut i trafi na przerwę, może nawet trwać kilka dni - kompletnie nie wiem jak do tego podejść, zwłaszcza, że później będę musiał dołożyć uwzględnienie kalendarza dni wolnych.

0

coś w ten deseń

akt_czas = 0
repeat
  stop = start + czas_trwania - akt_czas
  stop = Min(stop, koniec_dnia_pracy) 
  for i = 1 to lista przerw w dniu do
    if przerwa[i] zawiera się w (start; stop) to
      stop = stop + przerwa //z uwzględnieniem faktu, że start może wypaść np. na 10 minutę przerwy i tak naprawdę zostało nam 5 minut przerwy a nie 15
  stop = Min(stop, koniec_dnia_pracy) 
  akt_czas = akt_czas + stop - start
  start = następny_dzień(start)
until akt_czas = czas_trwania
0

Znalazłem fajną bibliotekę do C#: http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET

Przy jej użyciu całość wygląda tak:

private DateTime CalculateDoneTime(DateTime startTime, TimeSpan calculatedDuration)
{
	var breaks = new List<TimeSpan> {
		new TimeSpan(2, 0, 0),
		new TimeSpan(10, 0, 0),
		new TimeSpan(18, 0, 0)
	};

	int breakDuration = 15;

	var taskBlock = new TimeRange(
		startTime,
		startTime.Add(calculatedDuration)
	);

	var currentDay = new DateTime(startTime.Year, startTime.Month, startTime.Day);

	while (true)
	{
		foreach (var item in breaks)
		{
			var breakBlock = new TimeBlock(
				new DateTime(currentDay.Year, currentDay.Month, currentDay.Day, item.Hours, item.Minutes, item.Seconds),
				new DateTime(currentDay.Year, currentDay.Month, currentDay.Day, item.Hours, item.Minutes + breakDuration, item.Seconds)
				);

			var intersection = breakBlock.GetIntersection(taskBlock);
			if (intersection != null)
			{
				if (DateTime.Compare(taskBlock.End, breakBlock.End) < 0)
					taskBlock.ExpandEndTo(breakBlock.End);
				taskBlock.ExpandEndTo(taskBlock.End.Add(intersection.Duration));
			}
		}

		if (DateTime.Compare(taskBlock.End, currentDay) < 0)
			break;

		currentDay = currentDay.AddDays(1);
	}

	return taskBlock.End;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1