Как правильно посчитать дату
У меня есть объект который представляет какую-то рабочую смену, допустим с 20:00 до 7:00: В ней нет никакой даты и добавить тоже не получится
class WorkingShift
{
public TimeSpan Start { get; set; }
public TimeSpan End { get; set; }
}
Я веду статистику по проходам через КПП относительно рабочей смены, так как эта рабочая смена переваливает через сутки, то не получается посчитать полную дату прохода. Для статистики у меня есть объект (ключ на WorkingShift):
class StaffPresence
{
public DateTime EntranceDate { get; set; }
public DateTime ExitDate { get; set; }
public DateTime WorkingShiftStart { get; set; }
public DateTime WorkingShiftEnd { get; set; }
public Guid WorkingShiftId { get; set; }
}
Поля EntranceDate
и ExitDate
заполнить просто т.к он берётся с момента прохождения через КПП. А вот как посчитать WorkingShiftStart
и WorkingShiftEnd
для следующего кейса: смена началась 01.01.2023 20:00
, заканчивается 02.01.2023 07:00, а вход-выход через КПП был 02.01.2023 01:00
и 02:00
. Как мне посчитать и получить на выходе WorkingShiftStart/WorkingShiftEnd равным 01.01.2023 20:00
и 02.01.2023 07:00
? У меня сейчас есть некоторый алгоритм для вычисления рабочей смены, но он неработает для описанного мною кейса когда смена проходит через разные сутки.
public static (DateTime StartDate, DateTime EndDate) GetWorkingTime(TimeSpan workStart, TimeSpan workEnd, DateTime date)
{
var start = new DateTime(date.Year, date.Month, date.Day);
var end = new DateTime(date.Year, date.Month, date.Day);
if (workStart > workEnd)
{
var time = date.TimeOfDay;
var midnight = new TimeSpan(00, 00, 00);
if (time >= workStart && time <= workEnd || time >= midnight && time <= workEnd)
{
if (time >= workStart && time <= midnight)
{
start = start.Add(workStart);
end = end.AddDays(1)
.Add(workEnd);
return new(start, end);
}
else
{
start = start
.Add(workStart);
end = end.AddDays(1)
.Add(workEnd);
return new(start, end);
}
}
else
{
start = start.Add(workStart);
end = end.AddDays(1)
.Add(workEnd);
return new(start, end);
}
}
start = start.Add(workStart);
end = end.Add(workEnd);
return new(start, end);
}