Определение количества отработанных часов после определенного времени

Я работаю над некоторыми пользовательскими правилами в системе управления временем, и мне нужно знать, сколько часов в смене прошло до определенного времени (19:00) и сколько часов после. Смены могут начинаться вечером и заканчиваться утром, поэтому нужно это учитывать.

Пока у меня есть ниже (это всего лишь фрагмент на один день), однако кажется очень неуклюжим и сложным то, что я написал, не могу не чувствовать, что мне не хватает более простого решения, у кого-нибудь есть идеи?

        DateTime cutOffTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 19, 00, 00);
        string cutOffTimeOfDay = GetTimeOfDayFromDateTime(cutOffTime);

        double baseMondayHours = 10.00;
        baseMondayHours = (baseMondayHours - 0.5);

        if (GetTimeOfDayOnlyFromDateTime(monday.ShiftStart.Value) == "AM" && GetTimeOfDayOnlyFromDateTime(monday.ShiftEnd.Value) == "PM"
            && monday.ShiftEnd.Value.TimeOfDay < cutOffTime.TimeOfDay)
        {
            postCutOffMondayHours = 0;
            baseMondayHours = monday.HoursWorked.Value;
        }
        else
        {
            string endTimeOfDay = GetTimeOfDayFromDateTime(monday.ShiftEnd.Value);
            double hoursAfterCutOff = GetDuration(cutOffTimeOfDay, endTimeOfDay);

            postCutOffMondayHours = hoursAfterCutOff;
            baseMondayHours = (baseMondayHours - hoursAfterCutOff);
        }

    public static string GetTimeOfDayFromDateTime(DateTime d)
    {
        return d.ToString("HH:mm") + " " + d.ToString("tt", CultureInfo.InvariantCulture);
    }

    public static string GetTimeOfDayOnlyFromDateTime(DateTime d)
    {
        return d.ToString("tt", CultureInfo.InvariantCulture).ToUpper();
    }

        public static double GetDuration(string startTime, string endTime)
        {
            DateTime start = DateTime.Parse(startTime);
            DateTime end = DateTime.Parse(endTime);
            if (start > end)
                end = end.AddDays(1);

            TimeSpan duration = end.Subtract(start);

            return duration.TotalHours;
        }

person Matthew Stott    schedule 02.06.2020    source источник
comment
Я голосую за закрытие этого вопроса, поскольку он принадлежит codereview.stackexchange.com.   -  person Sergey Berezovskiy    schedule 02.06.2020
comment
Я поместил это на codereview, спасибо   -  person Matthew Stott    schedule 02.06.2020


Ответы (1)


Я не уверен, что я что-то упускаю здесь, но разве встроенный оператор DateTime не именно то, что вы ищете? Он возвращает TimeSpan между 2 DateTime, и если вы можете гарантировать shiftStart ‹ cutoffDateTime ‹ shiftEnd, то вы можете получить количество отработанных часов, просто используя TotalHours из TimeSpan (но добавление этой проверки — это просто дополнительный небольшой if)

var shiftStart = new DateTime(2020, 6, 2, 17, 0, 0);
var shiftEnd = new DateTime(2020, 6, 3, 6, 30, 0);
var cutoffDateTime = new DateTime(2020, 6, 2, 19, 0, 0);

var hoursWorkedBefore = (cutoffDateTime - shiftStart).TotalHours;
var hoursWorkedAfter = (shiftEnd - cutoffDateTime).TotalHours;
person davidm    schedule 02.06.2020