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